Spring Boot 集成 MyBatis-Plus 详解
MyBatis-Plus 是 MyBatis 的增强版,提供了开箱即用的 CRUD 操作、条件构造器、分页插件等功能,简化了开发工作,提升了生产力。通过将 MyBatis-Plus 集成到 Spring Boot 中,开发者可以轻松构建高效、简洁的数据库访问层。
1. 项目依赖配置
在 Spring Boot 项目中集成 MyBatis-Plus 需要添加相关的依赖。MyBatis-Plus 提供了一个 spring-boot-starter
来简化配置过程。
1.1 添加 Maven 依赖
在 pom.xml
中添加如下依赖:
xml
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus Spring Boot Starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok(可选,用于简化实体类代码) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
- mybatis-plus-boot-starter:MyBatis-Plus 与 Spring Boot 的集成 starter,简化了 MyBatis-Plus 的配置。
- mysql-connector-java:MySQL 数据库驱动。
1.2 配置数据库连接信息
在 src/main/resources/application.yml
中配置数据库连接信息:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:mapper/*.xml # XML 配置文件路径
type-aliases-package: com.example.demo.model # 实体类包路径
- datasource:数据库连接相关信息。
- mapper-locations:MyBatis Mapper XML 文件的路径。
- type-aliases-package:实体类所在包,简化 MyBatis-Plus 的类型映射。
2. MyBatis-Plus 基础配置
在 MyBatis-Plus 中,通常需要定义实体类、Mapper 接口和相应的 XML 文件(可选)。
2.1 创建实体类
假设有一个 User
表,包含 id
、username
和 email
字段。首先创建对应的 User
实体类:
java
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;
@Data
public class User {
@TableId(type = IdType.AUTO) // 指定主键生成策略为自增
private Integer id;
private String username;
private String email;
}
@TableId
:指定主键及其生成策略,IdType.AUTO
表示使用数据库的自增主键。
2.2 创建 Mapper 接口
MyBatis-Plus 通过继承 BaseMapper
接口提供了基础的 CRUD 功能,开发者只需定义实体类对应的 Mapper 接口。
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
BaseMapper
:提供了通用的 CRUD 操作,支持insert
、update
、delete
、select
等基本功能。@Mapper
:标识为 MyBatis Mapper,Spring Boot 会自动扫描并注入。
2.3 测试 CRUD 操作
为了测试基础的 CRUD 操作,我们创建一个简单的服务类和控制器。
服务类
java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getAllUsers() {
return list();
}
public User getUserById(int id) {
return getById(id);
}
public void createUser(User user) {
save(user);
}
public void updateUser(User user) {
updateById(user);
}
public void deleteUser(int id) {
removeById(id);
}
}
控制器
java
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable int id) {
return userService.getUserById(id);
}
@PostMapping
public void createUser(@RequestBody User user) {
userService.createUser(user);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable int id, @RequestBody User user) {
user.setId(id);
userService.updateUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable int id) {
userService.deleteUser(id);
}
}
通过该控制器,可以通过 RESTful API 测试基本的 CRUD 操作。
3. 复杂查询与条件构造器
MyBatis-Plus 提供了 Wrapper
条件构造器来简化复杂查询的实现,QueryWrapper
用于构建查询条件,UpdateWrapper
用于构建更新条件。
3.1 使用 QueryWrapper
进行条件查询
java
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> findUsersByCondition(String username, String email) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(username != null, "username", username)
.like(email != null, "email", email);
return userMapper.selectList(queryWrapper);
}
}
eq
:等值条件。like
:模糊匹配。
该查询方法可以根据传入的条件动态生成 SQL 查询。
3.2 使用 UpdateWrapper
进行条件更新
java
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
public void updateUserEmail(Integer id, String email) {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id).set("email", email);
userMapper.update(null, updateWrapper);
}
set
:指定要更新的字段。eq
:条件匹配。
该方法根据 id
更新用户的 email
字段。
4. 分页功能
MyBatis-Plus 提供了内置的分页插件,简化了分页查询操作。首先,需要在项目中配置分页插件。
4.1 配置分页插件
在 MyBatisPlusConfig
配置类中启用分页插件:
java
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
4.2 使用分页功能
在服务层使用分页功能:
java
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public Page<User> getUsersWithPagination(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null);
}
}
在控制器中调用分页查询:
java
@GetMapping("/page")
public Page<User> getUsersWithPagination(@RequestParam int pageNum, @RequestParam int pageSize) {
return userService.getUsersWithPagination(pageNum, pageSize);
}
Page<T>
:MyBatis-Plus 提供的分页对象
,用于封装分页结果。
5. MyBatis-Plus 常用功能总结
- 自动填充 :通过
@TableField(fill = ...)
和MetaObjectHandler
实现插入和更新时的字段自动填充。 - 逻辑删除 :通过
@TableLogic
实现逻辑删除。 - 乐观锁 :通过
@Version
实现并发时的乐观锁机制。 - 批量操作:MyBatis-Plus 支持批量插入、更新操作,提升性能。
6. 总结
MyBatis-Plus 的集成和使用在 Spring Boot 项目中非常简单。通过 mybatis-plus-boot-starter
,开发者可以轻松构建基础的 CRUD 操作,并利用 MyBatis-Plus 提供的查询构造器、分页插件等功能,快速处理复杂的业务需求。
- 基础 CRUD :通过继承
BaseMapper
,可以直接调用常用的数据库操作方法。 - 复杂查询 :利用
QueryWrapper
和UpdateWrapper
,实现灵活的条件查询和更新。 - 分页功能:通过 MyBatis-Plus 的分页插件,轻松实现分页查询。
- 事务管理 :MyBatis-Plus 也完全支持 Spring 的事务管理,开发者可以使用
@Transactional
注解管理事务。