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. babel 基础概念 & 从零到一写一个 babel 插件

    babel 基础概念 简单来说,做语法转换兼容的, 复杂一点的说,babel可以将我们写的 ES6+ 的Javascript语法转换为向后兼容的语法,以便能够在旧版本的浏览器或者其他环境运行. bab ...

  2. 高德解析城市的分析,根据高德的经纬度获取城市cityCode

    高德解析城市的分析,根据高德的经纬度获取城市cityCode http://restapi.amap.com/v3/geocode/regeo?output=json&location=110 ...

  3. Thread的join方法demo

    Thread的join方法demo /** * 关于join官方的解释是 Waits for this thread to die. 也就是等待一个线程结束. */ public class Thre ...

  4. 【译】向您介绍改版的 Visual Studio 资源管理器

    随着最近 Visual Studio 的资源管理器的改进,开发人员将得到一种全新的享受!我们非常激动地宣布重新设计的 Visual Studio 资源管理器,相信我们,它将改变游戏规则. 在 Visu ...

  5. java关于json的一些问题

    今天重写代码的时候,发现了一个异常:java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntim ...

  6. php不使用Office包实现上万条数据导出表格

    经过上传客户要求主副表迁出,又提出可以将某张表的数据导出excel,听着很简单,实际看数据表发现上万条数据,并且需要关联表查询相关字段,导出的表格才可以被客户看明白. 要是使用office包目前后台内 ...

  7. P2045 方格取数加强版题解

    题目链接:P2045 方格取数加强版 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目: 出一个 n*n 的矩阵,每一格有一个非负整数 A{i,j}且A{i,j} <=10 ...

  8. 深度解读昇腾CANN多流并行技术,提高硬件资源利用率

    本文分享自华为云社区<深度解读昇腾CANN多流并行技术,提高硬件资源利用率>,作者:昇腾CANN. 随着人工智能应用日益成熟,文本.图片.音频.视频等非结构化数据的处理需求呈指数级增长,数 ...

  9. mermaid语法画图

    mermaid 脚本语言 graph TB 从上到下 graph BT 从下到上 graph RL 从右到左 graph LR 从左到右 graph LR; A001-->B001; graph ...

  10. ubuntu podman相关

    前言 记录podman的安装.配置以及一些常用操作,会不定时更新: 正文 1. podman 安装以及配置 ubuntu 安装 podman sudo apt update sudo apt inst ...