Spring Boot 集成 MyBatis-Plus 全攻略
1. 为什么选择 MyBatis-Plus
- 零侵入:在 MyBatis 基础上增强,不影响现有功能。
- 内置 CRUD :无需写 XML/SQL,直接调用
BaseMapper
方法。 - 强大插件:分页插件、性能分析、乐观锁、多租户等。
- 更少样板代码:节省 70% 以上 Mapper 层代码量。
2. 依赖配置
pom.xml
xml
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<!-- MySQL 驱动 -->
<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-plus:
mapper-locations: classpath*:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
4. 实体类
java
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user") // 映射数据库表
public class User {
@TableId
private Long id;
private String username;
private String email;
}
5. Mapper 接口
java
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
✅ 继承
BaseMapper<User>
后,增删改查方法就全都有了。
6. Service 层
Service 接口
java
package com.example.demo.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
}
Service 实现
java
package com.example.demo.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
7. 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
public List<User> list() {
return userService.list();
}
// 按ID查
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
return userService.getById(id);
}
// 新增
@PostMapping
public String add(@RequestBody User user) {
userService.save(user);
return "User added successfully!";
}
// 更新
@PutMapping
public String update(@RequestBody User user) {
userService.updateById(user);
return "User updated successfully!";
}
// 删除
@DeleteMapping("/{id}")
public String delete(@PathVariable Long id) {
userService.removeById(id);
return "User deleted successfully!";
}
}
8. 分页插件配置
在 Spring Boot 启动类或配置类中加入:
java
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
使用:
java
Page<User> page = new Page<>(1, 5);
Page<User> userPage = userService.page(page);
9. 常用增强功能
- 条件构造器(代替手写 SQL):
java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username", "Tom");
List<User> users = userService.list(wrapper);
- Lambda 风格(类型安全):
java
List<User> users = userService.lambdaQuery()
.like(User::getUsername, "Tom")
.orderByDesc(User::getId)
.list();
- 批量操作:
java
userService.saveBatch(usersList);
- 乐观锁支持 :加上
@Version
注解 + 乐观锁插件。
10. 总结
- 如果 SQL 比较简单,MyBatis-Plus 基本不需要写 Mapper XML。
- 如果涉及复杂查询,可以 MP + 自定义 XML 混合使用。
- 常见增强:分页、条件构造器、批量操作、乐观锁、多租户插件。
这样,就能快速从 MyBatis 手写 SQL 升级到 MyBatis-Plus 高效开发 🚀