背景描述

目前,大多数项目的数据库设计,都会添加一些公共字段,比如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. 推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

    日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日.节气.中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来. 所以,今天给大家推荐一个开源库,它支持阳历.阴 ...

  2. odoo开发教程十三:qweb报表

    一:概述 报表是使用qweb定义的,报表的pdf导出是使用wkhtmltopdf来完成的. 如果需要为一个模型创建报表,需要定义report及对应模板. 如果有需要的话还可以指定特定的纸张格式, 如果 ...

  3. c# 如何将枚举以下拉数据源的形式返回给前端

    前言: 相信各位有碰到过与我类似的问题,当表中存一些状态的字段,无非以下几种形式1.直接写死 如: 正常:1,异常:2 ,还有一种则是写在字典中,再或者就是加在枚举上,前两者对于返回下拉数据源来说比较 ...

  4. FTL潜规则:调优,才是算法精华

    前言 在存储领域中有一个FTL的概念,这是一种Flash的内存管理算法,属于各个厂商的核心机密,每个厂商的处理方式不同,有的处理简单,有的处理复杂. FTL,即Flash Translations l ...

  5. CKS 考试题整理 (18)-TLS 安全配置

    Task 通过 TLS 加强 kube-apiserver 安全配置,要求 kube-apiserver 除了 VersionTLS13 及以上的版本可以使用,其他版本都不允许使用. 密码套件(Cip ...

  6. 使用hashicorp Raft开发分布式服务

    使用hashicorp Raft开发高可用服务 开发raft时用到的比较主流的两个库是Etcd Raft 和hashicorp Raft,网上也有一些关于这两个库的讨论.之前分析过etcd Raft, ...

  7. @Deprecated注解的使用

    被注解@Deprecated标记的程序元素是不鼓励使用的程序元素,通常是因为它很危险,或者是因为存在更好的替代方案. 除了对象自身引用自己用@Deprecated标记的方法外,其他情况使用@Depre ...

  8. PostgreSQL 12 文档: 部分 V. 服务器编程

    部分 V. 服务器编程 这部分关于使用用户定义的函数.数据类型.触发器等扩展服务器功能.这些是高级主题,读者应该在理解了有关PostgreSQL的所有其他用户文档之后才阅读这些主题.这一部分的后面一些 ...

  9. 【java-Err】 Generating equals/hashCode implementation but without a call to superclass,

    @EqualsAndHashCode  默认不继承父类 修复此问题的方法很简单:  1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object ot ...

  10. LRU 力扣 146 https://leetcode.cn/problems/lru-cache/

    一道经典题目,用双向链表去做能够满足O1的复杂度 核心代码如下 class LRUCache {    MyLinkedList myLinkedList;    int size;    int c ...