Spring Boot 集成 MyBatis 全攻略
1. 为什么选择 MyBatis
- ORM 灵活性:相比 Hibernate,MyBatis 更灵活,SQL 可控,性能优化空间大。
- 学习曲线低:对于熟悉 SQL 的开发者,上手快。
- 与 Spring Boot 无缝整合:只需少量配置,即可快速使用。
2. 基础环境
依赖(pom.xml
)
xml
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Spring-Boot-Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok(可选) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
3. 配置数据源
application.yml
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root123
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
# 指定 Mapper XML 文件位置
mapper-locations: classpath:mapper/*.xml
# 指定实体类包,自动映射列名和属性名(开启驼峰命名)
type-aliases-package: com.example.demo.entity
configuration:
map-underscore-to-camel-case: true
4. 定义实体类
java
package com.example.demo.entity;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String email;
}
5. 定义 Mapper 接口
java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
@Select("SELECT * FROM user")
List<User> findAll();
@Insert("INSERT INTO user(username, email) VALUES(#{username}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("UPDATE user SET username=#{username}, email=#{email} WHERE id=#{id}")
int update(User user);
@Delete("DELETE FROM user WHERE id=#{id}")
int delete(Long id);
}
✅ 这里用注解方式,简单清晰;复杂 SQL 可以写到 XML 文件。
6. 使用 XML 配置 SQL(适合复杂 SQL)
在 resources/mapper/UserMapper.xml
中:
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="findAll" resultType="com.example.demo.entity.User">
SELECT * FROM user
</select>
<insert id="insert" parameterType="com.example.demo.entity.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(username, email) VALUES(#{username}, #{email})
</insert>
</mapper>
7. Service + Controller
Service
java
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUser(Long id) {
return userMapper.findById(id);
}
public List<User> listUsers() {
return userMapper.findAll();
}
public int addUser(User user) {
return userMapper.insert(user);
}
}
Controller
java
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUser(id);
}
@GetMapping
public List<User> listUsers() {
return userService.listUsers();
}
@PostMapping
public String addUser(@RequestBody User user) {
userService.addUser(user);
return "User added successfully!";
}
}
8. 分页支持
推荐集成 PageHelper 插件:
xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
使用:
java
PageHelper.startPage(1, 10);
List<User> users = userMapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
9. 常见优化
- 批量插入 :使用
foreach
标签。 - 动态 SQL :使用
<if>
<choose>
等标签构建灵活查询。 - 二级缓存 :
<cache/>
配置 + Redis 集成。 - 多数据源:Spring Boot + MyBatis 支持动态数据源切换。
- 统一异常处理 :结合
@ControllerAdvice
统一返回接口错误信息。
10. 总结
Spring Boot + MyBatis 集成流程大致分为:
- 加依赖 → 2. 配数据源 → 3. 写实体类 → 4. 写 Mapper(注解/XML) → 5. 写 Service/Controller → 6. 增强功能(分页、缓存、动态 SQL)。
这样,就能快速搭建一个 基于 Spring Boot + MyBatis 的全栈开发框架 🚀。