mybatis-plus之逻辑删除&自动填充&乐观锁
1.背景
mybatis-plus除了常规的一些CRUD还有其他的的功能如下
2.逻辑删除
2.1.实现配置
步骤一、数据库准备一个逻辑删除字段,一般是deleted
步骤二、配置文件中添加入下配置

步骤三、java实体上加标签如下:

2.2.实际案例演示

package com.ldp.demo01; import com.ldp.entity.SysUser;
import com.ldp.mapper.SysUserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 12/14 7:13
* @description <p>
* 逻辑删除测试
* </p>
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test11LogicDeleted {
@Autowired
private SysUserMapper sysUserMapper; /**
* 逻辑删除测试
* <p>
* ==> Preparing: UPDATE sys_user SET deleted=1 WHERE id=? AND deleted=0
* ==> Parameters: 26(Integer)
* <== Updates: 1
* <p>
* 注意观察:虽然我执行的是删除,但是因为配置了逻辑删除,使用最后执行的本质sql是更新,
* 而且在更新的sql语句中还加入了deleted=0这个条件
* 那么试想一想,如果是查询、修改会加入deleted=0这个条件么?
*/
@Test
public void test01() {
int row = sysUserMapper.deleteById(25);
System.out.println("受影响行数:" + row);
} /**
* 测试逻辑删除下的查询
* <p>
* ==> Preparing: SELECT id,version,age,gender,name,parent_id,position,account,we_chat,password,status,type,create_time,update_time,deleted
* FROM sys_user WHERE id=? AND deleted=0
* ==> Parameters: 25(Integer)
* <p>
* 注意逻辑删除下的查询是加了 AND deleted=0 作为查条件的
*/
@Test
public void test02() {
SysUser sysUser = sysUserMapper.selectById(25);
System.out.println("sysUser=" + sysUser);
} /**
* 逻辑删除下的更新
* <p>
* ==> Preparing: UPDATE sys_user SET name=? WHERE id=? AND deleted=0
* ==> Parameters: 逻辑删除测试(String), 25(Integer)
* <p>
* 注意从sql语句上看也是添加了deleted=0的
*/
@Test
public void test03() {
int row = sysUserMapper.updateById(new SysUser().setId(25).setName("逻辑删除测试"));
System.out.println("受影响行数=" + row);
} /**
* 逻辑删除下的新增
* ==> Preparing: INSERT INTO sys_user ( age, name ) VALUES ( ?, ? )
* ==> Parameters: 18(Integer), 新增测试(String)
* <== Updates: 1
* 注意从sql语句来看,在添加的时候并没有帮我们自动添加deleted=0字段的值,
* 所有在实际生产中最佳的作法是在数据库设置默认值为0
*/
@Test
public void test04() {
int row = sysUserMapper.insert(new SysUser().setName("新增测试").setAge(18));
System.out.println("受影响行数=" + row);
}
}
3.自动填充
第一步:注解填充字段 @TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!
/**
* 表示创建时自动填充
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private Date createTime;
/**
* 表示更新时自动填充
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
第二步:自定义实现类 MyMetaObjectHandler

package com.ldp.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component; import java.util.Date; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 12/14 8:03
* @description
*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler { @Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", () -> new Date(), Date.class); // 起始版本 3.3.3(推荐)
} @Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", () -> new Date(), Date.class); // 起始版本 3.3.3(推荐)
}
}
第三步:测试

package com.ldp.demo01; import com.ldp.entity.SysUser;
import com.ldp.mapper.SysUserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 12/14 8:10
* @description <p>
* 自动填充
* </p>
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test12FieldFill {
@Autowired
private SysUserMapper sysUserMapper; /**
* 新增时自动填充
* <p>
* ==> Preparing: INSERT INTO sys_user ( age, name, create_time ) VALUES ( ?, ?, ? )
* ==> Parameters: 18(Integer), 自动填充(String), 2020-12-14 19:55:36.065(Timestamp)
* <== Updates: 1
*/
@Test
public void test01() {
int row = sysUserMapper.insert(new SysUser().setName("自动填充").setAge(18));
System.out.println("受影响行数=" + row);
} /**
* 更新时自动填充
* <p>
* ==> Preparing: UPDATE sys_user SET name=?, update_time=? WHERE id=? AND deleted=0
* ==> Parameters: 更新自动填充(String), 2020-12-14 19:56:16.539(Timestamp), 25(Integer)
* <== Updates: 1
*/
@Test
public void test02() {
int row = sysUserMapper.updateById(new SysUser().setId(25).setName("更新自动填充"));
System.out.println("受影响行数=" + row);
}
}
4.乐观锁
实现原理:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
具体实现
第一步:数据库和java实体添加字段version,并在实体上添加注解@Version
/**
* 乐观锁
*/
@Version
private Integer version;
第二步:注册乐观锁插件

package com.ldp.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 12/06 4:45
* @description
*/
@Configuration
public class MybatisPlusConfig {
/**
* 乐观锁配置
*
* @return
*/
@Bean
public MybatisPlusInterceptor optimisticLockerInnerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
} @Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
第三步:测试

package com.ldp.demo01; import com.ldp.entity.SysUser;
import com.ldp.mapper.SysUserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 12/14 9:40
* @description
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test13Version {
@Autowired
private SysUserMapper sysUserMapper; /**
* 乐观锁测试
* ==> Preparing: UPDATE sys_user SET version=?, name=?, update_time=? WHERE id=? AND version=? AND deleted=0
* ==> Parameters: 8(Integer), 乐观锁测试(String), 2020-12-14 22:04:15.04(Timestamp), 12(Integer), 7(Integer)
* <== Updates: 1
* 注意观察sql,查询出来的version=7,在更新的时候将session版本设置为8
*/
@Test
public void test01() {
SysUser sysUser = sysUserMapper.selectById(12); int row = sysUserMapper.updateById(
new SysUser()
.setId(sysUser.getId())
.setName("乐观锁测试")
.setVersion(sysUser.getVersion())
);
System.out.println("受影响行数=" + row);
}
}
mybatis-plus系统化学习教程:https://www.cnblogs.com/newAndHui/p/14141950.html
完美!
mybatis-plus之逻辑删除&自动填充&乐观锁的更多相关文章
- mybatis配置的逻辑删除不好使了
在使用mybatisplus中,可使用逻辑删除.案例中,使用mybatisplus逆向生成model,使用delete_status为识别逻辑删除字段. springboot 中配置启动逻辑删除 my ...
- mybatis plus 增删改自动填充字段值
说明 本文实现以下需求效果 创建数据时自动填充 createUserId 和 createTime 更新数据时自动填充 updateUserId 和 updateTime(每次修改都自动填充新的 up ...
- Yii2.0的乐观锁与悲观锁(转)
原文:Yii2.0的乐观锁与悲观锁 Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能. 在并发环境下,有可能会出现脏读(Dirty Read).不可重 ...
- Mysql锁机制--悲观锁和乐观锁
1. 悲观锁简介 悲观锁(Pessimistic Concurrency Control,缩写PCC),它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实 ...
- 25.partial update内置乐观锁并发控制
主要知识点 (1)partial update内置乐观锁并发控制 (2)retry_on_conflict post /index/type/id/_update?retry_on_confl ...
- mybatis 乐观锁和逻辑删除
本篇介绍easymybatis如配置乐观锁和逻辑删除. 乐观锁 easymybatis提供的乐观锁使用方式跟JPA一样,使用@Version注解来实现.即:数据库增加一个int或long类型字段ver ...
- mybatis_plus实现自动填充和逻辑删除
自定义填充 设置自定义填充规则 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.i ...
- Mybatis plus通用字段自动填充的最佳实践总结
在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...
- 小书MybatisPlus第9篇-常用字段默认值自动填充
本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...
- 【mybatis-plus】分页、逻辑删除
通过mybatis-plus实现分页,也是很简单,插件大法. 一.分页 1.配置分页插件 把分页的插件也配置到统一的配置类里: @Configuration // 配置扫描mapper的路径 @Map ...
随机推荐
- WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理
1.官网下载并配置 下载MinIO Serve地址(不需要安装,放在目录就行) https://dl.min.io/server/minio/release/windows-amd64/minio.e ...
- windows10下安装mysql8.0.25
只是安装一个练习用的库,所以基本配置没有什么好说的. # this is a config file for mysql [mysqld] # 设置3306端口 port=7799 # 设置mysql ...
- shell 编程简记
1. 环境变量 环境变量是指操作系统中记录一些配置信息的变量,这些变量在不同的程序之间共享,可以被操作系统或者 shell 脚本读取和修改. 环境变量也可以类比为各个语言中的全局变量,其作用域是全局的 ...
- Winform程序获取不到windows系统下本机的配置信息(解决)
无法获取到本地的mac地址的原因: 本地网络问题 相关服务被禁用 wmi配置错误或者失败. 本文着力于第三种问题的解决:可以参考 无法获取本地mac,如果是wmi服务没有打开的问题.可以使用运行wmi ...
- 第三方App与Termux命令建立IO通道
目录 前言 一.Android 进程间通信(IPC) 二.Netcat 网络瑞士军刀 三.第三方 App 与 Termux 建立 TCP/Socket 通信 四.应用:调用 LSP 语言服务器 参见 ...
- Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed
社区中有两个流行的 零冗余优化器(Zero Redundancy Optimizer,ZeRO) 算法实现,一个来自 DeepSpeed,另一个来自 PyTorch.Hugging Face Acce ...
- 案例源码公开!分享瑞芯微RK3568J与FPGA的PCIe通信案例,嵌入式必读!
ARM + FPGA架构有何种优势 近年来,随着中国新基建.中国制造2025的持续推进,单ARM处理器越来越难满足工业现场的功能要求,特别是能源电力.工业控制.智慧医疗等行业通常需要ARM + F ...
- 【资料分享】RK3568开发板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)
1 开发板简介 创龙科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55国产工业评估板,每核主频高达1.8GHz/2.0GHz,由核心板 ...
- python执行shell并获取结果
在Python中执行Shell命令并获取其结果,通常可以使用subprocess模块.这个模块允许我们启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码.下面是一个详细的示例,展示了如 ...
- Loggie Geek Camp 火热启动,社区大神带你玩开源
由开源构建的协作模式,正成为描绘数字蓝图.创造美好未来的主航道,中国工商银行.阿里云等组织已经在网易数帆"架构开发.内核开源"理念中与后者达成合作,来自华为.阿里云.中国移动.eB ...