Java开发 - 公共字段的自动填充

公共字段自动填充步骤及出现的问题 1. **元数据处理器未配置**:需要在实体类中使用 `@TableField` 注解的 `fill` 属性来指定字段在什么情况下自动填充,并且需要实现 `MetaObjectHandler` 接口来定义填充规则。2. **自动填充规则未正确实现**:在 `MetaObjectHandler` 实现类中,需要正确实现 `insertFill` 和 `updateFill` 方法来指定字段的填充值。7. **缓存问题**:有时候,可能是由于缓存导致自动填充没有按预期工作。我的就是更换了最新版本。 阅读详情

前言

如果说Java开发中有什么是让人很烦的一件事,那一定是无尽的填充字段,本篇作为观众瑰宝系列第二篇,将带来公共字段填充相关的知识点,学完此篇,让你摆脱公共字段填充带来的麻烦,节省代码,降低冗余,妥妥的给项目瘦身,还能一定程度上提高程序的运行效率,所以,你心动吗?

问题描述

可以说,几乎每张表,我们都会有create_time,update_time这样的公共字段,所以几乎每次请求时我们都要去操作这样的字段并重新赋值,这就降低了我们的开发效率,且重复的代码让人不胜其烦,所以我们想要写一个公共的方法可以统一添加这些字段,而不用处处都写相同的代码!

问题分析

我们以上一篇SpringCache的项目为基础,也可自行创建一个项目,在上一个项目中,我们在原来的数据库中添加create_time,update_time字段:

alter table user add create_time DATETIME;
alter table user add update_time DATETIME;

新表字段如下: 

我们清空了表中的数据, 记者修改模型数据,添加这两个新字段;

package com.codingfire.cache.entity;

import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
public class User implements Serializable {
    private Long id;
    private String username;
    private String password;
    private Integer age;
    private String phone;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

接着去重新修改增删改查的代码,我们简单修改如下:

    @PostMapping
    @CachePut(value = "user", key = "#user.id")
//    @CachePut(value = "userCache", key = "#backUser.id")
    public User add(User user) {
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        userService.save(user);
        User backUser = user;
        return backUser;
    }

    @PutMapping
    @CachePut(value = "user", key = "#user.id")
//    @CachePut(value = "userCache", key = "#backUser.id")
    public User update(User user) {
        user.setUpdateTime(LocalDateTime.now());
        userService.updateById(user);
        User backUser = user;
        return backUser;
    }

下面运行MySQL和Redis服务,用postman调用添加用户接口:

结果意外遇到了新问题, Redis的jackson不支持LocalDateTime时间类,这就尴尬了,但并不是无解,报错中给出了解决办法,我们按照提示做出一些调整。

添加新依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.13.0</version>
</dependency>

这时如果你直接运行项目,还是不行,还需要在实践属性上添加两个注解:

    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)

做完这些,重新启动项目,运行添加用户的API,果然运行成功,我们查看数据库:

 新的数据已经添加上去了,但又没有办法隐式的添加这两个时间,而不是直接通过代码呢?我想,应该是有的,我们之前学过过滤器和拦截器,他俩的差别我就不再介绍了,感兴趣的自行查看: 

Java开发 - 拦截器初体验_CodingFire的博客-优快云博客

由此来看,这里面必定少不了他们的角色,这里我们就用过滤器吧,过滤器的拦截范围更大,一般项目都会使用,我们不妨也用一下,基调定好了,下一步我们就来看看怎么实现这个过滤器,让字段可以自动填充。 

然而我们发现,写在过滤器里也不是很合适,它只能在post时通过request.getParam(key)获取数据,不能进行写操作,这就麻烦了,看来过滤器也不是很好的选择啊。

好在,天无绝人之路,我们还可以通过自定义元数据对象处理器的方式来统一添加参数,而且,可行度非常高。

解决方案

创建元数据对象处理器

package com.codingfire.cache.common;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 自定义元数据对象处理器
 */
@Component
@Slf4j
public class MyMetaObjectHandle implements MetaObjectHandler {
    /**
     * 插入操作,自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]...");
        log.info(metaObject.toString());

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
    }

    /**
     * 更新操作,自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");
        log.info(metaObject.toString());

        metaObject.setValue("updateTime",LocalDateTime.now());
    }
}

删除接口内自定义添加字段

将接口中,我们手动添加的字段删掉:

    @PostMapping
    @CachePut(value = "user", key = "#user.id")
//    @CachePut(value = "userCache", key = "#backUser.id")
    public User add(User user) {
        userService.save(user);
        User backUser = user;
        return backUser;
    }

给时间字段添加注解

做完这些,还需要给自动填充的字段增加一个注解。

如果是插入填充:

    @TableField(fill = FieldFill.INSERT)

如果是插入和更新时都填充:

    @TableField(fill = FieldFill.INSERT_UPDATE)

测试

我们重新启动项目,用postman调用此接口,新增加一个用户:

查看数据库中新增加的用户信息是否包含了时间:

 

测试成功,公共字段的填充搞定。 

结语

看来,解决问题时,方向一定要找对,斗则方向错了,怎么也不可能完成目标的。一开始博主想要用过滤器来完成,但是发现过滤器无法进行写操作,转而更换了方向,从元数据处理器下手,最后终于实现了公共字段填充。觉得不错,就给个赞吧。

关于mybatis公共字段自动填充 mybatis公共字段填充 阅读详情

相关推荐

SpringBoot实战:如何用AOP优雅实现公共字段自动填充(附完整代码)

本文详细介绍了在SpringBoot项目中,如何利用AOP(面向切面编程)技术优雅地实现公共字段(如创建时间、更新人)的自动填充。通过自定义注解和切面,将横切关注点从业务代码中剥离,提供了一套可复用、高扩展的企业级解决方案,并附有完整的实战代码,帮助开发者提升代码整洁度和维护效率。

weixin_29208077的博客 338

公共字段的填充

方式1,通过mybatis-plus提供的MetaObjectHandler进行填充。根据FieldFill的枚举类引用即可,简单容易上手。以上的一些字符串常量可以直接把类名去掉再加上引号即可。自定义注解,检测对注解@AutoFill 的使用。使用value的值是update或insert。方式二:通过spring AOP。

qq_56533553的博客 379

苍穹外卖(四) AOP切面公共字段自动填充及文件上传

的方式为这个Mapper的方法加入注解, (让这个方法成为切入点)作为一个标识表示该操作需要赋值 没有标识就不需要。

weixin_47786582的博客 1686

数据库公共字段自动填充

Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。前面我们已经完成了后台系统的员工管理功能的开发,在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间、修改人等字段。然后,我们启动项目,在员工管理模块中,测试增加/更新员工信息功能,然后通过debug 或者 直接查询数据库数据变更的形式,看看我们在新增/修改数据时,这些公共字段数据是否能够完成自动填充。...

JJpZh的博客 2021

Java公共字段自动填充的逻辑设计

摘要:本文提出一套Java公共字段自动填充的高效解决方案,针对实体类中重复字段(如create_time、update_by等)手动维护效率低、易出错的问题。方案整合MyBatis-Plus自动填充(通过MetaObjectHandler实现插入/更新时字段自动填充)和AOP切面处理(自定义注解统一拦截业务方法)两种核心策略,并扩展多数据源适配、分布式ID生成等生产级功能。通过继承基类实体和注解配置,实现零侵入的公共字段维护,大幅减少重复代码,提升系统可维护性。文中包含完整代码示例、配置方法和常见问题解决方

Hello, New World! 384

PaddleOCR实战指南:从环境搭建到自定义模型训练

本文提供了PaddleOCR从环境搭建到自定义模型训练的完整实战指南。详细介绍了使用Anaconda或Docker搭建稳定开发环境、准备与标注数据集、进行文本检测与识别模型训练的核心步骤与参数调优技巧,并分享了数据增强、模型微调及解决实际项目难题的实用方法,帮助开发者高效掌握PaddleOCR应用。

gold的博客 646

开发随手记-Java公共字段的自动填充

如果说Java开发中有什么是让人很烦的一件事,那一定是无尽的填充字段,本篇作为观众瑰宝系列第二篇,将带来公共字段填充相关的知识点,学完此篇,让你摆脱公共字段填充带来的麻烦,节省代码,降低冗余,妥妥的给项目瘦身,还能一定程度上提高程序的运行效率,所以,你心动吗?

weixin_63023018的博客 554

Java对接海康威视明眸门禁设备

海康威视合作生态致力打造一个能力开放体系、两个生态圈,Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上,融合AI、大数据、云计算等技术,为合作伙伴提供的一个二次开发及创新的平台。的SDK复制到linux的lib目录下(如果是docker发布,记得做好共享映射哦)大家有没有想过,windows版的SDK为什么要复制到项目根目录的lib文件夹下?所以发布到linux的时候,我们需要将。打开AcsMain文件。................

Good Luck 7878

java中公共字段自动填充开发逻辑

通过以上方式可以实现公共字段的自动填充,虽然代码的可读性降低了,但降低了代码的重复率,且这部分代码是较为固定的,后续可以直接copy使用。

estxiyang的博客 448

告别手动打点计时:用Lauterbach TRACE32的RunTime功能,5分钟搞定嵌入式代码段性能分析

本文深入解析了Lauterbach TRACE32的RunTime功能在嵌入式代码性能分析中的革命性应用。通过硬件级计时原理和非侵入式设计,该功能能快速精确测量代码执行时间,显著提升开发效率,特别适用于汽车电子和工业控制领域。文章还提供了从基础设置到高级分析的完整实战指南,帮助工程师轻松掌握这一强大工具。

weixin_30615767的博客 281

别再手动算了!用Excel函数一键搞定AQI和首要污染物分析(附完整公式模板)

本文介绍如何利用Excel函数自动化计算AQI和首要污染物分析,大幅提升数据处理效率。通过构建标准化输入模板、智能计算IAQI、自动判定AQI与首要污染物,并生成可视化仪表盘,帮助环保工作者快速完成每日监测报告。

weixin_30443075的博客 346

Java开发之公共字段自动填充

举例:不同的表,如:员工表、菜品表、套餐表....在进行添加(insert语句)、修改(update语句)时,都需要添加/修改一些公共的字段,比如创建时间、创建人id、修改时间、修改人id。此时在对应的service层设置这些公共字段很麻烦,会显得代码十分冗余且不利于后期维护(比如后期又添加了其他的公共字段,修改起来会很麻烦)。如果就想通过传统的set方法,在service层一个一个的给公共字段赋值也没问题,看个人需求罢了。注意:以上只是提供一个还不错的思路,用于解决“公共字段填充”这个问题。

casually的博客 655

问题解决:打开VMware创建的虚拟机,电脑立刻蓝屏并重启

VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credenti

weixin_55118477的博客 3万+

Java公共字段怎么解耦,使用公共类可以方便我们的开发。公共字段自动填充。

在做一些项目时需要用到很多的数据表,但是这些数据表又有相同的字段,每次调用方法都要给这些字段不断地重复复制很麻烦,怎么才能更加简单,自动填充这些公共字段呢?但是无论是员工表还是菜单表,每次使用都需要填充谁创建的,什么时候创建的,因此可以把这些公共字段摘取出来。为了获得创建者的ID,需要从session中获取,但是这个里面没有注入缓存,因此需要再创建【基于ThreadLocal封装工具类,用户保存和获取当前登录用户id。比如下面这个数据表,这是员工的数据表。

didiwei95的博客 209

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

482

031、速度前馈与加速度前馈

摘要: 本文通过追剪机调试案例,阐述了速度前馈和加速度前馈在运动控制中的关键作用。前馈不是高级技巧,而是解决动态响应问题的必要手段:速度前馈通过预测速度变化提前补偿,加速度前馈则针对惯量变化提供力矩补偿。实现时需注意信号平滑处理,避免噪声放大。前馈与PID分工明确,前馈承担主要动态响应,PID处理残余误差。调试应先调前馈再微调PID,前馈增益需计算而非仅凭参数调整,并允许适当残余误差。前馈作为开环补偿不会影响系统稳定性,但需配合平滑的指令生成器使用。(149字)

m0_50546716的博客 294

Java开发中如何自动填充SQL语句中的公共字段

1. 前言我们在设计数据库的时候一定会带上新增、更新的时间、操作者等审计信息。之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据。但是我们仍然需要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补。但是我们变更每条数据都要去显式变更这些信息就十分繁琐,我们希望无感知的来处理这些信息。2. 通用方式那么有什么好的解决思路呢?在Spring ...

十指波课堂的博客 556

OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战

【代码】OpenHarmony + AI:深度解析 Whisper.cpp 智慧语音系统级移植与 NAPI 封装实战。

m0_67505153的博客 188

JAVA项目开发公共字段自动填充——省事

/ 数据库操作类型:UPDATE INSERT这段代码是一个自定义注解AutoFill,用于标记方法,并指定一个注解参数value()来表示数据库的操作类型。:表示该注解可以应用于方法上。:表示该注解在运行时仍然可用,可以通过反射来获取注解信息。:定义了一个名为AutoFill的注解。:该注解参数表示数据库的操作类型,类型为。可以是一个枚举类型,用来表示数据库的更新操作(如更新数据、插入数据等)。枚举示例(表示数据库操作的类型)

weixin_63601058的博客 653

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mybatisplus直接执行sql_Java开发中如何自动填充SQL语句中的公共字段

1. 前言我们在设计数据库的时候一定会带上新增、更新的时间、操作者等审计信息。之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据。但是我们仍然需要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补。但是我们变更每条数据都要去显式变更这些信息就十分繁琐,我们希望无感知的来处理这些信息。2. 通用方式那么有什么好的解决思路呢?在Spring ...

weixin_39585617的博客 1388

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

实体类字段多于查出字段_Java开发中如何自动填充SQL语句中的公共字段

1. 前言我们在设计数据库的时候一定会带上新增、更新的时间、操作者等审计信息。之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据。但是我们仍然需要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补。但是我们变更每条数据都要去显式变更这些信息就十分繁琐,我们希望无感知的来处理这些信息。2. 通用方式那么有什么好的解决思路呢?在Spring ...

weixin_30980025的博客 320

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

sql server如何读取数据java_Java开发中如何自动填充SQL语句中的公共字段

1. 前言我们在设计数据库的时候一定会带上新增、更新的时间、操作者等审计信息。之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据。但是我们仍然需要追踪到这个事是谁干的,在什么时间干的,具体干了哪些事等等,方便定责和修补。但是我们变更每条数据都要去显式变更这些信息就十分繁琐,我们希望无感知的来处理这些信息。2. 通用方式那么有什么好的解决思路呢?在Sp...

weixin_39658474的博客 74

Mapper层公共字段自动填充

*** 自定义注解,用于标识某个方法需要进行功能字段自动填充处理*/ @Target(ElementType . METHOD) //指定注解只能加在方法上 @Retention(RetentionPolicy . RUNTIME) //用于描述注解的生命周期 public @interface AutoFill {//指定一个属性,指定当前数据库的操作类型,使用枚举 OperationType value();OperationType是定义的一个公共枚举/*** 数据库操作类型/**

秃头青年的学习记录博客 524

AOP切面编程:公共字段的自动填充

通过切入点表达式,来捕获到对应的连接点(即:需要被AOP切面类操作的方法)。添加前置通知约定这些方法的第一个形参,就是要insert/update操作的实体类获取该实体类准备要赋值的数据,如:当前时间、当前人员的ID(如管理员id)根据注解上的操作类型,来执行不同的逻辑如果是insert类型,就给该实体类加上创建时间、更新时间、创建人ID、更新人ID这四个字段。

casually的博客 1102

公共字段自动填充-AOP

在所有的新增和更新的业务操作中,都需要对上述字段进行赋值操作,编码相对冗余、繁琐,那能不能对于这些公共字段在某个地方统一处理,来简化开发呢? 答案是可以的,可以使用AOP切面编程,实现功能增强,来完成公共字段自动填充功能。 还可以使用拦截器统一对公共字段赋值,下面使用AOP技术解决上述问题。

cyt涛的博客 1161
上一篇: Java开发 - SpringCache初体验
下一篇: Java开发 - MySQL主从复制初体验
CodingFire
CodingFire  2022年度博客之星移动开发领域TOP 5 2022年度博客之星移动开发领域TOP 5 领域专家: 移动开发技术领域 领域专家: 移动开发技术领域
博客等级 码龄11年 7927粉丝 387原创
评论 28
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingFire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值