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对数据库的连接与基本操作,实际项目中还需关注事务管理、性能优化(如二级缓存、批量操作)等进阶主题,以充分发挥框架能力。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!