第 49 章:MyBatis Plus 入门
学习目标
- 集成 MyBatis Plus
- 掌握通用 CRUD
- 学会分页、条件构造器
一、为啥用 MyBatis Plus
原生 MyBatis:
java
// ❌ 每个表都要写 CRUD
@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
public void insert(User user);
@Select("SELECT * FROM user WHERE id = #{id}")
public User findById(Long id);MyBatis Plus(MP):通用 Mapper + 条件构造器,不再写 SQL。
二、集成
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/myapp?useSSL=false&characterEncoding=UTF-8
username: root
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver三、实体类
java
@Data
@TableName("user") // 表名(可省略,默认类名转下划线)
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
@TableField("user_name") // 字段名映射
private String username;
private Integer age;
@TableLogic // 逻辑删除字段
private Integer deleted;
@Version // 乐观锁
private Integer version;
}| 注解 | 作用 |
|---|---|
@TableName | 表名 |
@TableId | 主键 + 策略 |
@TableField | 字段映射 |
@TableLogic | 逻辑删除 |
@Version | 乐观锁 |
四、通用 Mapper
java
public interface UserMapper extends BaseMapper<User> {
// 这里啥都不用写,BaseMapper 已经提供 25 个方法
}继承自 BaseMapper:
java
int insert(User entity); // 插入
int deleteById(Serializable id); // 按 ID 删
int updateById(User entity); // 按 ID 改
User selectById(Serializable id); // 按 ID 查
List<User> selectBatchIds(Collection); // 按 ID 批量
List<User> selectList(Wrapper); // 条件查
Long selectCount(Wrapper); // 数量
// ... 共 25+五、条件构造器(核心)
java
// 1. 简单条件
LambdaQueryWrapper<User> q = new LambdaQueryWrapper<>();
q.eq(User::getAge, 18)
.like(User::getName, "张")
.orderByDesc(User::getId);
List<User> users = userMapper.selectList(q);
// 2. 链式
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>()
.eq(User::getStatus, 1)
.between(User::getAge, 18, 30)
.isNotNull(User::getEmail)
.orderByAsc(User::getId)
);
// 3. SQL 片段
new LambdaQueryWrapper<User>().last("LIMIT 10")⚠️ 坑 1:用
LambdaQueryWrapper而不是QueryWrapper。后者字段名是字符串,改字段名不会报错,后期维护崩溃。
六、分页
注册分页插件:
java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}使用:
java
Page<User> page = userMapper.selectPage(
new Page<>(1, 10), // 第 1 页,每页 10
new LambdaQueryWrapper<User>().eq(User::getStatus, 1)
);
// page.getRecords() -> 当前页数据
// page.getTotal() -> 总数
// page.getPages() -> 总页数自动分页(推荐,用拦截器):
java
@GetMapping("/users")
public Result<IPage<UserVO>> list(@RequestParam int page, @RequestParam int size) {
Page<User> p = new Page<>(page, size);
return Result.ok(userMapper.selectPage(p, null).convert(UserVO::from));
}七、常用配置
yaml
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 自动转驼峰
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL
global-config:
db-config:
id-type: auto
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0八、逻辑删除
java
// 字段 deleted:0=未删,1=已删
// 删
userMapper.deleteById(1L);
// 自动变成 UPDATE user SET deleted = 1 WHERE id = 1⚠️ 坑 2:逻辑删除会让所有查询自动加
WHERE deleted = 0,包括 JOIN。要注意索引性能。
九、本章小结
| 要点 | 关键 |
|---|---|
| BaseMapper | 25 个通用方法 |
| 条件构造器 | LambdaQueryWrapper(类型安全) |
| 分页 | PaginationInnerInterceptor |
| 逻辑删除 | @TableLogic |
动手练习
- 集成 MyBatis Plus,写 User 实体的 CRUD
- 用条件构造器查"年龄 18-30,用户名含'张'"的用户
- 写一个分页查询接口