mybatis数据库字段自动填充
背景描述
目前,大多数项目的数据库设计,都会添加一些公共字段,比如version(版本号)、deleted(逻辑删除标识)、create_time、update_time、create_by、update_by,这些字段都是在各个业务里分开处理的。
这是,mybatis给我们提供了一种便利的方式,采用切面的方式进行实现。
实现过程
第一步,直接上代码
import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; /**
* 数据库公共字段填充
*/
@Configuration
public class MapperObjectHandler implements MetaObjectHandler { // 通常项目会有登录拦截,然后将用户信息缓存到当前线程,这里可以根据实际项目实现,也可参考我其它博客实现登录信息缓存
@Autowired
CacheService cacheService; /** 数据库int类型字段默认值 */
private static final int DEFAULT_DB_INIT_DELETED_VALUE = 0;
private static final int DEFAULT_DB_INIT_VERSION_VALUE = 1; @Override
public void insertFill(MetaObject metaObject) {
String username;
if (cacheService.getUserInfo() == null) {
username = "nc";
} else {
username = cacheService.getUserInfo().getNickname();
} this.setFieldValByName("deleted", DEFAULT_DB_INIT_DELETED_VALUE, metaObject);
this.setFieldValByName("version", DEFAULT_DB_INIT_VERSION_VALUE, metaObject); if (this.getFieldValByName("createBy", metaObject) == null) {
this.setFieldValByName("createBy", username, metaObject);
}
if (this.getFieldValByName("createTime", metaObject) == null) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
this.setFieldValByName("updateBy", username, metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
} @Override
public void updateFill(MetaObject metaObject) {
String username;
if (cacheService.getUserInfo() == null) {
username = "nc";
} else {
username = cacheService.getUserInfo().getNickname();
} Object versionObj = this.getFieldValByName("version", metaObject);
version += 1;
this.setFieldValByName("version", version, metaObject); if (this.getFieldValByName("updateBy", metaObject) == null) {
this.setFieldValByName("updateBy", username, metaObject);
}
this.setFieldValByName("updateTime", new Date(), metaObject);
} }
mybatis提供了MeteObjectHandler接口,继承这个接口即可自定义实现字段填充,这个接口也提供了大量方法,大家也可以进去看下源码,直接采用如下方法来实现。

第二步,抽离公共字段,新建公共字段基类(以下省略get和set方法)
public class BaseEntity {
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Integer version;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
}
一般有两个场景需要填充默认值,insert和update,根据实际场景配置就好,@TableLogic是mybatisplus的逻辑删除注解,大家有兴趣的可以自行查找资料。
然后,大家将自己的数据库实体继承这个基类就完成了。
这样就配置完了,就是这么简单,赶快在自己的项目中用起来吧。
mybatis数据库字段自动填充的更多相关文章
- Mybatis plus通用字段自动填充的最佳实践总结
在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...
- SpringBoot-Mybatis_Plus学习记录之公共字段自动填充
一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好 ...
- MyBatis数据库字段和实体对象属性名不一致的解决方案
数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案. 1. 开启驼峰转换 如果数据库中的字段名与对象只是简单的不一致的话,比如 ...
- 【mybatis-plus】主键id生成、字段自动填充
一.主键id的生成 数据库表里通常都会有一个主键id,来作为这条数据的唯一标识. 常见的方式 数据库自动增长 这种很常见了,可以做到全库唯一.因为id是天然排序的,对于涉及到排序的操作会很方便. UU ...
- mybatis-plus时间字段自动填充
时间代码自动填充的2种方式 数据库方式 将数据库字段create_time和update_time设置CURRENT_TIMESTAMP,create_time字段后面不需要勾选更新,update_t ...
- winform中的 datagriview 字段自动填充长度
在winfrom 的 datagridview 中 绑定字段 经常回在最后面空出一部分来,显得不美观, 现在教大家如何让它自适应宽度 public static void Autogrid(DataG ...
- Thinkphp3.2数据库字段自动转小写,字段大小写自动转换,以及thinkphp3一些bug
公司在使用thinkphp框架,版本也有些老,被一些bug坑了,记录一下 自动转小写解决办法,最简单的就是在配置文件加上 'DB_PARAMS' => [\PDO::ATTR_CASE => ...
- [Kubernetes]Pod字段自动填充
PodPreset(Pod预设置)在Kubernetes v1.11以后出现,开发人员只需要提交一个基本的Pod YAML,Kubernetes就可以自动给对应的Pod对象加上运维人员设定好的其他必要 ...
- mybatis开启字段自动映射为java驼峰命名规则
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> & ...
- MybatisPlus字段自动填充配置
实体类 @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) private Date gm ...
随机推荐
- 如何使用Go中的Weighted实现资源管理
1. 简介 本文将介绍 Go 语言中的 Weighted 并发原语,包括 Weighted 的基本使用方法.实现原理.使用注意事项等内容.能够更好地理解和应用 Weighted 来实现资源的管理,从而 ...
- Java(多态)
1.多态 动态编译:类型 即同一方法可以根据发送对象的不同而采用不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用可以有很多 多态存在条件 有继承关系 子类重写父类方法 父类引用指向子类 ...
- JavaScript如何解决单线程缺陷——webWorker
解决JavaScript单线程问题--webWorkers 参考文档 使用 Web Workers - Web API 接口参考 | MDN (mozilla.org) MDN的介绍为: Web Wo ...
- docker镜像的原理
docker镜像的原理 docker镜像是由特殊的文件系统叠加而成 最低端是bootfs,并使用宿主机的bootfs 第二层是root文件系统rootfs,称之为base image 再往上是可叠加的 ...
- .NET 7 新特性全面解析
在 2021 年 11 月 8 日发布的 .NET 6 当前已经广泛使用.微软团队已经开始着手为.NET 7制定计划和新特性.本文将为您全面解析.NET 7 的新特性,并提供源代码示例. 1. 更好的 ...
- LocalTime转String类型,如下图
- 【Oracle】行转列的函数wm_concat,listagg,xmlagg,pivot以及动态行转列
[Oracle]行转列的几种情况 表的数据如下 朴实无华的函数 1.wm_concat 使用格式: select 分组字段,wm_concat(要转换的列名) from 表名 group by 分组字 ...
- Python安装time库失败?不是吧阿sir你还不知道内置模块不用下载吧
嗨嗨,今天给python安装time库,一直报错,换源等办法都试过了 直到我看到 Python中有以下常用模块不用单独安装 random模块 sys模块 time模块 os系统操作 re正则操作 js ...
- 【调制解调】PM 调相
说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录,代码已上传到 Github - ModulationAndDemodulation.本篇介绍 PM ...
- CS144 LAB5~LAB6
CS144 lab5~6 最后两个lab了,虽然很多大佬都说剩下的两个lab比起TCP的实现,"简直太简单了",但是我认为做这两个之前需要补充一些额外的网络知识,不然直接上手去做的 ...