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的组合堪称“黄金搭档”。前者通过约定优于配置的理念简化了项目搭建,后者则以灵活的SQL映射能力解决了ORM框架的灵活性问题。本文将从零开始,系统讲解两者的整合思路,通过循序渐进的案例,帮助开发者掌握这一技术栈的核心要点。
一、环境搭建与基础配置
1.1 项目初始化
使用Spring Initializr快速创建项目时,需添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- 数据库驱动,此处以MySQL为例 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
</dependencies>
小贴士:通过
<artifactId>mybatis-spring-boot-starter</artifactId>
,Spring Boot会自动扫描src/main/resources
目录下的application.properties
文件。
1.2 数据库连接配置
在application.properties
中添加数据库参数:
spring.datasource.url=jdbc:mysql://localhost:3306/demo_db?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
此时,Spring Boot会自动创建DataSource
并初始化MyBatis环境。
二、核心概念解析
2.1 Spring Boot的“约定优于配置”哲学
Spring Boot通过一系列starter依赖和默认配置,大幅降低了开发者的重复劳动。例如:
- 自动配置:无需手动配置Tomcat、数据源等基础组件
- 端点监控:内置Actuator模块提供健康检查、指标统计等功能
- 日志聚合:统一使用SLF4J实现日志输出
比喻:就像搭建乐高积木,Spring Boot提供了标准化的“积木块”,开发者只需按需组合,即可快速构建复杂系统。
2.2 MyBatis的“SQL映射”机制
MyBatis通过XML或注解将Java方法与SQL语句进行绑定,其核心优势在于:
- 灵活性:直接编写原生SQL,避免ORM框架的性能损耗
- 可维护性:通过Mapper接口与XML分离,实现代码解耦
- 扩展性:支持动态SQL、分页插件等高级功能
比喻:MyBatis就像一位“SQL翻译官”,将Java的面向对象思维转化为数据库能理解的SQL语言。
三、整合实战:从配置到运行
3.1 定义实体类与Mapper接口
// User.java
@Data
public class User {
private Long id;
private String username;
private String email;
}
// UserMapper.java
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
@Insert("INSERT INTO user(username, email) VALUES(#{username}, #{email})")
void insert(User user);
}
3.2 配置MyBatis扫描路径
在Spring Boot主类或配置类中添加:
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
// 可在此扩展配置,如分页插件等
}
3.3 控制器层实现
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userMapper.selectById(id);
}
}
此时启动项目,访问/user/1
即可通过MyBatis查询数据库。
四、高级用法与优化技巧
4.1 动态SQL与条件查询
通过<if>
标签实现复杂查询:
<!-- UserMapper.xml -->
<select id="selectByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="username != null">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
4.2 分页插件集成
通过PageHelper实现分页:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
使用方式:
PageHelper.startPage(1, 10);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
4.3 二级缓存优化
在application.properties
中启用二级缓存:
mybatis.configuration.cache-enabled=true
并在Mapper接口添加注解:
@CacheNamespace(implementation = EhcacheCache.class)
public interface UserMapper {
// 方法定义
}
五、案例分析:用户管理功能实现
5.1 需求场景
实现一个包含增删改查的用户管理模块,要求:
- 支持按用户名模糊查询
- 支持分页显示用户列表
- 提供数据校验功能
5.2 完整代码示例
5.2.1 数据库表结构
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL UNIQUE,
`email` VARCHAR(100) NOT NULL UNIQUE,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
);
5.2.2 Mapper XML配置
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectPage" resultType="User">
SELECT * FROM user
WHERE username LIKE CONCAT('%', #{username}, '%')
LIMIT #{offset}, #{pageSize}
</select>
<insert id="insertUser">
INSERT INTO user(username, email)
VALUES(#{user.username}, #{user.email})
</insert>
</mapper>
5.2.3 服务层校验
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user) {
// 校验邮箱格式
if (!user.getEmail().matches("\\w+@\\w+\\.\\w+")) {
throw new IllegalArgumentException("邮箱格式错误");
}
userMapper.insertUser(user);
}
}
六、常见问题与解决方案
6.1 Mapper接口无法注入
原因:未正确配置@MapperScan
或包路径错误
解决:
@Configuration
@MapperScan("com.example.mapper") // 确保与包路径一致
public class MyBatisConfig {}
6.2 SQL执行超时
原因:未配置数据库连接池参数
解决:
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=20
6.3 动态SQL条件失效
原因:对象属性未正确传递
解决:
// 正确写法
Map<String, Object> params = new HashMap<>();
params.put("username", "test");
userMapper.selectByCondition(params);
// XML中使用
<if test="username != null">
AND username = #{username}
</if>
结论
通过本文的讲解,开发者可以掌握Spring Boot与MyBatis从基础整合到高级应用的全流程。这种技术组合既继承了Spring Boot的快速开发优势,又保留了MyBatis的SQL灵活性,特别适合需要兼顾开发效率与数据库控制力的场景。
建议读者在实践过程中,重点关注以下几点:
- 配置规范性:严格按照Spring Boot的约定管理依赖和配置
- 分层设计:保持Controller-Service-DAO的清晰职责边界
- 性能优化:善用MyBatis的缓存机制和分页插件
随着项目复杂度的提升,可进一步探索MyBatis的插件扩展、Spring Boot的Actuator监控等功能,逐步构建健壮的企业级应用。