趣事:前段时间实习,有一个修改状态的接口要我写,心想着要写出优雅的代码,即使这是一个小小的接口,本着身在小厂心系大厂的想法出发,考虑并发问题必不可少!于是我自己写sql更新、查询语句(for update还有乐观锁版本控制的那种),美滋滋的就交差了,后来我在整理mybatisPlus代码的时候,发现原来乐观锁、逻辑删除这一切,mybatisPlus都是可以自动配置的。蜜汁尴尬😅,但是居然项目经理也和我一样是个呆瓜,这就说明了一些东西了。


本文速览

  • mybatisPlus进阶之逻辑删除
  • 配置插件
  • 实体类添加逻辑删除字段
  • 配法一
  • 配法二
  • 逻辑删除测试
  • mybatisPlus进阶之乐观锁
  • 配置插件
  • 实体类中添加乐观锁字段
  • 乐观锁测试
  • mybatisPlus进阶之分页
  • 附页(开启sql打印)


mybatisPlus进阶之逻辑删除

逻辑删除:也称软删除,在进行删除数据的时候,并不会真正的去删除数据,而是修改状态。
趣事: 开发项目不可或缺流程。商讨需求->编码。那时候接到一个需求说什么软删除某一条数据,项目经理还特意强调好几遍要软删除!软删除!当我真正开始编码的时候,看下配置文件,里面不是都进行了逻辑删除的相关配置嘛!删除=逻辑删除。从点滴之间看的出来公司到底有多水。:

配置插件

/**
	 * @author: zzh
	 */
	//逻辑删除插件,删除只会改字段状态
    @Bean
    public ISqlInjector sqlInjector() {
        return new DefaultSqlInjector();
    }

实体类添加逻辑删除字段

  • 删除:状态为1
  • 未删除:状态为0

配法一

@ApiModelProperty(value = "逻辑删除")
    @TableLogic(value = "0", delval = "1")
    private Integer deleted;

配法二

进行全局的逻辑删除配置

global-config:
    db-config:
      logic-not-delete-value: 0
      logic-delete-value: 1

此时字段加上@TableLogic即可

@ApiModelProperty(value = "逻辑删除")
    @TableLogic
    private Integer deleted;

逻辑删除测试

在使用remove、deleteById等方法的时候,只会进行状态修改。实际上是update操作

UPDATE goods SET deleted=1 WHERE id=? AND deleted=0

查询操作,根据状态查询

SELECT id,deleted,goods_type_id,price,name,remark,stock,version FROM goods WHERE id=? AND deleted=0
goodsService.remove(new QueryWrapper<Goods>().eq("stock", 10000));
goodsService.remove(31);
goodsMapper.deleteById(30);

mybatisPlus进阶用法之逻辑删除、乐观锁、分页_mybatisPlus

mybatisPlus进阶之乐观锁

配置插件

//注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

实体类中添加乐观锁字段

字段上加@Version注解,让mybatisPlus知道咱们进行了配置

/**
     * @Version mybatisPlus乐观锁自动配置
     */
    @ApiModelProperty(value = "版本号")
    @Version
    private Integer version;

乐观锁测试

Goods byId = goodsService.getById(30);
        byId.setPrice(8989D);
        byId.setStock(9090);
        goodsService.updateById(byId);
UPDATE goods SET goods_type_id=?, price=?, name=?, remark=?, stock=?, version=? WHERE id=? AND version=? AND deleted=0

进行普通的更新操作,可以看到对应执行的sql语句加上了version的控制,每更新一次version++

mybatisPlus进阶之分页

要想用mybatisPlus的分页还需配置一下分页插件

//注册分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

附页(开启sql打印)

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

本文代码链接下载:https://github.com/zhangzihang3/-workHarvestCode.git点个statr🙏啦