MyBatisPlus-逻辑删除
在JavaWeb阶段的微头条项目中,我们配置了is_delete字段来标记是否为逻辑删除,从而替代物理删除
而MyBatisPlus提供了一个注解,这个注解标记的实体类属性,就是这个逻辑删除的字段
当用户使用delete接口删除字段时,就默认使用逻辑删除了
当用户使用select接口查询数据时,会将此字段等于0作为被查询条件,这样就忽略掉此字段查询
在微头条项目中,我们使用update的方式替代delete,而MyBatisPlus只是在底层调用update,但用户操作还是delete,所以用户侧友好
为表添加一个逻辑删除字段
1
| ALTER TABLE USER ADD deleted INT DEFAULT 0 ; # int 类型 1 逻辑删除 0 未逻辑删除
|
为实体类配置逻辑删除属性
1 2 3 4 5 6 7 8 9
| @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项都会使用默认值,无需更改
1 2 3 4 5 6 7 8 9
| mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl type-aliases-package: com.xiaobai.pojo global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0
|
MyBatisPlus-乐观锁
悲观锁可以通过数据库的读写锁来解决,这样是彻底根除并发问题,但并发高后,会存在效率低的问题
乐观锁就是通过增加版本号,每次确定写入数据之前确定数据版本,如果手里拿的是最新数据则更新,如果不是则回滚
MyBatisPlus会帮我们在每次修改数据的时候,Version会增加1,也会在修改之前核对Version
我们只需要配置好启动插件,就可以使用乐观锁来解决并发问题
添加插件
MyBatiesPlus插件库中添加OptimisticLockerInnerInterceptor插件
1 2 3 4 5 6 7
| @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; }
|
为表添加一个Version字段
1
| ALTER TABLE USER ADD VERSION INT DEFAULT 1 ; # int 类型 乐观锁字段
|
为实体类配置Version属性
1 2 3 4 5 6 7 8 9 10
| @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插件
1 2 3 4 5 6 7 8
| @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); return interceptor; }
|