在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完成字段自动填充的完整攻略,希望能对你有所帮助。

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

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

相关文章

  • MySQL使用正则表达式去检索指定数据库字段

    MySQL使用正则表达式(Regular Expression)可以实现非常强大的字符串匹配功能。以下是MySQL使用正则表达式去检索指定数据库字段的完整攻略: 1. 创建正则表达式 在MySQL中,正则表达式可以使用REGEXP操作符或RLIKE操作符来匹配字符串。REGEXP相对更通用一些。要使用REGEXP操作符或RLIKE操作符,需要先创建一个正则表…

    other 2023年6月25日
    00
  • SpringEvent优雅解耦时连续两个bug的解决方案

    让我来详细解释一下”SpringEvent优雅解耦时连续两个bug的解决方案”。 简介 Spring Framework是广泛使用的Java应用框架之一,它提供了许多功能强大、易于使用且灵活的模块。其中,Spring的事件机制为应用程序提供了简单但强大的解耦方式,但在实际使用中,我们可能会遇到一些bug。 Bug 1: 重复处理事件 在某些情况下,我们可能会…

    other 2023年6月26日
    00
  • springboot项目如何在linux服务器上启动、停止脚本

    Spring Boot项目在Linux服务器上启动、停止脚本的完整攻略 以下是在Linux服务器上启动和停止Spring Boot项目的完整步骤: 启动脚本 创建一个新的Shell脚本文件,例如start.sh。 在脚本文件中添加以下内容: #!/bin/bash # 定义项目路径 PROJECT_DIR=/path/to/your/project # 进入…

    other 2023年10月13日
    00
  • 九度oj 题目1048:判断三角形类型

    九度oj 题目1048:判断三角形类型 题目描述 给定三条边,请你判断一下能不能组成一个三角形。 如果能组成三角形,你还需要告诉我们它的类型: 等边三角形 Equilateral Triangle 等腰三角形 Isosceles Triangle 直角三角形 Right Triangle 普通三角形 Common Triangle 不能构成三角形 Not A…

    其他 2023年3月28日
    00
  • 联想乐檬K3开发者选项模式怎么开启?

    以下是联想乐檬K3开发者选项模式开启的完整攻略: 第一步:进入设置界面 首先,我们需要进入手机设置界面。在桌面或应用列表中找到“设置”图标,点击进入。 第二步:找到关于手机 在设置界面中,我们需要找到关于手机的选项,并进入该选项。具体操作如下: 打开设置界面后,向下滑动,找到“关于手机”。不同手机品牌的设置界面可能有所不同,有些手机可能将“关于手机”选项放在…

    other 2023年6月26日
    00
  • vsco注册填写个人资料名称无效怎么办?vsco怎么注册账号?

    前提说明: VSco是一个非常受欢迎的照片处理与分享社交平台,用户可以在上面分享照片并用其提供的滤镜与调整功能进行美化。本攻略主要针对VSco注册填写个人资料名称无效的问题进行讲解。 访问官网并注册账号 首先,我们需要访问VSco官网 https://vsco.co/ 并通过右上角的“Sign Up”按钮注册账号。 注册时需要填写Email、用户名、密码、国…

    other 2023年6月27日
    00
  • Python封装数据库连接池详解

    以下是Python封装数据库连接池的完整攻略,包含两个示例说明: 1. 安装数据库连接池库 首先,确保已经安装了Python的数据库连接池库,例如pymysql或psycopg2。可以使用以下命令进行安装: pip install pymysql 2. 封装数据库连接池类 接下来,我们需要封装一个数据库连接池类,用于管理数据库连接的创建和释放。以下是一个示例…

    other 2023年10月18日
    00
  • 写给前端的nginx配置指南基于docker所有配置秒级运行(最新讲解)

    下面是详细讲解“写给前端的nginx配置指南基于docker所有配置秒级运行(最新讲解)”的完整攻略。 标题 介绍 这是一篇关于如何基于docker搭建nginx配置的指南。目的是让前端开发人员快速部署nginx,方便开发与测试。该指南适用于使用docker的新手。 步骤 安装docker 如果你还没有安装docker, 请前往Docker官网安装docke…

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