一、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语句。

到此这篇关于MyBatis-Plus逻辑删除和字段自动填充的实现的文章就介绍到这了,更多相关MyBatis-Plus逻辑删除和字段自动填充内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

MyBatis-Plus逻辑删除和字段自动填充的实现的更多相关文章

  1. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. MyBatis-Plus乐观锁插件的用法小结

    乐观锁很乐观,对任何事情都保持着一个乐观的态度,认为别人不会修改数据,所以不会上锁,只是在更新数据的时候,去判断这条数据有没有被别人修改过,这篇文章主要介绍了MyBatis-Plus乐观锁插件的用法,需要的朋友可以参考下

  4. Mybatis-Plus主键生成策略的方法

    本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. mybatis-plus自带QueryWrapper自定义sql实现复杂查询实例详解

    MyBatis-Plus是一个MyBatis(opens new window)的增强工具,在 MyBatis的基础上只做增强不做改变,MyBatis可以无损升级为MyBatis-Plus,这篇文章主要给大家介绍了关于mybatis-plus自带QueryWrapper自定义sql实现复杂查询的相关资料,需要的朋友可以参考下

  6. Mybatis-plus:${ew.sqlselect}用法说明

    这篇文章主要介绍了Mybatis-plus:${ew.sqlselect}用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. 一文详解Mybatis-plus的介绍与使用

    Mybatis-Plus 是 MyBatis 的一个增强工具,专门针对于传统MyBatis开发中sql需要手动进行映射配置繁琐缺点的一款框架技术。本文将为大家详细讲讲Mybatis-plus的介绍与使用,感兴趣的可以了解一下

  8. MyBatis-Plus找不到Mapper.xml文件的几种解决方法

    mybatis-plus今天遇到一个问题,就是mybatis 没有读取到mapper.xml 文件,所以下面这篇文章主要给大家介绍了关于MyBatis-Plus找不到Mapper.xml文件的几种解决方法,需要的朋友可以参考下

  9. Mybatis-Plus字段策略FieldStrategy的使用

    本文主要介绍了Mybatis-Plus字段策略FieldStrategy的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. mybatis-plus 新增/修改如何实现自动填充指定字段

    这篇文章主要介绍了mybatis-plus 新增/修改实现自动填充指定字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部