一、項目搭建
項目的搭建過程省略,參考此文章
CREATE TABLE `user` ( `id` bigint(20) NOT NULL COMMENT '主鍵', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年齡', `email` varchar(50) DEFAULT NULL COMMENT '郵箱', `manager_id` bigint(20) DEFAULT NULL COMMENT '直屬上級id', `create_time` datetime DEFAULT NULL COMMENT '創建時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', `version` int(10) DEFAULT '1' COMMENT '版本', `deleted` varchar(1) DEFAULT '0' COMMENT '刪除標識', PRIMARY KEY (`id`), KEY `manager_fk` (`manager_id`), CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `mp`.`user`(`id`, `name`, `age`, `email`, `manager_id`, `create_time`, `update_time`, `version`, `deleted`) VALUES (1087982257332887553, '大boss', 40, 'boss@baomidou.com', NULL, '2019-01-11 14:20:20', NULL, 1, '0'); INSERT INTO `mp`.`user`(`id`, `name`, `age`, `email`, `manager_id`, `create_time`, `update_time`, `version`, `deleted`) VALUES (1088248166370832385, '王天風', 26, 'wtf2@baomidou.com', 1087982257332887553, '2019-02-05 11:12:22', NULL, 1, '0'); INSERT INTO `mp`.`user`(`id`, `name`, `age`, `email`, `manager_id`, `create_time`, `update_time`, `version`, `deleted`) VALUES (1088250446457389058, '李藝偉', 30, 'lyw2021@baomidou.com', 1088248166370832385, '2019-02-14 08:31:16', NULL, 1, '0'); INSERT INTO `mp`.`user`(`id`, `name`, `age`, `email`, `manager_id`, `create_time`, `update_time`, `version`, `deleted`) VALUES (1094590409767661570, '張雨琪', 31, 'zjq@baomidou.com', 1088248166370832385, '2019-01-14 09:15:15', NULL, 1, '0'); INSERT INTO `mp`.`user`(`id`, `name`, `age`, `email`, `manager_id`, `create_time`, `update_time`, `version`, `deleted`) VALUES (1094592041087729666, '劉紅雨', 32, 'lhm@baomidou.com', 1088248166370832385, '2019-01-14 09:48:16', NULL, 1, '0');
二、代碼實戰
1、配置文件增加全局配置
目的是全局設置邏輯未刪除和邏輯刪除在數據庫中對應的值
# Mybatis Plus配置
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1 logic-not-delete-value: 0
2、使用@TableLogic來標記邏輯刪除的字段
該注解也能局部控制邏輯未刪除和邏輯刪除在數據庫中對應的值,@TableLogic(value = "0", delval = "1")
@Data public class User extends Model<User> { //主鍵 @TableId(type= IdType.ID_WORKER) private Long id; //姓名 private String name; //年齡 private Integer age; //郵箱 private String email; //直屬上級id private Long managerId; //創建時間 private Date createTime; //更新時間 private Date updateTime; //版本 private String version; //刪除標識:0未刪除1已刪除 @TableLogic private String deleted; }
3、注入配置類
高版本MP不需要這一步
@Configuration public class MybatisPlusConfig { @Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); } }
4、測試
@SpringBootTest public class LogicDeleteTest { @Autowired private UserMapper userMapper; @Test public void logicDelete() { int rows = userMapper.deleteById("1094592041087729666"); System.out.println("rows===" + rows); } }
修改后的查詢、修改也會將邏輯已刪除的記錄排除在外
@Test public void select() { List<User> list = userMapper.selectList(null); System.out.println("list===" + list); }
三、查詢中排除刪除標識字段及注意事項
使用@TableField(select = false)來排除字段
@TableLogic @TableField(select = false) private String deleted;
需要注意的是:如果是我們自定義的查詢、修改語句,比如自定義xml,那么MP是不會幫我們加delete='0'這個條件的,也就是說需要我們自己去添加where條件不查已經被邏輯刪除的記錄