背景描述

目前,大多数项目的数据库设计,都会添加一些公共字段,比如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数据库字段自动填充的更多相关文章

  1. Mybatis plus通用字段自动填充的最佳实践总结

    在进行持久层数据维护(新增或修改)的时候,我们通常需要记录一些非业务字段,比如:create_time.update_time.update_by.create_by等用来维护数据记录的创建时间.修改 ...

  2. SpringBoot-Mybatis_Plus学习记录之公共字段自动填充

    一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好 ...

  3. MyBatis数据库字段和实体对象属性名不一致的解决方案

    数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案. 1. 开启驼峰转换 如果数据库中的字段名与对象只是简单的不一致的话,比如 ...

  4. 【mybatis-plus】主键id生成、字段自动填充

    一.主键id的生成 数据库表里通常都会有一个主键id,来作为这条数据的唯一标识. 常见的方式 数据库自动增长 这种很常见了,可以做到全库唯一.因为id是天然排序的,对于涉及到排序的操作会很方便. UU ...

  5. mybatis-plus时间字段自动填充

    时间代码自动填充的2种方式 数据库方式 将数据库字段create_time和update_time设置CURRENT_TIMESTAMP,create_time字段后面不需要勾选更新,update_t ...

  6. winform中的 datagriview 字段自动填充长度

    在winfrom 的 datagridview 中 绑定字段 经常回在最后面空出一部分来,显得不美观, 现在教大家如何让它自适应宽度 public static void Autogrid(DataG ...

  7. Thinkphp3.2数据库字段自动转小写,字段大小写自动转换,以及thinkphp3一些bug

    公司在使用thinkphp框架,版本也有些老,被一些bug坑了,记录一下 自动转小写解决办法,最简单的就是在配置文件加上 'DB_PARAMS' => [\PDO::ATTR_CASE => ...

  8. [Kubernetes]Pod字段自动填充

    PodPreset(Pod预设置)在Kubernetes v1.11以后出现,开发人员只需要提交一个基本的Pod YAML,Kubernetes就可以自动给对应的Pod对象加上运维人员设定好的其他必要 ...

  9. mybatis开启字段自动映射为java驼峰命名规则

    <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> & ...

  10. MybatisPlus字段自动填充配置

    实体类 @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) private Date gm ...

随机推荐

  1. SICP:惰性求值、流和尾递归(Python实现)

    求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看.这里顺便强烈推荐UC Berkeley的同名课程CS 61A. 即使在变化中,它也丝毫未变. --赫拉克利特 ...

  2. 深入理解 python 虚拟机:花里胡哨的魔术方法

    深入理解 python 虚拟机:花里胡哨的魔术方法 在本篇文章当中主要给大家介绍在 cpython 当中一些比较花里胡哨的魔术方法,以帮助我们自己实现比较花哨的功能,当然这其中也包含一些也非常实用的魔 ...

  3. Netty实战(二)

    一.环境准备 Netty需要的运行环境很简单,只有2个. JDK 1.8+ Apache Maven 3.3.9+ 二.Netty 客户端/服务器概览 如图,展示了一个我们将要编写的 Echo 客户端 ...

  4. Abstract Factory Pattern 抽象工厂模式简介与 C# 示例【创建型】【设计模式来了】

    〇.简介 1.什么是抽象工厂模式? 一句话解释:   通过对抽象类和抽象工厂的一组实现,独立出一系列新的操作,客户端无需了解其逻辑直接访问. 抽象工厂模式(Abstract Factory Patte ...

  5. Java的运算符和表达式(基础语法学习)

    一.运算符 ​ 在Java中用于程序计算的操作符统称为运算符,运算符分为如下几类 1.算数运算符 运算符 说明 + 加号两边是数值,可以运算,如果一边存在字符串,则当作连接符 a+b - 两个数相加, ...

  6. windows服务启动时提示找不到指定路径的问题

    我是自己写了一个windows服务,并且在之前一直运行良好,上周四晚上之后,竟然莫名其妙的停止了,我登上远程服务器,才发现,该服务已经停止,当我手动打开该服务时,提示我如下错误,找不到指定路径:. 一 ...

  7. Wise 的平台工程 KPI 探索之旅

    作者|Lambros Charissis 翻译|Seal软件 链接|https://medium.com/wise-engineering/platform-engineering-kpis-6a32 ...

  8. Spring Boot实现高质量的CRUD-5

    (续前文) 9.Service实现类代码示例 ​ ​ 以用户管理模块为例,展示Service实现类代码.用户管理的Service实现类为UserManServiceImpl.​UserManServi ...

  9. Mybatis-plus自定义Sql注入器

    最近在学习mybatis-plus,知道了在mp中通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行. 下面是一个关系图 那 ...

  10. 变分自编码器(VAE)公式推导

    论文原文:Auto-Encoding Variational Bayes [OpenReview (ICLR 2014) | arXiv] 本文记录了我在学习 VAE 过程中的一些公式推导和思考.如果 ...