MybatisPlus进阶篇学习笔记(二)------逻辑删除

原创:兜里的猫
本章目录
目录导航
 
 
逻辑删除简介
 
逻辑删除实现
 
查询中排除删除标识字段
 
注意事项

1. 逻辑删除简介


  • 逻辑删除

逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(deleted)或者说是状态字段(status)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。对应的SQL语句:update user set deleted = 1 where id = 1;语句表示在该表中将id为1的信息进行逻辑删除,那么客户端进行查询id为1的信息,服务器就不会提供信息。倘若想继续为客户端提供该信息,可将 deleted 更改为 0 。

  • 物理删除

物理删除就是真正的从数据库中做删除操作了。
对应的SQL语句:delete from user where id = 1;执行该语句即为将数据库中id为1的这条数据进行彻底删除,无法恢复。

在很多文章系统中都有回收站,关于回收站的原理,其实就是利用了逻辑删除,对于删除文件进入回收站的本质只是在操作系统的帮助下对文件加上了某个标记,资源管理器中对含有这种标记的文件不会显示。当从回收站恢复的时候只是移除了加上的标记而已,而清空回收站就是进行了物理删除。

切记,作为编程人员对于删除,一定要慎之又慎,一定要再三考虑!!!

dvdf

2. 逻辑删除实现


第一步:

在配置文件中加入如下配置:

# mp默认逻辑删除配置就是下面的
# 如果项目中逻辑删除字段值与默认的一致,可以省略该配置
mybatis-plus:
  # 全局配置
  global-config:
    db-config:
      # 逻辑未删除将删除标志字段deleted置为0
      logic-not-delete-value: 0
      # 逻辑已删除将删除标志字段deleted置为1
      logic-delete-value: 1

第二步:

编写mybatisplus配置类,在conf目录下新建MybatisPlusConfiguration.java

/**
 * MybatisPlus配置类
 */
@Configuration
public class MybatisPlusConfiguration {

    /**
     *  下面的方法为mp逻辑删除配置注册bean
     *  在使用3.1.1之前的版本时需要注册如下bean,之后的版本不需要
     *  本项目使用的是3.3.0版本,所以不注册该bean
     */
//    @Bean
//    public ISqlInjector sqlInjector () {
//        return new LogicSqllnjector();
//    }


}

第三步:

在user实体类中的deleted删除标志字段上加上注解@TableLogic,也可以使用该注解进行局部配置@TableLogic(delval = "1",value = "0") delval为逻辑已删除、value为逻辑未删除,但不建议使用局部配置,每个实体类配置不一致很容易导致混乱,一般也不会进行逻辑删除的局部配置。

//逻辑删除标识(0.未删除,1.已删除),默认为0)
    @TableLogic
    private Integer deleted;

第四步:

编写controller类进行删除测试

image

在该方法中的deleteByID前后我都加上了查询实体类语句,便于查看同一个实体对象逻辑删除前后的区别。

第一个查询可以看到对象中deleted删除标识字段为0;

第二个删除其实是进行了update操作将deleted字段set为1表示逻辑已删除;

第三个查询语句执行后的影响行为0,就是没有查询到的意思;

注: 这里是因为user类中加入了逻辑删除标识,该user类在mp中所有修改和更新操作的where条件都会加上逻辑未删除标识的限制,从控制台打印的sql语句可以看出。

dvdf

3. 查询中排除删除标识字段


使用了逻辑删除,在进行查询的时候会把逻辑删除标识字段也查询出来,但查询本身就有了逻辑删除标识的限制,所以查询该字段没有意义。

如何在查询中排除该字段,快速的方法是在实体类字段属性山加上注解即可:

@TableField(select = false)
    private Integer deleted;

这样查询的语句就不会返回deleted字段值。

image

从打印的查询sql语句中就能看出已经排除了deleted字段。

dvdf

4. 注意事项


自定义的sql语句,mp不会忽略deleted属性,需要我们手动忽略,如下:

先在UserMapper接口中自定义查询接口

//  自定义SQL语句接口
    @Select("select * from user ${ew.customSqlSegment}")
    List<User> mySelectUsers(@Param(Constants.WRAPPER) Wrapper<User> wrapper);

然后编写controller方法测试

image

从图中标记地方可以对比看出自定义sql需要手动排除标识字段。

dvdf

欢迎访问博客网页版:www.wldeer.com

评论

兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×