在MyBatisPlus中使用@TableField完成字段自动填充的操作

当我们向数据库中插入一条记录或更新一条记录时,往往需要记录一些额外的信息,例如创建时间、更新时间、创建人和更新人等,在MyBatisPlus中可以通过@TableField注解来完成这些字段的自动填充,具体步骤如下:

  1. 在实体类中定义需要自动填充的字段,并在字段上添加@TableField注解,指定填充类型和填充策略,如下所示:
public class User {

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime; // 创建时间

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime; // 更新时间

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateBy; // 更新人

    @TableField(fill = FieldFill.INSERT)
    private Long createBy; // 创建人

    // 省略其他属性和方法
}

其中,fill属性指定了填充类型,有三种类型可选:FieldFill.INSERT、FieldFill.UPDATE和FieldFill.INSERT_UPDATE,分别表示仅在插入时填充、仅在更新时填充和在插入和更新时均填充。填充策略可以在实体类中通过实现MetaObjectHandler接口进行定义。

  1. 在我们的Mapper接口中继承BaseMapper,并在注解中指定我们的实体类,如下所示:
@Mapper
public interface UserMapper extends BaseMapper<User> {

}
  1. 在我们的配置文件中进行配置,如下所示:
<!-- 配置自动填充 -->
<bean id="mybatisPlusAutoFillHandler" class="com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler">
    <property name="metaObjectHandler" ref="mybatisPlusMetaObjectHandler"/>
</bean>

<bean id="mybatisPlusMetaObjectHandler" class="com.baomidou.mybatisplus.extension.handlers.MetaObjectHandler">
    <property name="insertFill" value="com.example.MyMetaObjectHandler"/>
    <property name="updateFill" value="com.example.MyMetaObjectHandler"/>
</bean>

这里我们通过自定义MyMetaObjectHandler类实现了MetaObjectHandler接口,并在配置文件中指定了insertFill和updateFill属性的值为我们自定义的MyMetaObjectHandler类。

  1. 最后,在我们自定义的MyMetaObjectHandler类中实现需要自动填充的字段的逻辑,如下所示:
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now);
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now);
        User user = UserUtils.getCurrentUser();
        if (user != null) {
            this.strictInsertFill(metaObject, "createBy", Long.class, user.getId());
            this.strictInsertFill(metaObject, "updateBy", Long.class, user.getId());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        LocalDateTime now = LocalDateTime.now();
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now);
        User user = UserUtils.getCurrentUser();
        if (user != null) {
            this.strictUpdateFill(metaObject, "updateBy", Long.class, user.getId());
        }
    }
}

此处我们通过重写MetaObjectHandler接口中的insertFill和updateFill方法来实现自动填充的逻辑,比如创建时间和更新时间可以通过LocalDateTime.now()获取当前时间,创建人和更新人可以通过UserUtils.getCurrentUser()方法获取当前登录用户。

示例:

假设我们有以下两个实体类:

@Table(name = "tb_order")
@Getter
@Setter
public class Order {

    @TableId(type = IdType.AUTO)
    private Long id;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    private String goods;

    @TableLogic
    private Integer deleted;
}
@Table(name = "tb_order_detail")
@Getter
@Setter
public class OrderDetail {

    @TableId(type = IdType.AUTO)
    private Long id;

    private Long orderId;

    private String goods;

    private Integer amount;

    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
}

对于Order类,我们可以在该实体类中的createTime、updateTime字段上使用@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.UPDATE)注解来实现插入和更新时的自动填充。

对于OrderDetail类,我们可以在该实体类中的createTime、updateTime字段上使用@TableField(fill = FieldFill.INSERT)、@TableField(fill = FieldFill.UPDATE)注解来实现插入和更新时的自动填充。

注意,对于使用@TableField(fill = FieldFill.INSERT_UPDATE)注解的字段,需要在insert和update方法中都写入该字段,否则会出现填充不完整的情况。

以上就是在MyBatisPlus中使用@TableField完成字段自动填充的完整攻略,希望能对你有所帮助。

阅读剩余 63%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在MyBatisPlus中使用@TableField完成字段自动填充的操作 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • C++ 实现输入含空格的字符串

    当需要读取输入含空格的字符串时,使用C++的标准库中的getline方法可以实现。 使用getline方法的一般格式如下所示: getline(cin, str); 其中,cin是输入流对象,str是存储输入字符串的字符串变量。 下面是一个步骤清晰介绍如何实现输入含空格的字符串的攻略: 首先,需要包含iostream和string的头文件。 #include…

    other 2023年6月26日
    00
  • 深入了解C语言字符函数和字符串函数

    深入了解C语言字符函数和字符串函数攻略 字符函数 C语言中提供了一系列的字符函数,这些函数能够对单个字符进行处理。 常用的函数有: isalnum() 函数原型: int isalnum(int c); 函数作用:判断字符c是否为字母或数字,如果是返回非0,否则返回0。 示例: #include <ctype.h> #include <st…

    other 2023年6月20日
    00
  • JavaScript懒加载与预加载原理与实现详解

    下面是详细讲解: JavaScript懒加载与预加载原理与实现详解 什么是懒加载 懒加载是指延迟加载资源,也就是只加载当前用户所需要的资源,而不是在页面初始加载时全部加载的方式。这样可以减少页面的加载时间,提高用户的体验。 懒加载的原理与实现 懒加载的原理是通过判断页面的滚动位置来决定是否加载资源。具体实现过程如下: 在页面中引入 jQuery 库,并编写一…

    other 2023年6月25日
    00
  • Android统一依赖管理的三种方式总结

    下面是将“Android统一依赖管理的三种方式总结”做完整讲解的攻略: Android统一依赖管理的三种方式总结 在Android开发中,依赖库是非常重要的,它们可以帮助我们更快地完成项目并提高代码的质量。但在Android项目中使用了越来越多的第三方类库,不同的模块和版本之间的依赖关系变得更加复杂,需要一个好的依赖管理工具才能够有效的管理这些依赖关系。这篇…

    other 2023年6月27日
    00
  • 谈一谈js中的执行环境及作用域

    谈一谈JS中的执行环境及作用域 执行环境(Execution Context)和作用域(Scope)是JavaScript中重要的概念,它们决定了变量和函数的可访问性和生命周期。本文将详细讲解这两个概念,并提供两个示例来说明。 执行环境 执行环境是JavaScript代码执行的环境,它包含了变量、函数和其他数据的存储空间。每当执行一段JavaScript代码…

    other 2023年8月19日
    00
  • 主控端与受控端升级的常见问题

    当进行主控端与受控端升级时,常会遇到一些问题。下面我们就来看看这些问题的解决方案。 主控端升级的常见问题 问题一:主控端升级失败 主控端升级失败可能是由于下载的升级包不完整或者网络不稳定导致。解决方案是重新下载升级包,或者换个网络环境再进行升级。 问题二:主控端升级后无法登录 如果主控端升级后无法登录,可能是由于升级后出现了版本不匹配问题。解决方案是在主控端…

    other 2023年6月27日
    00
  • WinForm自定义控件应用实例

    下面是 “WinForm自定义控件应用实例” 的完整攻略。 一、前置知识 在了解 WinForm 自定义控件应用实例之前,需要有以下基础知识: C# 语言基础 .NET Framework 知识 WinForm 窗体应用程序开发基础 二、自定义控件的基本概念 WinForm 中的自定义控件,顾名思义,就是用户自行创建的控件。可以将其看做是一种新型的控件,它可…

    other 2023年6月25日
    00
  • 浅析Windows 嵌入python解释器的过程

    下面我来详细讲解一下“浅析Windows 嵌入python解释器的过程”的完整攻略。 一、简介 在某些情况下,我们需要在C++程序中使用Python脚本,此时需要将Python解释器嵌入到C++程序中。本文将从头开始介绍如何将Python解释器嵌入到Windows C++程序中。 二、环境搭建 下载Python解释器:至官网下载最新版的Python解释器。 …

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部