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;
}