Spring Boot 集成 MyBatis 全面讲解
MyBatis 是一款优秀的持久层框架,与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis,包括环境配置、基础操作、高级功能和最佳实践。
一、MyBatis 简介
1. SqlSession
SqlSession
是 MyBatis 的核心接口,负责执行 SQL 语句、获取映射器实例以及管理事务。
1.1 SqlSession 的创建
SqlSession
通常通过 SqlSessionFactory
获取。以下是创建 SqlSessionFactory
的典型代码:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
// 使用 session 进行数据库操作
}
注意:在 Spring 集成中,
SqlSessionFactory
和SqlSession
的创建由框架管理,我们只需要通过依赖注入获取即可。
1.2 SqlSession 的常用方法
SqlSession
提供了多种方法,用于执行数据库操作:
-
查询操作:
// 单条记录查询 User user = session.selectOne("namespace.statementId", parameter); // 多条记录查询 List<User> users = session.selectList("namespace.statementId", parameter);
-
插入操作:
int rows = session.insert("namespace.statementId", parameter);
-
更新操作:
int rows = session.update("namespace.statementId", parameter);
-
删除操作:
int rows = session.delete("namespace.statementId", parameter);
-
事务控制:
session.commit(); // 提交事务 session.rollback(); // 回滚事务
2. Mapper 映射器
Mapper 映射器是 MyBatis 的核心功能,用于实现 SQL 和 Java 方法之间的映射。它可以通过注解或 XML 配置。
2.1 基于注解的 Mapper
注解方式直接将 SQL 写在 Mapper 接口中,简单高效,适合简单场景。
示例代码:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
@Insert("INSERT INTO user (username, email) VALUES (#{username}, #{email})")
int insertUser(User user);
@Update("UPDATE user SET email = #{email} WHERE id = #{id}")
int updateUser(User user);
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteUser(Long id);
}
2.2 基于 XML 的 Mapper
XML 配置更加灵活,适合复杂查询场景。Mapper XML 文件通常位于 resources/mapper
目录。
Mapper 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">
<!-- 查询 -->
<select id="selectById" parameterType="long" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 插入 -->
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO user (username, email)
VALUES (#{username}, #{email})
</insert>
<!-- 更新 -->
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE user SET email = #{email} WHERE id = #{id}
</update>
<!-- 删除 -->
<delete id="deleteUser" parameterType="long">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
2.3 Mapper 映射器的工作机制
Mapper 接口的方法名和参数需要与 XML 中的 id
和 parameterType
对应。MyBatis 会通过动态代理为 Mapper 接口生成实现类,并调用对应的 SQL。
3. 配置文件
MyBatis 的配置文件包括全局配置文件(mybatis-config.xml
)和映射文件(mapper.xml
)。
3.1 全局配置文件
mybatis-config.xml
定义了数据库连接、日志设置、别名等全局配置。
典型配置示例:
<?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>
<!-- 环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 别名配置 -->
<typeAliases>
<typeAlias type="com.example.entity.User" alias="User"/>
</typeAliases>
<!-- Mapper 映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.2 映射文件配置
映射文件定义了具体的 SQL 和 Java 对象之间的关系。以 UserMapper.xml
为例:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAll" resultType="User">
SELECT * FROM user
</select>
<resultMap id="UserResultMap" type="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="email" property="email"/>
</resultMap>
</mapper>
4. ResultMap
ResultMap
是 MyBatis 的强大特性之一,用于处理复杂查询结果与 Java 对象的映射关系。
4.1 什么是 ResultMap?
ResultMap
用于自定义数据库字段与 Java 对象属性的映射。它支持嵌套映射、别名和字段处理,适合复杂的对象映射场景。
4.2 ResultMap 配置示例
以下是一个带嵌