MyBatis连接数据库的完整流程与配置详解
MyBatis作为一款优秀的持久层框架,通过简化JDBC操作提升了开发效率,其核心优势在于将SQL语句与Java代码分离,同时支持灵活的参数映射与结果集处理,本文将从依赖引入、环境配置、数据源设置、Mapper映射等维度,系统讲解MyBatis连接数据库的实现步骤。

基础依赖与环境准备
使用MyBatis前需先添加对应依赖,以Maven项目为例,在pom.xml中引入以下坐标(以MySQL驱动为例):  
<dependencies>  
    <!-- MyBatis核心库 -->  
    <dependency>  
        <groupId>org.mybatis</groupId>  
        <artifactId>mybatis</artifactId>  
        <version>3.5.10</version>  
    </dependency>  
    <!-- MySQL驱动 -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>8.0.28</version>  
    </dependency>  
    <!-- 日志框架(可选,用于输出SQL日志) -->  
    <dependency>  
        <groupId>log4j</groupId>  
        <artifactId>log4j</artifactId>  
        <version>1.2.17</version>  
    </dependency>  
</dependencies>  
若使用Spring Boot整合,可借助mybatis-spring-boot-starter简化配置,但核心原理一致。  
配置文件编写
MyBatis的核心配置文件为mybatis-config.xml,需定义数据源、事务管理器及Mapper扫描路径等信息,示例如下:  
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE configuration  
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>  
    <!-- 环境配置,可配置多个环境(如dev/test/prod),默认使用id="development"的环境 -->  
    <environments default="development">  
        <environment id="development">  
            <!-- 事务管理器类型:JDBC(直接使用JDBC提交/回滚)或MANAGED(交由容器管理,如Spring) -->  
            <transactionManager type="JDBC"/>  
            <!-- 数据源配置:POOLED表示使用连接池;UNPOOLED为非连接池;JNDI则从应用服务器获取数据源 -->  
            <dataSource type="POOLED">  
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>  
                <property name="url" value="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"/>  
                <property name="username" value="root"/>  
                <property name="password" value="123456"/>  
            </dataSource>  
        </environment>  
    </environments>  
    <!-- Mapper映射文件路径,支持通配符扫描(如resources/mapper/*.xml) -->  
    <mappers>  
        <mapper resource="mapper/UserMapper.xml"/>  
    </mappers>  
</configuration>  
数据源与连接池机制
MyBatis本身不提供连接池实现,而是通过集成第三方连接池(如HikariCP、Druid)提升性能,上述示例中使用POOLED类型时,实际是MyBatis内置的简单连接池;生产环境中更推荐使用高性能连接池,配置方式如下(以HikariCP为例):  

- 添加HikariCP依赖:  
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> - 在
mybatis-config.xml中替换数据源类型:<dataSource type="com.zaxxer.hikari.HikariDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> <!-- 连接池特有属性(可选) --> <property name="maximumPoolSize" value="20"/> <property name="connectionTimeout" value="30000"/> </dataSource> 
Mapper接口与XML映射文件
MyBatis通过Mapper接口+XML映射文件的方式实现SQL与Java代码解耦,以用户表(user)操作为例:  
- 定义Mapper接口(
UserMapper.java):public interface UserMapper { // 根据ID查询用户 User selectUserById(Long id); // 插入新用户 int insertUser(User user); } - 编写对应的XML映射文件(
UserMapper.xml):<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.UserMapper"> <!-- 结果集映射(可选,若字段名与实体类属性名不一致需配置) --> <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> </resultMap> <!-- SQL语句定义 --> <select id="selectUserById" parameterType="Long" resultMap="userResultMap"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="User"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> </mapper> 
会话工厂与SqlSession的使用
通过SqlSessionFactoryBuilder加载配置文件生成SqlSessionFactory,再由工厂创建SqlSession实例执行SQL操作:  
// 1. 加载配置文件,构建SqlSessionFactory  
String resource = "mybatis-config.xml";  
InputStream inputStream = Resources.getResourceAsStream(resource);  
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
// 2. 获取SqlSession(autoCommit设为false开启手动事务控制)  
try (SqlSession session = sqlSessionFactory.openSession(false)) {  
    // 3. 通过Mapper接口获取代理对象  
    UserMapper mapper = session.getMapper(UserMapper.class);  
    // 4. 执行SQL操作  
    User user = mapper.selectUserById(1L);  
    System.out.println(user.getName());  
    // 若涉及增删改,需手动提交事务(除非openSession(true)开启自动提交)  
    session.commit();  
} catch (Exception e) {  
    e.printStackTrace();  
}  
常见问题排查
| 问题现象 | 可能原因 | 解决方案 | 
|---|---|---|
| 无法连接数据库 | 驱动类未正确加载 | 检查pom.xml依赖是否完整 | 
| URL/账号密码错误 | 确认数据库地址、端口及凭据 | |
| 数据库服务未启动 | 启动MySQL服务 | |
| 执行SQL时报“未知列” | XML中SQL字段名与数据库表结构不符 | 校验表结构与SQL语句字段名一致性 | 
| ResultMap映射配置错误 | 检查resultMap的column与property | 
|
| 连接池耗尽 | 最大连接数设置过小 | 增大连接池maximumPoolSize | 
| 未及时释放连接 | 确保SqlSession及时关闭(用try-with-resources) | 
相关问答FAQs
Q1:MyBatis连接数据库时,如何动态切换数据源?
A:可通过多环境配置结合Spring AOP切面实现,在mybatis-config.xml中定义多个<environment>节点,每个环境对应不同数据源;运行时根据业务场景(如请求头标识)选择对应环境的SqlSessionFactory,或使用Spring的AbstractRoutingDataSource动态路由数据源。  
Q2:为什么MyBatis推荐使用Mapper接口而非直接调用SqlSession?
A:Mapper接口本质是动态代理模式,相比直接操作SqlSession有以下优势:  

- 解耦性:避免硬编码SQL ID,降低维护成本;
 - 类型安全:编译期检查方法签名,减少运行时错误;
 - 扩展性:便于结合Spring等框架进行事务管理、缓存配置等增强操作。
 
通过以上步骤,即可完成MyBatis对数据库的连接与基本操作,实际项目中还需关注事务管理、性能优化(如二级缓存、批量操作)等进阶主题,以充分发挥框架能力。