MyBatis-Plus逻辑删除和字段自动填充的实现
作者:Charge8 发布时间:2023-01-08 03:45:54
一、ID生成策略
1、使用@TableId注解
@TableId注解:主键注解
使用位置:实体类主键字段。
@Data
@ToString
@TableName("t_user")
public class UserDO {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
...
}
2、全局ID生成策略
使用注解是针对一个POJO的。如果我们全局使用同样的 ID生成策略。那我们可以在全局配置文件中配置。就不需要在每个 POJO上使用 主键@TableId注解了。
mybatis-plus:
global-config:
db-config:
id-type: auto
二、逻辑删除
官方文档-逻辑删除:https://baomidou.com/pages/6b03c5/
逻辑删除: 通常会在表里添加一个逻辑删除的字段,比如 enabled(1默认有效,0无效)。
MyBatis-Plus会在用户调用删除操作时将数据修改 UPDATE set enabled = 0, 在查询的时候会自动拼接只查 where enabled=1的数据。
1、全局配置
在YAML配置文件中添加全局配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
不推荐使用全局配置,使用 @TableLogic注解
见名知意。
2、使用@TableLogic注解
@TableLogic注解:表字段逻辑处理注解(逻辑删除)。
1)表中添加 enabled字段
ALTER TABLE `t_user`
ADD COLUMN `enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否有效(1-有效,0-无效)';
2)在POJO实体类字段上加上 @TableLogic注解。
/**
* 代表逻辑删除
* value:逻辑未删除值
* delval:逻辑删除值
*/
//@TableLogic
@TableLogic(value = "1", delval = "0")
private Integer enabled;
到此,逻辑删除就配置好了,接下来测试一下删除和查询。
@Test
public void testRemoveById() {
System.out.println(("----- removeById method test ------"));
boolean remove = userService.removeById(12L);
System.out.println("remove = " + remove);
}
@Test
public void testGetById() {
System.out.println(("----- getById method test ------"));
UserDO userDO = userService.getById(12L);
System.out.println("userDO = " + userDO);
}
三、字段自动填充
官方文档-自动填充功能:https://baomidou.com/pages/4c6bcf/
在项目中,一般我们都会定义 create_time和update_time字段。针对这两个字段,每次CRUD操作时,我们都需要手动赋值或者数据库默认值。MyBatis-Plus提供了给字段自动填充数据的功能。
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
使用 MyBatis-Plus的自动填充功能,需要指定 fill类型,并且指定 自定义填充信息 MetaObjectHandler。
1、指定字段自动填充
在POJO中,指定 create_time和update_time字段为自动填充。
@TableField(value = "create_time", fill = FieldFill.INSERT)
//@TableField(value = "create_time")
private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
//@TableField(value = "update_time")
private Date updateTime;
fill类型的值如下:
注意:
如果指定了 fill为后面三个时,必须显示设置值。否则为报错:Column 'create_time' cannot be null。如果我们不显示指定设置值,我们必须定义 MetaObjectHandler。
2、自定义MetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
/**
*方法的四个个参数:<br/>
* MetaObject metaObject: metaObject对象 <br/>
* String fieldName:POJO字段 <br/>
* Class<T> fieldType:字段类型 <br/>
* E fieldVal:自动填充的字段值 <br/>
*/
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
//this.setFieldValByName("createTime", new Date(),metaObject);
// 或者
this.strictInsertFill(metaObject, "updateTime", () -> new Date(), Date.class);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictInsertFill(metaObject, "updateTime", () -> new Date(), Date.class);
}
}
3、测试
1)测试保存
@Test
public void testSave() {
System.out.println(("----- save method test ------"));
UserDO userDO = new UserDO();
userDO.setUserName("赵云save fill");
userDO.setAge(20);
userDO.setHeight(1.88);
userDO.setEmail("zhaoyun@123.com");
boolean save = userService.save(userDO);
System.out.println("save = " + save);
System.out.println("userDO = " + userDO);
}
2)测试删除
@Test
public void testRemoveById() {
System.out.println(("----- removeById method test ------"));
boolean remove = userService.removeById(111L);
System.out.println("remove = " + remove);
}
四、执行SQL分析打印
生产环境不推荐使用,开发环境可以使用。
官方文档-自动填充功能:https://baomidou.com/pages/833fab/
引入 p6spy依赖:
<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
1、添加 spy.properties配置文件
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
2、修改数据源配置
修改驱动类和 url的前缀。
spring:
## 数据源配置
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver # com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
url: jdbc:p6spy:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
username: root
password: 123456
3、测试查询
多了红色的部分,其实我们使用 MyBatisLogFormat插件也是可以得到真实执行的SQL语句。
来源:https://blog.csdn.net/qq_42402854/article/details/126207683


猜你喜欢
- 在两个Activity跳转时,由于第二个Activity在启动时加载了较多数据,就会在启动之前出现一个短暂的黑屏时间,解决这个
- 业务现象代码中有一部分代码多次嵌套循环和数据处理,执行速度很慢解决方案通过多线程1、启用多线程private final static Ex
- 本文研究的主要是JVM中的flag设置详解的相关内容,具体介绍如下。一、堆大小设置-Xmx3550m:设置JVM最大可用内存为3550M。-
- 错误示例,同一个类中使用异步方法:package com.xqnode.learning.controller;import com.fas
- 思路今天带大家实现一个上拉加载更多的ListView.GitHub传送门:PulmListView, 欢迎大家fork&&s
- 1、有状态的bean与无状态的bean有状态bean:每个用户有自己特有的一个实例,在用户的生存期内,bean保存了用户的信息,即有状态;一
- 找入口对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方
- 为什么需要协程?协程可以简化异步编程,可以顺序地表达程序,协程也提供了一种避免阻塞线程并用更廉价、更可控的操作替代线程阻塞的方法 &
- 理解函数式接口以及 Lambda表达式的发展过程任何接口,只包含唯一一个抽象方法,就是函数式接口/** * lambdab表达式的发展 */
- 下面通过代码给大家介绍c++ string insert() 函数,具体内容如下:basic_string& inser
- 本文实例讲述了C#之Expression表达式树,分享给大家供大家参考。具体实现方法如下:表达式树表示树状数据结构的代码,树状结构中的每个节
- 对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibern
- 一、前言Redis是一个NoSQL(非关系型数据库)数据库之一,key-value存储系统或者说是一个缓存键值对数据库,具有如下特性:基于内
- 本文实例为大家分享了Unity3d实现Flappy Bird的具体代码,供大家参考,具体内容如下一、小鸟在游戏中,小鸟并不做水平位移,而是通
- 最近遇到的一个场景,在一个被 @Transactional 注解的方法A中中调用了一个被 @Async 注解标记的方法B,由于方法B 在执行
- jpa多对多的属性查询第一:采用JPQL方式使用@Query拼接jpql语句完成多对多的查询;@query(SELECT User FROM
- 本文实例讲述了C#使用Ado.Net更新和添加数据到Excel表格的方法。分享给大家供大家参考。具体分析如下:微软NET提供了一个交互的方法
- 一、前言虽然jdk1.9版本已经问世,但是许多其他的配套设施并不一定支持jdk1.9版本,所以这里仅带领你配置jdk1.8。而jdk1.9的
- 引言因为写了不少 Spring Security 文章的缘故,所以总是有小伙伴来问松哥:按钮级别的权限怎么实现?甚至有一些看过 vhr 的小
- 本文实例讲述了java中Object类用法。分享给大家供大家参考。具体如下:1、Object类是所有java类的基类如果在类的声明中未使用e