springboot集成mybatis(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在现代 Java Web 开发中,Spring Boot 和 MyBatis 是两个被广泛采用的技术栈。Spring Boot 提供了快速构建应用的开箱即用能力,而 MyBatis 则以灵活的 SQL 映射机制著称。本文将通过循序渐进的方式,讲解如何将这两个技术整合到一个项目中。无论是刚刚接触框架的新手,还是希望提升工程实践的中级开发者,都能通过本文掌握 Spring Boot 集成 MyBatis 的核心要点。
一、环境准备与项目搭建
1.1 项目初始化
使用 Spring Initializr(https://start.spring.io)创建新项目。选择以下配置:
- Project:Maven Project
- Language:Java
- Spring Boot Version:推荐最新稳定版(如 3.2.x)
- Dependencies:添加
Spring Web
、Spring Data JPA
(可选,用于对比)、MySQL Driver
1.2 关键依赖引入
在 pom.xml
中添加 MyBatis 和数据库驱动依赖:
<dependencies>
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
1.3 数据库配置
在 application.properties
中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
二、核心配置与核心概念
2.1 MyBatis 配置文件
在 src/main/resources
目录下创建 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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
知识点:
mapUnderscoreToCamelCase
可将数据库字段名(如user_name
)自动映射为实体类的驼峰命名属性(userName
)。
2.2 Mapper 接口与 XML 文件
2.2.1 定义 Mapper 接口
创建一个接口,例如 UserMapper.java
:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
}
2.2.2 对应的 XML 映射文件
在 src/main/resources/mapper
目录下创建 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">
<select id="selectById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
2.3 自动扫描配置
在 Spring Boot 启动类上添加 @MapperScan
注解,指定 Mapper 接口的包路径:
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三、核心流程与原理剖析
3.1 从接口到 SQL 的映射机制
当调用 UserMapper.selectById(1L)
时,MyBatis 的核心流程如下:
- 接口解析:通过反射获取接口的方法名、参数类型和注解信息。
- SQL 解析:从 XML 或注解中读取对应的 SQL 语句。
- 参数绑定:将方法参数
#{id}
替换为数据库查询参数。 - 结果映射:将数据库返回的
ResultSet
转换为 Java 对象。
3.2 动态 SQL 与条件语句
通过 <if>
标签实现动态 SQL:
<select id="selectByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
</select>
比喻:这就像一个智能快递分拣系统,根据包裹标签上的条件动态决定投递路径。
四、高级特性与最佳实践
4.1 二级缓存机制
通过配置 MyBatis 的二级缓存提升查询性能:
<mapper namespace="com.example.mapper.UserMapper">
<cache/>
<select .../>
</mapper>
注意:需确保实体类实现
Serializable
接口。
4.2 通用 Mapper 的使用
引入 mybatis-generator
生成基础 Mapper:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.2</version>
</dependency>
通过配置文件自动生成 CRUD 方法,减少重复代码。
4.3 事务管理
在 Service 层使用 @Transactional
注解管理事务:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void addUser(User user) {
userMapper.insert(user);
// 其他业务逻辑
}
}
五、常见问题与解决方案
5.1 SQL 注入风险
问题:直接拼接 SQL 语句可能导致注入漏洞。
解决方案:使用 #{}
占位符替代 $
符号,例如:
<update id="updateUser">
UPDATE user SET name = #{name} WHERE id = #{id}
</update>
5.2 表名与实体类不匹配
问题:数据库表名和实体类属性名不一致时,查询结果为空。
解决方案:使用 @Results
注解或 XML 的 <result>
标签映射字段:
@Select("SELECT * FROM user WHERE id = #{id}")
@Results({
@Result(property = "userName", column = "user_name")
})
User selectById(Long id);
5.3 性能优化建议
- 分页查询:使用
RowBounds
或自定义分页插件。 - 延迟加载:通过
lazyLoadAllEnabled
配置减少 N+1 查询问题。 - 索引优化:对高频查询字段建立数据库索引。
六、完整案例演示
6.1 实体类设计
@Data
public class User {
private Long id;
private String name;
private Integer age;
}
6.2 Controller 层代码
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userMapper.selectById(id);
}
}
6.3 启动项目并测试
运行 Application
类,访问 http://localhost:8080/users/1
,即可查看查询结果。
结论
通过本文的讲解,读者应能掌握 Spring Boot 集成 MyBatis 的完整流程,包括依赖配置、核心概念、高级特性和问题排查。无论是搭建简单的 CRUD 系统,还是构建复杂的企业级应用,MyBatis 的灵活性与 Spring Boot 的便捷性结合,都能显著提升开发效率。建议读者通过实际项目不断实践,并结合官方文档深入理解底层原理,逐步成长为全栈开发工程师。
关键词布局:springboot集成mybatis、MyBatis 配置、SQL 注入、二级缓存、动态 SQL、Mapper 接口、事务管理、实体类映射、分页查询、性能优化。