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之逻辑删除&自动填充&乐观锁的更多相关文章

  1. mybatis配置的逻辑删除不好使了

    在使用mybatisplus中,可使用逻辑删除.案例中,使用mybatisplus逆向生成model,使用delete_status为识别逻辑删除字段. springboot 中配置启动逻辑删除 my ...

  2. mybatis plus 增删改自动填充字段值

    说明 本文实现以下需求效果 创建数据时自动填充 createUserId 和 createTime 更新数据时自动填充 updateUserId 和 updateTime(每次修改都自动填充新的 up ...

  3. Yii2.0的乐观锁与悲观锁(转)

    原文:Yii2.0的乐观锁与悲观锁 Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能. 在并发环境下,有可能会出现脏读(Dirty Read).不可重 ...

  4. Mysql锁机制--悲观锁和乐观锁

    1. 悲观锁简介 悲观锁(Pessimistic Concurrency Control,缩写PCC),它指的是对数据被外界修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实 ...

  5. 25.partial update内置乐观锁并发控制

    主要知识点     (1)partial update内置乐观锁并发控制 (2)retry_on_conflict post /index/type/id/_update?retry_on_confl ...

  6. mybatis 乐观锁和逻辑删除

    本篇介绍easymybatis如配置乐观锁和逻辑删除. 乐观锁 easymybatis提供的乐观锁使用方式跟JPA一样,使用@Version注解来实现.即:数据库增加一个int或long类型字段ver ...

  7. mybatis_plus实现自动填充和逻辑删除

    自定义填充 设置自定义填充规则 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.i ...

  8. Mybatis plus通用字段自动填充的最佳实践总结

    在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...

  9. 小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...

  10. 【mybatis-plus】分页、逻辑删除

    通过mybatis-plus实现分页,也是很简单,插件大法. 一.分页 1.配置分页插件 把分页的插件也配置到统一的配置类里: @Configuration // 配置扫描mapper的路径 @Map ...

随机推荐

  1. AES加密和解密,key需要32位

    AES加密和解密,key需要32位 package com.example.core.mydemo.sign; import org.apache.commons.codec.binary.Base6 ...

  2. MYSQL8.0-JSON函数简单示例-JSON_EXTRACT|JSON_VALUE|JSON_TABLE

    JSON类型在日常应用开发中,用得很少,个人通常用于存储常常变化的配置参数. 它适用于什么业务场景,不好说.就好像许多年前读到的一篇文章,说有个国外公司利用ORACLE的CLOB/BLOB管理一些信息 ...

  3. 天翼云centos7.6安装redis6.2.6

    以下部分的具体略: 1.wget获取源码 2.make 这里重点说下,如何使用 utils/install_server.sh脚本 使用install_service.sh添加服务 有了这个脚本,那么 ...

  4. 高通与At指令:基础概念

    背景 在某个新基线上移植AT指令,发现有问题,因此收集了这个系列的 文章 作为 这方面的知识补充. 原文作者:laozhuxinlu,本文有删改. AT指令在产线中是一类比较重要的问题, 一天没来得及 ...

  5. Linux驱动中的异步函数(aio_read和aio_write)

    Linux驱动中的异步函数(aio_read和aio_write) 我们可以在signal_handler使用了read和write函数处理设备文件的读写操作.然而这两个函数可以分别用aio_read ...

  6. 分享两个内置Google广告位的Typecho主题

    前言 很多项目的开始都是因为情怀和热爱,"为爱发电"是一件很值得尊敬的事情,然而大量"为爱发电"的项目最后却不得不因"难以为继"而被迫停服. ...

  7. 『vulnhub系列』Dripping-Blues-1

    『vulnhub系列』Dripping-Blues-1 下载地址: https://www.vulnhub.com/entry/dripping-blues-1,744/ 信息搜集: 使用nmap进行 ...

  8. AT_joisc2019_j 题解

    先考虑这个式子: \[\sum_{j=1}^{M} |C_{k_{j}} - C_{k_{j+1}}| \] 一定是在 \(C\) 有序时取到,具体证明很简单各位读者自己证明. 那么现在式子变成: \ ...

  9. Win10 下安装使用easyocr图片识别工具

    [前言] 最近在做图像识别相关的工作,找到了一个名为EasyOCR的pythoh 库. 使用过程中出现了一些问题,现做简单记录. [正文] 1. 安装EasyOCR 我用了最简单的方法:pip3 in ...

  10. 洛谷P1043

    [NOIP2003 普及组] 数字游戏 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前 ...