Mybatis-Plus自动填充更新操作相关字段的实现
作者:honvin_ 发布时间:2022-01-14 20:43:01
标签:Mybatis-Plus,自动填充
在阿里开发手册的建表规约中有说明,数据库表中应该都要有create_time、update_time字段;那么在开发中,对于这些共有字段的处理应该要进行统一,这样就可以简化我们的开发过程。那么本文就对Mybatis-Plus中的字段自动填充进行记录。
场景介绍
在项目的数据表设计中,每张表都有create_id、create_time、update_id、update_time这四个字段,那么在Java应用中,针对新增和修改操作要对这四个字段进行相应的更改:
create_id、update_id要自动填充为当前登录的用户ID
create_time、update_time要自动填充为当前时间
下面说说代码实现:
自动填充处理器
需要实现Mybatis-Plus中的MetaObjectHandler接口
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import hw.topevery.basis.runtime.UserRuntime;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* 更新相关字段处理器
*
* @author whw
* @date 2020/1/3 16:41
*/
@Component
public class UpdateRelatedFieldsMetaHandler implements MetaObjectHandler {
/**
* 新增操作
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createId", String.class, getCurrentUserId());
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateId", String.class, getCurrentUserId());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
/**
* 更新操作
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateId", String.class, getCurrentUserId());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
/**
* 获取当前登录用户ID
*
* @return
*/
private String getCurrentUserId() {
return "当前登录用户ID";
}
}
Mybatis-Plus配置类
需要将处理器注入进Spring容器才会生效
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import hw.topevery.kunming.wapi.handler.UpdateRelatedFieldsMetaHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Mybatis-Plus配置类
*
* @author whw
* @date 2020/1/3 16:41
*/
@Configuration
public class MybatisPlusConfig {
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new UpdateRelatedFieldsMetaHandler());
return globalConfig;
}
}
配置实体类中相关字段的自动填充策略
在@TableField注解中设置fill属性
字段填充策略FieldFill说明
值 | 描述 |
---|---|
DEFAULT | 默认不处理 |
INSERT | 插入填充字段 |
UPDATE | 更新填充字段 |
INSERT_UPDATE | 插入和更新填充字段 |
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 基础实体类
*
* @author whw
* @date 2020/1/3 17:37
*/
@Data
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "创建用户ID")
@TableField(value = "c_create_id", fill = FieldFill.INSERT)
private String createId;
@ApiModelProperty(value = "创建时间")
@TableField(value = "c_create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty(value = "更新用户ID")
@TableField(value = "c_update_id", fill = FieldFill.INSERT_UPDATE)
private String updateId;
@ApiModelProperty(value = "更新时间")
@TableField(value = "c_update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
我这边是在实体中抽取了一个父类出来,当然也可以直接在实体类的对应字段上添加注解。
来源:https://blog.csdn.net/hon_vin/article/details/103823788


猜你喜欢
- 在upload.jsp页面中将多个文件域对象命名为相同的名字,这样在action中就可以将多个文件域解析成一个数组,数组的大小就是文件域的个
- 本文实例讲述了Android开发实现的标准体重计算器功能。分享给大家供大家参考,具体如下:运行结果界面: 界面设计<Rela
- 当构建一个图形化的Windows Form桌面应用程序并且需要执行在应用程序主UI线程之外的线程中长时间的任务时,BackgroundWor
- 一、前言 在学习了循环、分支、和函数之后,可以写一些简单的小游戏来给自己的编程之路增添一
- 公司经理把我拉出来,死马当活马医,做一个安卓app,作为刚毕业几个月且只是培训了几个月的小白来说,这无疑是一个非常大的挑战,当然最大的挑战不
- Java 编程语言中时间的处理类有 Date类与 Calendar类。目前官方不推荐使用 Date类,因为其不利于国际化;而是推荐使用 Ca
- 本文介绍了Android:利用SharedPreferences实现自动登录,具体如下:主要代码:public class LoginAct
- 有这么一种应用场景:你是做前端或APP开发的,需要调用服务端提供的接口,接口只能在公司内网访问;在公司外就无法调试代码了。想在公司外访问怎么
- 前言做APP应用开发的时候,用户头像肯定是必不可少的,但是90%以上的需求头像都是圆形的。那么,如何通过自定义View的方式实现圆形头像呢,
- C语言数据结构之二叉树的非递归后序遍历算法前言:前序、中序、后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的
- 这篇文章主要介绍了RabbitMQ延迟队列及消息延迟推送实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 这篇文章主要介绍了JavaWeb项目Servlet无法访问问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行期的多态,当一
- 问题描述通过FeignClient调用微服务提供的分页对象IPage报错{"message": "Type d
- 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息:Error on line 60 of document
- 一、settings.xml文件会在两个目录下存在:1、Maven安装目录(全局):%MAVEN_HOME%\conf\settings.x
- 前言『 * 』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问。举个最简单的例子,比如我们想
- 一 介绍本节给知识追寻者给大家带来的是springSecurity入门篇,主要是简述下springSecrurity的启动原理和简单的入门搭
- 一、前言在Java编码中,我们经常会遇到List与数组的转换,包括对象List与对象数组的转换,以及对象List与基本数据类型数组的转换,下
- spring cloud zuul增加header传输在使用OAuth2.0传输权限认证,为了再调用其他的项目的时候获取token,必须在t