Skip to content

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_timeupdate_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 不影响。

练习建议

  1. 用 MP 整合 SpringBoot 完成用户 CRUD。
  2. 用 LambdaQueryWrapper 写出复杂条件查询。
  3. 配置分页插件,实现分页列表。
  4. 实现自动填充创建/更新时间。
  5. 实现逻辑删除(删后仍能查到,只是 deleted=1)。