Mybatis Plus 邏輯刪除


一、項目搭建

項目的搭建過程省略,參考此文章

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條件不查已經被邏輯刪除的記錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM