05-MyBatis-Plus
对应原始资料:
微服务框架课件/01-Mybatis-Plus
一、MyBatis-Plus 是什么
MyBatis 的增强工具,在不改变 MyBatis 原有功能的基础上,提供:
- 内置通用 CRUD(无需写 SQL)。
- 条件构造器(Wrapper)。
- 代码生成器。
- 分页插件、逻辑删除、自动填充。
国产开源(苞米豆),国内非常流行。
MP 不会替代 MyBatis,只是增强。
二、整合 SpringBoot
1. 依赖
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>不要再引入 mybatis-spring-boot-starter,已包含。
2. 实体类
java
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String name;
private Integer age;
@TableField("create_time") // 字段名映射(驼峰可省)
private LocalDateTime createTime;
@TableLogic // 逻辑删除字段
@TableField("deleted")
private Integer deleted;
}3. Mapper
java
@Mapper
public interface UserMapper extends BaseMapper<User> { // 继承即有 CRUD
}4. Service(推荐)
java
public interface UserService extends IService<User> {}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService {}三、通用 CRUD
java
// Mapper 自带
userMapper.insert(user);
userMapper.deleteById(1);
userMapper.updateById(user);
User u = userMapper.selectById(1);
List<User> list = userMapper.selectList(null);
// Service 层更丰富
userService.save(user);
userService.saveBatch(list);
userService.saveOrUpdate(user);
userService.removeById(1);
userService.list();
userService.page(new Page<>(1, 10), null);四、条件构造器 QueryWrapper / LambdaQueryWrapper
java
// 链式调用
List<User> list = userService.lambdaQuery()
.eq(User::getName, "张三")
.ge(User::getAge, 18)
.between(User::getAge, 18, 30)
.like(User::getName, "张")
.in(User::getId, Arrays.asList(1L, 2L))
.isNull(User::getEmail)
.orderByDesc(User::getAge)
.last("LIMIT 10")
.list(); // 终结方法:list / one / count / page
// 更新
userService.lambdaUpdate().eq(User::getId, 1L).set(User::getAge, 20).update();
// 删除
userService.lambdaUpdate().eq(User::getAge, 0).remove();常用条件:eq/ne/gt/ge/lt/le/between/like/likeLeft/likeRight/in/notIn/isNull/inSql/apply/exists。
五、分页插件
java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor interceptor() {
MybatisPlusInterceptor i = new MybatisPlusInterceptor();
i.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return i;
}
}
// 使用
Page<User> page = userService.lambdaQuery()
.like(User::getName, "张")
.page(new Page<>(1, 10));
page.getRecords(); // 数据
page.getTotal(); // 总数
page.getPages(); // 总页数六、自动填充
create_time、update_time 自动填充:
java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
public void insertFill(MetaObject m) {
this.strictInsertFill(m, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(m, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
public void updateFill(MetaObject m) {
this.strictUpdateFill(m, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
// 实体类字段加 @TableField(fill = FieldFill.INSERT) / INSERT_UPDATE七、逻辑删除
yaml
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0实体字段加 @TableLogic,调用 removeById 实际是 UPDATE deleted=1,查询自动过滤已删除。
八、乐观锁
字段加 @Version:
java
@Version private Integer version;更新时 MP 自动加 AND version = #{old} 并 version + 1,更新失败说明被并发修改。
九、代码生成器
mybatis-plus-generator 可根据数据库表自动生成 Entity/Mapper/Service/Controller。
十、自定义 SQL(仍可写 XML)
复杂 SQL 仍按 MyBatis 方式写 XML 或注解,MP 不影响。
练习建议
- 用 MP 整合 SpringBoot 完成用户 CRUD。
- 用 LambdaQueryWrapper 写出复杂条件查询。
- 配置分页插件,实现分页列表。
- 实现自动填充创建/更新时间。
- 实现逻辑删除(删后仍能查到,只是 deleted=1)。