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

news2025/1/24 14:53:43

前言

如果说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的博客-CSDN博客

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

然而我们发现,写在过滤器里也不是很合适,它只能在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调用此接口,新增加一个用户:

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

 

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定时任务:从Timer、STPE、Quartz 到 XXL-JOB

java.util.Timerjava.util.concurrent.ScheduledThreadPoolExecutor 简称STPEQuartzXXL-JOB 基本套路 定时任务基本上都是在一个while(true)或for(;;)死循环中&#xff08;每次循环判断定时程序是否终止或暂停&#xff09;&#xff0c;从任务存放的地&#xff08;可以是内存的…

电脑重装系统后会怎样?

​有小伙伴的电脑系统运行缓慢卡顿&#xff0c;现在想通过重装系统来解决问题。咨询电脑重装系统会怎么样对系统有影响吗&#xff0c;现在小编就带大家看看电脑重装系统后会怎样。 方法/步骤&#xff1a; 一、电脑重装系统会怎么样 1、我们的电脑重装系统后&#xff0c;电脑…

Java面试题总结 | Java基础部分(持续更新)

Java基础 文章目录Java基础一个Java文件里可以有多个类吗&#xff08;不含内部类&#xff09;&#xff1f;创建对象的方法面向对象和面向过程简述自动装箱拆箱Java代码块执行顺序java中的基本数据类型对应的字节数包装类型和基本数据类型的场景java中的关键字分类final关键字st…

【微信小程序】小程序基础入门01

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;微信小程序的入门介绍 【前言】小程序是一种不需要下载、安装即可使用的应用&#xff0c;它实现了应用触手可及的梦想&#xff0c;用户扫一扫或者搜一下就能打开应用&#xff0c;也实现…

Flink 优化 (三) --------- 反压处理

目录一、概述1. 反压的理解2. 反压的危害二、定位反压节点1. 利用 Flink Web UI 定位2. 利用 Metrics 定位三、反压的原因及处理1. 查看是否数据倾斜2. 使用火焰图分析3. 分析 GC 情况4. 外部组件交互一、概述 Flink 网络流控及反压的介绍&#xff1a;https://flink-learning.…

threejs-后期通道效果汇总

文章目录前言后期处理通道汇总简单通道效果FilmPassDotScreenPassBloomPassUnrealBloomPassOutlinePassGlitchPassHalftonePass高级通道效果掩码效果MaskPass景深效果 BokehPass景自定义效果 ShaderPass总结前言 Threejs提供了很多后期处理通道&#xff0c;配合 THREE.EffectC…

【并发编程Python】一文了解Python并发编程,协程、线程、进程

并发编程简介和一些前缀知识 并发编程是使得程序大幅度提速的。在并发编程中&#xff0c;程序可以同一时间执行多个任务&#xff0c;这有助于提高程序的吞吐量和响应时间。并发编程设计的主要概念包括线程、锁、同步、信号量、进程间通信等。 前缀知识&#xff1a; IO&#x…

信息系统项目管理师第四版知识摘编:第22章 组织通用治理​

第22章 组织通用治理​ 组织治理是协调组织利益相关者之间关系的一种制度安排&#xff0c;目标是为了确保组织的高效决策&#xff0c;实现利益相关者之间的利益均衡&#xff0c;提高组织的绩效&#xff0c;确保组织运行的可持续发展。​ 22.1组织战略​ 组织战略是组织高质量…

一文读懂:低代码开发平台对企业效益有什么作用?

一文读懂&#xff1a;低代码开发平台对企业效益有什么作用&#xff1f; 近年来&#xff0c;企业数字化转型的需求越来越迫切&#xff0c;但面临着IT人才不足、成本高昂等痛点问题&#xff0c;于是零代码平台应运而生&#xff0c;成为企业数字化转型的重要工具。 市面上的零代…

基于支持向量机SVM的脑部肿瘤识别,脑电波样本熵提取

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的的脑部肿瘤识别分类预测 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它…

Spring boot+Vue博客平台:文章列表展示、文章分类与标签管理模块实现

本文将详细介绍如何实现博客平台中的文章列表展示、文章分类与标签管理功能&#xff0c;包括前端的Vue组件设计和后端的Spring Boot接口实现。在阅读本文后&#xff0c;您将了解如何设计和实现高效、易用的文章列表展示、文章分类与标签管理功能。 一、文章列表展示 1.设计思…

电脑蓝屏错误MACHINE-CHECK-EXCEPTION重装系统教程

电脑蓝屏错误MACHINE-CHECK-EXCEPTION重装系统教程分享。最近有用户电脑遇到了蓝屏问题&#xff0c;正常使用电脑的时候常常会出现了蓝屏错误代码“MACHINE-CHECK-EXCEPTION”。那么遇到这个问题要怎么去进行系统的重装呢&#xff1f;来看看以下的具体操作方法教学吧。 准备工作…

JVM/GC/CMS

CMS (Concurrent Mark Sweep) jdk1.4后期版本开始引入的新gc算法ParNew(新生代) CMS(老年代)组合使用使用标记-清除算法目标&#xff1a;适合于B/S等对响应时间要求高的场景缺点&#xff1a;运行结束产生大量空间碎片缺点&#xff1a;由于分配给用户使用的老年代空间不足造成…

一文快速回顾 Servlet、Filter、Listener

什么是Servlet&#xff1f; 前置知识&#xff1a; Web 服务器&#xff1a;可以指硬件上的&#xff0c;也可以指软件上的。从硬件的角度来说&#xff0c; Web 服务器指的就是一台存储了网络服务软件的计算机&#xff1b;从软件的角度来说&#xff0c; Web 服务器指的是一种软件…

使用codon加速你的python程序

使用codon加速你的python程序 作为高性能 Python 编译器&#xff0c;Codon 可将 Python 代码编译为本机机器代码&#xff0c;而无需任何运行时开销。在单线程上&#xff0c;Python 的典型加速大约为 10-100 倍或更多。Codon 的性能通常与 C/C 的性能相当。与 Python 不同&#…

Three.js教程:第一个3D场景

推荐&#xff1a;将NSDT场景编辑器加入你3D工具链其他工具系列&#xff1a;NSDT简石数字孪生下面的代码完整展示了通过three.js引擎创建的一个三维场景&#xff0c;在场景中绘制并渲染了一个立方体的效果&#xff0c;为了大家更好的宏观了解three.js引擎&#xff0c; 尽量使用了…

【linux】进程和线程的几种状态及状态切换

文章目录一、进程的状态1.1 进程的三种状态1.2 三种状态转换图1.3 三种状态之间的转换1.4 linux下的进程进程状态二、线程的状态三、总结一、进程的状态 1.1 进程的三种状态 进程状态&#xff1a;一个进程的生命周期可以划分为一组状态&#xff0c;这些状态刻画了整个进程。进…

安装spacy+zh_core_web_sm避坑指南

目录 一、spacy简介 二、安装spacy 三、安装zh_core_web_sm 四、安装en_core_web_sm 五、效果测试 5.1 英文测试 5.2 中文测试 一、spacy简介 spacy是Python自然语言处理&#xff08;NLP&#xff09;软件包&#xff0c;可以对自然语言文本做词性分析、命名实体识别、依赖…

Java数组的四种拷贝方式

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

ERTEC200P-2 PROFINET设备完全开发手册(3-2)

周期数据分为两大类&#xff0c;输出数据OutputData和输入数据InputData&#xff0c;输出数据是PLC发送给设备的&#xff1b;输入数据是设备发送给PLC。如果采用标准接口&#xff08;SI&#xff09;&#xff0c;读取输出数据和写入输入数据都是一次初始化数据读写调用和一次/多…