spring boot 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 构建一个完整的 Web 应用,并通过实际案例帮助读者掌握核心知识点。
环境搭建:快速启动的基石
依赖配置与项目初始化
使用 Spring Boot MyBatis 的第一步是搭建开发环境。通过 Maven 或 Gradle 管理依赖是最常见的做法。以下是一个典型的 Maven 依赖配置示例:
<dependencies>
<!-- Spring Boot Web 启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Spring Boot 整合依赖 -->
<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.26</version>
</dependency>
<!-- 测试依赖(可选) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
数据库与配置文件
在 application.properties
中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapper-locations=classpath:mapper/*.xml
核心概念解析:理解框架的底层逻辑
Spring Boot 的自动配置机制
Spring Boot 的核心优势之一是 自动配置。当引入 mybatis-spring-boot-starter
依赖后,框架会自动扫描并初始化以下组件:
- 数据源(DataSource):根据
application.properties
配置自动创建数据库连接池。 - SqlSessionFactory:基于数据源生成 SQL 会话工厂。
- MyBatis 接口扫描:通过
@MapperScan
注解或组件扫描自动注册 Mapper 接口。
比喻:这就像“乐高积木的自动拼装”,开发者只需提供基础模块(如数据库配置),框架会自动组合成完整的系统。
MyBatis 的 SQL 映射原理
MyBatis 通过 XML 或注解将 SQL 语句与 Java 方法绑定,实现“面向接口的编程”。例如,以下代码展示了用户查询的映射关系:
// UserMapper.java 接口
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
}
对应的 XML 文件(user-mapper.xml
):
<select id="selectById" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id}
</select>
核心思想:SQL 语句与 Java 方法分离,避免硬编码,同时保持 SQL 的灵活性。
实战案例:用户管理系统的实现
实体类设计
定义 User
实体类,与数据库表 user
对应:
public class User {
private Long id;
private String username;
private String email;
// 省略 getter/setter 方法
}
Mapper 接口与 SQL 实现
创建 UserMapper
接口并编写查询方法:
public interface UserMapper {
List<User> selectAll();
User selectById(Long id);
int insert(User user);
int update(User user);
int delete(Long id);
}
在 XML 文件中实现 SQL 语句:
<!-- 查询所有用户 -->
<select id="selectAll" resultType="User">
SELECT * FROM user
</select>
<!-- 新增用户 -->
<insert id="insert">
INSERT INTO user (username, email) VALUES (#{username}, #{email})
</insert>
Service 层与 Controller 层
通过 Service 层封装业务逻辑,Controller 层提供 REST API:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectAll();
}
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public ResponseEntity<List<User>> getUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}
}
高级功能:提升开发效率的技巧
分页与动态 SQL
通过 MyBatis 的 <if>
、<choose>
等标签实现动态 SQL,结合分页插件(如 PageHelper)简化分页逻辑:
<!-- 带条件的查询 -->
<select id="selectByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="username != null">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
</select>
二级缓存与性能优化
启用 MyBatis 的二级缓存可减少数据库查询次数:
mybatis.configuration.cache-enabled=true
在 Mapper 接口中添加 @CacheNamespace
注解:
@CacheNamespace
public interface UserMapper {
// 方法定义
}
常见问题与解决方案
1. SQL 语句未被识别
原因:Mapper 接口未被 Spring Boot 扫描到。
解决:在启动类或配置类上添加 @MapperScan("com.example.mapper")
注解。
2. 数据库连接失败
原因:数据库 URL、用户名或密码配置错误。
解决:检查 application.properties
中的数据库配置,并确认数据库服务已启动。
3. MyBatis 与 JPA 共存冲突
原因:Spring Boot 默认会自动配置 JPA,导致 MyBatis 配置被覆盖。
解决:在启动类中排除 JPA 自动配置:
@SpringBootApplication(exclude = {HibernateJpaAutoConfiguration.class})
public class Application {
// 主方法
}
结论
通过本文的讲解,读者应已掌握 Spring Boot MyBatis 的核心概念、开发流程和常见技巧。这一组合不仅降低了开发门槛,还提供了灵活的数据操作能力。对于初学者,建议从简单 CRUD 功能入手,逐步探索分页、缓存等高级特性;中级开发者则可以结合实际需求,深入研究 MyBatis 的插件机制或与 Spring Data JPA 的对比。未来,随着微服务架构的普及,掌握 Spring Boot MyBatis 将成为构建高可用、高性能系统的重要基石。
最后提醒:实践是掌握技术的关键!读者可通过搭建一个完整的用户管理系统,或尝试将现有项目迁移到 Spring Boot MyBatis 架构,进一步巩固所学知识。