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. MySQL BETWEEN AND包含边界值

    select count(1) from table_a where my_date between '20230715' and '20230717'; 上面的SQL我们发现只统计了20230715 ...

  2. fs.1.10 ON rockeylinux8 dockerfile模式

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. rockeylinux8 docker上编译安装fs.1.10的流程记录,本文使用dockerfile模式. 环境 docker e ...

  3. 如何查询Windows10的激活时间等相关信息

    您可以按Windows+R,打开运行,运行:slmgr.vbs -dlv 命令可以查询到Windows的激活信息,包括:激活ID.安装ID.激活截止日期等:运行:slmgr.vbs -dli 命令可以 ...

  4. 日志之log4j2和springboot

    log4j2比logback好用. 现在之所有以spring采用logback,根据我个人的理解应该是某种非常特殊的理由.否则log4j2的性能比logback更好,且异步性能极好! 异步日志是log ...

  5. 海思SDK 学习 :002-实例代码分析

    背景 需要了解 海思HI35xx平台软件开发快速入门之背景知识,为了方便测试,还需要了解 海思SDK 的安装 知识 由于海思的应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作.同理,应用 ...

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

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

  7. 树莓派4B安装64位桌面版ubuntu20

    [准备] 硬件: 电脑.树莓派4B.显示器(hdmi线Micro HDMI转标准HDMI).鼠标.键盘.读卡器.TF卡.网线 软件:ubuntu20(x64桌面版).官方烧录工具Raspberry P ...

  8. Java子类是否能继承父类上的注解

    子类可以继承到父类上的注解吗? 在编写自定义注解时,可以通过指定@Inherited注解,申明自定义注解是否可以被继承:@Inherited只能实现类上的注解继承. 实现情况可细分为以下几种 未申明@ ...

  9. python使用flask框架生成excle返回前端(包含图片、表格、表头灰色、表格加边框)

    python使用flask框架生成excle文档,文档中包含图片和表格,其中表格要包含图片.表格.表头灰色.表格加边框,照片和表格不重叠. 逻辑:获得图片的高度,根据高度计算表格从第几行开始插入. 效 ...

  10. Profibus_DP转ModbusTCP网关模块接马保通讯案例

    某工业企业为了提高生产效率和管理水平,决定对其生产线进行智能化改造.在该项目中,利用巴图自动化Profibus_DP转ModbusTCP网关模块(BT-ETHPB20)连接了不同生产设备,实现了设备之 ...