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 ...
随机推荐
- 字符数组数据映射转换到实体对象model注解方式 demo
1.model对象 public class UserModel { @ColumnAnnotation(index=0) private String username; @ColumnAnnota ...
- SQL索引优化,菜单列表优化
SQL索引优化,菜单列表优化 现象:在系统中几个数据量大的列表页面,首次进入页面未增加筛选条件,导致进入的列表查询速度非常慢.分析:通过SQL查看,是做了count求和查询,然后根据总的记录数来做分页 ...
- Java正则表达式语法及简单示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestMatcher { public st ...
- Netty(三)Netty模型
1. Netty模型 Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor. 简版图: 说明: BossGroup线程维护Selector ...
- 【Autoware】Autoware安装教程
此篇主要是从自己的csdn copy 在博客园上备份一下哈~ 前提:大家需要换源[软件源和pip源]:git clone的时候走博主给的Gitee的链接吧 不然得等个十万年... 如果想看最终是啥样的 ...
- 创龙科技位居头版,2023深圳elexcon电子展为智能化赋能!
紧跟前沿技术应用及市场发展热点,elexcon2023聚焦三大展示板块:"嵌入式与AIoT展""电源与储能展""SiP与先进封装展",吸引了 ...
- url编码方式
url编码在线工具: http://tool.chinaz.com/tools/urlencode.aspx url编码:风景->%e9%a3%8e%e6%99%af 附HTTP请求过程: ht ...
- hadoop集群配置文件与功能对应解析
以三个节点的集群为例: 总括: nodemanager ,datanode --> slavesresourcemanager ----------> yarn namenode ...
- Elastic-Search 整理(二):高级篇
ES高级篇 集群部署 集群的意思:就是将多个节点归为一体罢了,这个整体就有一个指定的名字了 window中部署集群 - 了解 把下载好的window版的ES中的data文件夹.logs文件夹下的所有的 ...
- 微信小程序广告自动访问:让广告收益轻松翻倍的利器
微信小程序流量主挂机刷广告脚本/机器人/助手 在当下这个数字化飞速发展的时代,微信小程序已经成为商家推广和吸引流量的重要平台.然而,对于很多小程序流量主来说,如何最大化地利用广告资源.提升广告收益,却 ...