MyBatisPlus-高级扩展

MyBatisPlus-逻辑删除

在JavaWeb阶段的微头条项目中,我们配置了is_delete字段来标记是否为逻辑删除,从而替代物理删除

而MyBatisPlus提供了一个注解,这个注解标记的实体类属性,就是这个逻辑删除的字段

当用户使用delete接口删除字段时,就默认使用逻辑删除了

当用户使用select接口查询数据时,会将此字段等于0作为被查询条件,这样就忽略掉此字段查询

在微头条项目中,我们使用update的方式替代delete,而MyBatisPlus只是在底层调用update,但用户操作还是delete,所以用户侧友好


为表添加一个逻辑删除字段

ALTER TABLE USER ADD deleted INT DEFAULT 0 ;  # int 类型 1 逻辑删除 0 未逻辑删除

为实体类配置逻辑删除属性

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableLogic
    private Integer deleted; // 逻辑删除属性
}

全局配置逻辑删除

使用mybatis-plus-global-config-db-config-logic-delete-field配置全局逻辑删除属性

一般logic-delete-value和logic-not-delete-value项都会使用默认值,无需更改

mybatis-plus:
configuration:
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 以控制台输出Sql语句
type-aliases-package: com.xiaobai.pojo # 给实体类起别名
global-config:
  db-config:
    logic-delete-field: deleted # 为所有表配置逻辑删除属性
    logic-delete-value: 1 # 设置被删除时的属性默认值为1 ,默认值也为1 
    logic-not-delete-value: 0 # 设置设置未被删除时的属性默认值为0 ,默认值也为0

MyBatisPlus-乐观锁

悲观锁可以通过数据库的读写锁来解决,这样是彻底根除并发问题,但并发高后,会存在效率低的问题

乐观锁就是通过增加版本号,每次确定写入数据之前确定数据版本,如果手里拿的是最新数据则更新,如果不是则回滚

MyBatisPlus会帮我们在每次修改数据的时候,Version会增加1,也会在修改之前核对Version

我们只需要配置好启动插件,就可以使用乐观锁来解决并发问题


添加插件

MyBatiesPlus插件库中添加OptimisticLockerInnerInterceptor插件

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 添加分页插件,配置数据库类型为MySQL
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 添加乐观锁插件
    return interceptor;
}

为表添加一个Version字段

ALTER TABLE USER ADD VERSION INT DEFAULT 1 ;  # int 类型 乐观锁字段

为实体类配置Version属性

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private Integer deleted;
    @com.baomidou.mybatisplus.annotation.Version
    private Integer Version;
}

MyBatisPlus-阻断攻击Sql解析器

防止误操作或注入操作删除全表或更新,我们使用BlockAttackInnerInterceptor插件即可

添加插件

MyBatiesPlus插件库中添加BlockAttackInnerInterceptor插件

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 添加分页插件,配置数据库类型为MySQL
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 添加乐观锁插件
    interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 防止全表更新或删除插件
    return interceptor;
}