MyBatis-Plus 自动填充功能

MyBatis-Plus(MP) 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间更新时间 字段的自动填充,帮助开发者在处理数据时更加高效,减少人为错误。

本文将介绍 MyBatis-Plus 自动填充功能 的概念、实现步骤、场景应用以及如何配置和自定义填充规则。


1. 自动填充的概念

自动填充功能指的是,当执行 插入(INSERT)更新(UPDATE) 操作时,某些字段可以由 MyBatis-Plus 自动赋值,无需开发者手动提供。这些字段通常是一些系统字段,比如:

  • 创建时间:记录实体对象的创建时间。
  • 更新时间:记录实体对象的最后修改时间。

自动填充通过 字段注解 配合 MetaObjectHandler 实现,可以自动为某些字段设置默认值,避免重复的代码逻辑。


2. 实现自动填充的步骤

要实现 MyBatis-Plus 的自动填充功能,通常需要以下几个步骤:

2.1 步骤 1:在实体类中标注自动填充字段

在实体类中,使用 MyBatis-Plus 提供的 @TableField 注解,指定需要自动填充的字段,并设置 fill 属性。

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;import java.time.LocalDateTime;public class User {@TableId(value = "id", type = IdType.AUTO)private Long id;private String name;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;// Getters and Setters
}
  • @TableField(fill = FieldFill.INSERT):表示在插入数据时自动填充字段,如 createTime 字段在插入时自动赋值。
  • @TableField(fill = FieldFill.INSERT_UPDATE):表示在插入和更新时都会自动填充字段,如 updateTime 字段。

2.2 步骤 2:实现 MetaObjectHandler 接口

MyBatis-Plus 通过 MetaObjectHandler 接口来实现字段的自动填充功能。开发者需要实现该接口,并重写 insertFillupdateFill 方法。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时自动填充@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 自动填充创建时间this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 自动填充更新时间}// 更新时自动填充@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 自动填充更新时间}
}

在这个实现中:

  • insertFill:在插入操作时自动填充字段,例如将当前时间赋值给 createTimeupdateTime 字段。
  • updateFill:在更新操作时自动填充字段,通常只会更新 updateTime 字段。

2.3 步骤 3:注册 MetaObjectHandler

MetaObjectHandler 接口的实现类需要通过 @Component 注解标记为 Spring Bean,这样 Spring Boot 会自动扫描并注入到 MyBatis-Plus 中。

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {// 同上
}

3. 自动填充的场景应用(创建时间、更新时间)

3.1 创建时间(createTime

创建时间 字段通常在数据插入时自动填充。它记录了数据创建的时间,通常使用 LocalDateTime 类型存储。

实现示例

在实体类中,我们使用 @TableField(fill = FieldFill.INSERT) 来确保插入数据时自动填充 createTime 字段。

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

MetaObjectHandler 中,我们设置 insertFill 方法自动填充当前时间:

@Override
public void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}

3.2 更新时间(updateTime

更新时间 字段通常在数据更新时自动填充,记录数据最后一次修改的时间。updateTime 字段需要通过 @TableField(fill = FieldFill.INSERT_UPDATE) 注解来进行配置,使得在插入和更新时都能自动填充。

实现示例

在实体类中,我们使用 @TableField(fill = FieldFill.INSERT_UPDATE) 来确保插入和更新时自动填充 updateTime 字段。

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

MetaObjectHandler 中,我们设置 updateFill 方法自动填充当前时间:

@Override
public void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}

3.3 自动填充的效果

通过上述配置,在执行插入和更新操作时,MyBatis-Plus 会自动为 createTimeupdateTime 字段填充当前时间,无需开发者显式赋值。

User user = new User();
user.setName("John");
userService.save(user);  // 自动填充 createTime 和 updateTime

4. 配置与自定义填充规则

4.1 配置自动填充字段

在 MyBatis-Plus 中,我们可以通过 @TableField 注解的 fill 属性来指定需要自动填充的字段。当执行插入或更新操作时,Spring 会自动为这些字段填充值。

示例:配置自动填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

4.2 自定义填充规则

如果需要自定义填充规则,例如在创建时使用自定义的时间格式或设置特定的字段值,可以在 MetaObjectHandler 中进行实现。

示例:自定义填充规则
@Override
public void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());  // 自动填充当前时间this.strictInsertFill(metaObject, "status", Integer.class, 1);  // 自定义填充规则:status 默认值为 1
}

在此示例中,我们不仅自动填充 createTime 字段,还将 status 字段的默认值设置为 1


5. 总结

  • 自动填充功能 是 MyBatis-Plus 的一项强大特性,能够减少手动设置系统字段的工作,提升开发效率。
  • 通过 @TableField 注解中的 fill 属性,开发者可以轻松配置需要自动填充的字段,如 创建时间更新时间
  • 自定义填充规则 允许开发者在插入和更新时根据需求设置字段的默认值,进一步增强了灵活性。
  • 使用 MetaObjectHandler 接口,开发者可以灵活控制自动填充的字段,在 insertFillupdateFill 方法中定义自动填充规则。

通过 MyBatis-Plus 提供的自动填充功能,开发者可以更加高效地进行数据处理,减少代码冗余,并确保系统字段的一致性和正确性。 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

final 关键字在不同上下文中的用法及其名称

1. final 变量 名称:final 变量(常量)。 作用:一旦赋值后,值不能被修改。 分类: final 实例变量:必须在声明时或构造函数中初始化。 final 静态变量:必须在声明时或静态代码块中初…

springboot项目部署脚本

Springboot部署脚本 该脚本可用于jenkins自动执行,具有以下功能 适配所有以内嵌tomcat容器springboot项目jar包可根据参数选择环境,基于profiles可自动识别并关闭已存在进程第一个参数是指定jar包所在绝对路径(该路径下必须有且仅有一个.jar文件) 第二…

向量数据库milvus部署

官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单,这里说一下遇到的问题 一:Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …

【密码学实战】Java 实现 SM2 国密算法(签名带id、验签及 C1C3C2 加密解密)

前言 SM2是中国国家密码管理局发布的椭圆曲线公钥密码算法标准(GB/T 32918),属于国密算法体系。与RSA和ECDSA相比,SM2在相同安全强度下密钥更短、计算效率更高。本文将介绍如何在Java中实现SM2的密钥生成、数字签名、验签、加密及…

网络原理---TCP/IP

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

【大语言模型笔记进阶一步】提示语设计学习笔记,跳出框架思维,自己构建提示词

一、大语言模型应用场景 1. 文本生成 文本创作: 诗歌故事,剧本,推文帖子 摘要与改写: 长文本摘要与简化,多语言翻译与本地化 结构化生成: 表格,根据需求生成代码片段,API文档生成…

Unity XR-XR Interaction Toolkit开发使用方法(十一)组件介绍(XR Interactable)

目录 一、插件介绍 二、主要组件 XR Interaction Manager XR Controller XR Interactor XR Direct Interactor XR Ray Interactor XR Socket Interactor XR Gaze Interactor XR Interaction Group 三、XR Interactable 1、组件介绍 2、核心功能与特点 交互类型支…

Spring Boot spring-boot-maven-plugin 参数配置详解

一 spring-boot-maven-plugin 插件的5个Goals spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin;重新打包存在的jar或者war包从而使他们可以在命令行使用…

eMMC安全简介

1. 引言 术语“信息安全”涵盖多种不同的设计特性。一般而言, 信息安全是指通过实践防止信息遭受未经授权的访问、使用、披露、中断、篡改、检查、记录或销毁。 信息安全的三大核心目标为 机密性(Confidentiality)、完整性(Integr…

Python 数据结构 2.时间复杂度和空间复杂度

Life is a journey —— 25.2.28 一、引例:穷举法 1.单层循环 所谓穷举法,就是我们通常所说的枚举,就是把所有情况都遍历了的意思。 例:给定n(n ≤ 1000)个元素ai,求其中奇数有多少个 判断一…

FFmpeg-chapter3-读取视频流(原理篇)

ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…

面试(进阶) —虚拟列表在什么场景使用,如何实现?

面试(进阶) —虚拟列表在什么场景使用,如何实现? 在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中,不仅会导致页面加载缓慢,还可能占用大量内存&#x…

Linux Mem -- 关于AArch64 MTE功能的疑问

目录 1.虚拟地址和物理地址映射完成后,才可以设置虚拟地址对应的memory tag ? 2.各种memory allocator中的address tag从哪来,怎么产生? 2.1 vmalloc allocator 2.2 slub分配器 2.3 用户可以指定IRG指令产生的address tag 3.kasan…

python-leetcode-颜色分类

75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…

【江科大STM32】TIM输出比较(学习笔记)

本章图片文字内容也为重要知识&#xff0c;请马住&#xff01; 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

飞算 JavaAI 如何让微服务开发快人一步?

在当今竞争激烈的软件开发领域&#xff0c;微服务架构因其灵活性和可扩展性备受青睐。然而&#xff0c;微服务开发过程复杂&#xff0c;从需求分析到最终代码实现&#xff0c;每个环节都需要耗费大量时间和精力。飞算 JavaAI 的出现&#xff0c;犹如一道曙光&#xff0c;为开发…

Python—Excel全字段转json文件(极速版+GUI界面打包)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…

2025年光电科学与智能传感国际学术会议(ICOIS 2025)

重要信息 官网&#xff1a;www.ic-icois.org 时间&#xff1a;2025年3月14-16日 地点&#xff1a;中国-长春 简介 2025年光电科学与智能传感国际学术会议&#xff08;ICOIS 2025&#xff09;将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…