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 后端开发领域,Spring Boot 和 MyBatis 是两个不可或缺的工具。Spring Boot 以其开箱即用、快速构建应用的能力著称,而 MyBatis 则凭借灵活的 SQL 映射和简洁的 ORM 特性受到开发者青睐。将两者整合,既能享受 Spring Boot 的高效开发体验,又能发挥 MyBatis 在数据库操作上的优势,是构建企业级应用的黄金组合。本文将从环境搭建到实战案例,逐步讲解如何实现这一整合,并通过生动的比喻和代码示例,帮助读者轻松掌握这一技能。
环境搭建:构建整合的基础
Maven 依赖配置
整合的第一步是准备项目依赖。在 Spring Boot 中,只需在 pom.xml
文件中添加 MyBatis 和数据库驱动的依赖,就像为工具箱安装必要的工具一样。
<!-- Spring Boot 核心依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
</parent>
<!-- MyBatis 整合 Spring Boot -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- MySQL 连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
项目结构规划
一个典型的整合项目结构如下:
src
├── main
│ ├── java
│ │ └── com.example.demo
│ │ ├── config # 配置类存放目录
│ │ ├── controller # 控制层
│ │ ├── service # 业务逻辑层
│ │ ├── mapper # MyBatis 映射文件目录
│ │ └── entity # 实体类目录
│ └── resources
│ ├── application.yml # 配置文件
│ └── mapper # XML 映射文件存放目录
└── test
└── ...
提示:mapper
目录需要与 XML 文件的包路径一致,否则 MyBatis 无法加载映射文件。
数据库准备
假设我们要管理一个“用户信息”表,创建表的 SQL 如下:
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
核心配置:让 Spring Boot 与 MyBatis “对话”
数据源与 MyBatis 配置
在 application.yml
中配置数据库连接和 MyBatis 参数:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # 指定 XML 映射文件路径
type-aliases-package: com.example.demo.entity # 实体类包路径
MyBatis 配置类(可选)
对于复杂场景,可以通过 Java 配置类增强 MyBatis 功能。例如:
@Configuration
@MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口包
public class MyBatisConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor(); // 集成分页插件
}
}
比喻:这个配置类就像一个“交通指挥官”,负责协调 MyBatis 的各个组件,确保 SQL 执行、分页等逻辑正确运行。
实战:CRUD 操作详解
实体类(Entity)
实体类对应数据库表的结构:
@Data // Lombok 注解,自动生成 getter/setter
public class User {
private Long id;
private String name;
private String email;
private LocalDateTime createTime;
}
Mapper 接口与 XML 映射
1. 定义 Mapper 接口
public interface UserMapper {
User selectById(Long id);
List<User> selectAll();
int insert(User user);
int update(User user);
int deleteById(Long id);
}
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.demo.mapper.UserMapper">
<!-- 查询单条记录 -->
<select id="selectById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 查询所有记录 -->
<select id="selectAll" resultType="User">
SELECT * FROM user
</select>
<!-- 新增记录 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, email)
VALUES(#{name}, #{email})
</insert>
</mapper>
3. 业务层与控制层调用
在 Service 层注入 Mapper:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
在 Controller 层暴露 REST API:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
高级功能:提升整合的灵活性
动态 SQL 与条件查询
在 XML 中使用 MyBatis 的动态标签(如 <if>
、<choose>
)实现条件查询:
<select id="selectByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</select>
分页插件(以 PageHelper 为例)
通过在配置类中引入分页插件,简化分页逻辑:
@Configuration
public class MyBatisConfig {
@Bean
public PageInterceptor pageInterceptor() {
return new PageInterceptor();
}
}
使用时只需添加分页参数:
PageHelper.startPage(1, 10); // 第一页,每页10条
PageInfo<User> pageInfo = new PageInfo<>(userMapper.selectAll());
事务管理
Spring Boot 默认对 @Service
注解的类开启事务。通过 @Transactional
可以细化事务控制:
@Service
public class UserService {
@Transactional(rollbackFor = Exception.class)
public void addUserAndLog(User user) {
userMapper.insert(user);
// 其他操作,若失败则回滚
}
}
常见问题与解决方案
1. Mapper 接口无法注入
原因:未在配置类中使用 @MapperScan
或未在接口上添加 @Mapper
注解。
解决:
@Configuration
@MapperScan("com.example.demo.mapper") // 指定 Mapper 包路径
public class MyBatisConfig { ... }
2. SQL 语句执行报错
常见场景:字段名与数据库列名不一致。
解决:
- 在实体类中使用
@Column
注解指定列名:@Data public class User { @Column("user_name") private String name; }
- 或在 XML 中显式指定列名:
<result column="user_name" property="name"/>
3. 性能优化与 SQL 注入
- SQL 注入防御:始终使用
#{参数}
而非${参数}
,避免直接拼接 SQL。 - 查询优化:使用 MyBatis 的二级缓存或 Redis 缓存高频查询结果。
结论
通过本文的讲解,读者应已掌握 Spring Boot 与 MyBatis 的整合方法,并能独立实现基础的 CRUD 操作与高级功能。这一整合不仅简化了数据库操作,还通过 Spring Boot 的自动配置特性降低了学习成本。对于开发者而言,掌握这一技术栈不仅能提升开发效率,还能为构建复杂企业级应用打下坚实基础。
下一步行动:建议读者动手创建一个完整项目,尝试实现用户管理系统的增删改查功能,并通过 Postman 测试接口。实践是检验知识的最佳方式,也欢迎在评论区分享你的学习心得!