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

yizhihongxing

当我们向数据库中插入一条记录或更新一条记录时,往往需要记录一些额外的信息,例如创建时间、更新时间、创建人和更新人等,在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完成字段自动填充的完整攻略,希望能对你有所帮助。

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

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

相关文章

  • pxcook(像素大厨)

    PxCook(像素大厨)攻略 PxCook(像素大厨)是一款设计师必备的UI设计工具,它可以帮助设计师快速生成设计稿的标注、切图、交互等工作,提高设计率。下面是PxCook的完整攻略,包括安装、使用和示例说明。 安装 PxCook支持Windows和Mac系统,可以在官网下载安装包进行安装。安装完成后,打开PxCook,输入注册码或使用试用版即可开始使用。 …

    other 2023年5月5日
    00
  • JavaScript正则表达式的分组匹配详解

    JavaScript正则表达式的分组匹配详解 正则表达式是一种强大的工具,用于在字符串中进行模式匹配和搜索。JavaScript中的正则表达式支持分组匹配,这使得我们可以更精确地匹配和提取字符串中的特定部分。 1. 分组匹配的基本语法 在JavaScript中,使用圆括号来创建一个分组。分组可以包含一个或多个字符,也可以包含其他正则表达式元字符。下面是一个基…

    other 2023年7月28日
    00
  • ARM汇编解决阶乘及大小写转换的问题

    ARM汇编解决阶乘问题的攻略 问题描述 阶乘是指将一个正整数 n 与小于等于 n 的所有正整数相乘的结果。例如,5的阶乘为 5! = 5 * 4 * 3 * 2 * 1 = 120。我们的目标是使用ARM汇编语言编写一个程序,计算给定正整数的阶乘。 解决方案 下面是一个使用ARM汇编语言解决阶乘问题的示例程序: .global _start .section…

    other 2023年8月18日
    00
  • 关于android:panic:找不到avd系统路径。

    当我们在Android Studio中创建AVD并尝试启动模拟器时,可能会遇到“android:panic找不到avd系统路径”的错误。这个错误通常是由于AVD的系统路径设置不正确或AVD文件损坏导致的。 以下是一些可能有用的信息和建议: 什么是AVD AVD(Android Virtual Device)是Android开发中的一个重要概念,它是一个虚拟的…

    other 2023年5月9日
    00
  • Android编程自定义组件实例详解

    Android编程自定义组件实例详解 什么是自定义组件 自定义组件是指在 Android 中自己定义一个组件(View),并通过布局文件或代码使用这个组件,它不同于系统提供的常用组件,例如Button、TextView等。自定义组件可以根据需求自由定义功能和样式,扩展系统组件无法完成的功能。 自定义View的步骤 自定义View的基本步骤如下: 继承系统提供…

    other 2023年6月27日
    00
  • 【转】winrar命令行详解

    【转】winrar命令行详解 WinRAR是一个强大的文件压缩、解压缩软件,常常被用于在Windows系统中对文件进行压缩、备份和归档。除了通过图形界面使用WinRAR,还可以通过命令行来使用它提供的功能。本文将详细解释WinRAR的命令行参数及其用法。 WinRAR命令行用法 WinRAR的命令行用法如下: WinRAR [<命令>] -[&l…

    其他 2023年3月28日
    00
  • 【WPF】无边框窗体

    【WPF】无边框窗体 WPF是Windows Presentation Foundation的简称,是Microsoft公司提供的一项界面技术。使用WPF可以创建出非常漂亮的应用程序界面,而其中一个重要的功能就是无边框窗体。 无边框窗体可以让我们的应用程序看起来更加美观,而且可以自由的设计窗体的样式,比如说我们可以将窗体改成圆角的形状,或者是添加一张图片作为…

    其他 2023年3月28日
    00
  • C语言中的常量详解

    C语言中的常量详解 常量是指在程序中不可以被改变的值,C语言中有很多种类型的常量,本文将对常量进行详细介绍,包括常量的类型、定义常量的方法以及使用常量的注意事项。 常量的类型 C语言中常量的类型有如下几种: 整型常量:整型常量就是整数常量,可以是十进制、八进制或十六进制表示。 实型常量:实型常量也就是浮点型常量,包括单精度浮点型和双精度浮点型。例如:3.14…

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