MySQL表字段设置默认值的两种方法

在java代码中给mysql必备字段设置默认值

第一种方式

mybatisplus提供的@TableField注解直接可以解决时间默认值的问题

@TableField注解配合FieldFill 根据新增修改不同操作设置默认值

// 字段添加填充内容
@ApiModelProperty(value = "创建时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_date", fill = FieldFill.INSERT)
private LocalDateTime createDate;@ApiModelProperty(value = "修改时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "modify_date", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime modifyDate;

第二种方式

自定义反射工具类ReflectUtil,统一处理mysql必备字段赋值

比第一种方式的好处是可以根据项目的权限控制,获取当前登录人信息,记录当前登录人为操作人

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;public class ReflectUtil {private static final Logger log = LoggerFactory.getLogger(ReflectUtil.class);private ReflectUtil() {}public static <T> void setFieldValueWhenExists(T t, String fieldName, Object value) {setFieldValueWhenExists(t, fieldName, value, false);}public static <T> void setFieldValue(T t, String fieldName, Object value) {setFieldValueWhenExists(t, fieldName, value, true);}public static <T> void setFieldValueWhenExists(T t, String fieldName, Object value, boolean override) {try {List<Field> fields = getField(t.getClass(), fieldName);if (CollectionUtils.isEmpty(fields)) {return;}Iterator var5 = fields.iterator();while(var5.hasNext()) {Field field = (Field)var5.next();setSingleFieldValue(t, field, fieldName, value, override);}} catch (Exception var7) {log.error("反射设置属性值失败", var7);}}private static <T> void setSingleFieldValue(T t, Field field, String fieldName, Object value, boolean override) throws Exception {int typeCode = field.getModifiers();Object oldValue = null;Method method;if (Modifier.isPublic(typeCode)) {oldValue = field.get(t);} else {method = t.getClass().getMethod("get" + getMethodName(fieldName));oldValue = method.invoke(t);}if (oldValue == null || override) {if (Modifier.isPublic(typeCode)) {field.set(t, value);} else {method = t.getClass().getMethod("set" + getMethodName(fieldName), value != null ? value.getClass() : field.getType());method.invoke(t, value);}}}private static String getMethodName(String fieldName) throws Exception {byte[] items = fieldName.getBytes();items[0] = (byte)((char)items[0] - 97 + 65);return new String(items);}public static List<Field> getField(Class<?> clazz, String filedName) {if (clazz != null && !StringUtils.isEmpty(filedName)) {List<Field> fields = new ArrayList();for(Class<?> tempClass = clazz; tempClass != null; tempClass = tempClass.getSuperclass()) {fields.addAll(Arrays.asList(tempClass.getDeclaredFields()));}return (List)(CollectionUtils.isEmpty(fields) ? fields : getFieldByName(fields, filedName));} else {throw new IllegalArgumentException("params is illegal");}}public static List<Field> getFieldByName(List<Field> fields, String fieldName) {if (fields != null && fields.size() != 0 && !StringUtils.isEmpty(fieldName)) {List<Field> foundFields = new ArrayList();Iterator var3 = fields.iterator();while(var3.hasNext()) {Field field = (Field)var3.next();String name = field.getName();if (fieldName.equals(name)) {foundFields.add(field);}}return foundFields;} else {throw new IllegalArgumentException("params is illegal");}}public static boolean isFiledWithName(Field field, String fieldName) {if (field != null && !StringUtils.isEmpty(fieldName)) {return fieldName.equals(field.getName());} else {throw new IllegalArgumentException("params is illegal");}}public static String getFieldValueByFieldName(String fieldName, Object object) {try {Field field = object.getClass().getDeclaredField(fieldName);field.setAccessible(true);Object hisValue = field.get(object);return null == hisValue ? "" : hisValue.toString();} catch (Exception var4) {return "";}}public static Object getFieldValue(Object obj, String fieldName, boolean isTrimSpace) {Object val = null;if (obj instanceof Map) {val = ((Map)obj).get(fieldName);} else {val = getProperty(obj, fieldName);}if (val != null && val instanceof String && isTrimSpace) {val = ((String)val).trim();if ("".equals(val)) {val = null;}}return val;}private static Object getProperty(Object obj, String fieldName) {PropertyDescriptor pd = getPropertyDescriptor(obj.getClass(), fieldName);if (pd != null && pd.getReadMethod() != null) {try {return pd.getReadMethod().invoke(obj, (Object[])null);} catch (Exception var4) {throw new RuntimeException(var4);}} else {throw new IllegalStateException("In class" + obj.getClass() + ", no getter method found for field '" + fieldName + "'");}}private static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String propertyName) {return BeanUtils.getPropertyDescriptor(clazz, propertyName);}
}

自定义类,重写相关方法,设置默认值

public abstract class BaseService<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> {protected Log log = LogFactory.getLog(this.getClass());@Autowiredprotected M baseMapper;public boolean save(T entity) {this.beforeSave(entity);return super.save(entity);}public boolean updateById(T entity) {this.beforeUpdate(entity);return super.updateById(entity);}public boolean auditById(T entity) {this.beforeAudit(entity);return super.updateById(entity);}protected void beforeSave(Object object) {LocalDateTime now = LocalDateTime.now();// 可根据项目中具体情况获取当前登录信息String userLogin = "admin";ReflectUtil.setFieldValue(object, "createBy", userLogin);ReflectUtil.setFieldValue(object, "createDate", now);ReflectUtil.setFieldValue(object, "modifyBy", userLogin);ReflectUtil.setFieldValue(object, "modifyDate", now);}protected void beforeUpdate(Object object) {LocalDateTime now = LocalDateTime.now();String userLogin = "admin";ReflectUtil.setFieldValue(object, "modifyBy", userLogin);ReflectUtil.setFieldValue(object, "modifyDate", now);}protected void beforeAudit(Object object) {LocalDateTime now = LocalDateTime.now();String userLogin = "admin";ReflectUtil.setFieldValue(object, "auditBy", userLogin);ReflectUtil.setFieldValue(object, "auditDate", now);}
}

项目中统一继承BaseService类即可

@Slf4j
@Service
public class UserServiceImpl extends BaseService<UserMapper, User> {
}

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

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

相关文章

C++之强制转换

在C中&#xff0c;类型强制转换有四种主要的形式&#xff0c;分别是&#xff1a;static_cast、dynamic_cast、const_cast和reinterpret_cast。每种类型转换都有其特定的用途和限制。 static_cast: 主要用于常见的类型转换&#xff0c;如数值类型之间的转换&#xff0c;父子类指…

基于springboot的校园商铺管理系统

功能结构图&#xff1a; 实现图&#xff1a; 后台功能&#xff1a; 商品管理 公告管理 前台页面 详情 订单 我的订单

SciencePub学术刊源 | 7月SCI/SSCI/EI/CNKI刊源表已更新!(内含TOP及CCF推荐)

【SciencePub学术】我处SciencePub学术2024年7月SCI/SSCI/EI/CNKI刊源表已更新&#xff01;内含多本中科院TOP、CCF推荐以及进展超顺的优质期刊&#xff0c;最快1-3个月录用&#xff01; 计算机领域重点SCI 环境地质化学领域重点SCI 生物医学领域重点SCI 数学材料领域重点SCI 各…

【CH32V305FBP6】USBD 初始化分析

文章目录 前言实现时钟初始化分析USBD 设备初始化分析端点初始化分析 前言 分析 V305 USBD 初始化程序。 实现 初始化 /* main.c */ int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);SystemCoreClockUpdate();// USB 初始化USBHS_RCC_Init();USBHS_Device…

[AIGC] Spring Boot 整合 ClickHouse:优雅使用的指南

在大数据处理的场景中&#xff0c;ClickHouse的极高效率和强大功能使其在众多数据库系统中脱领而出。而Spring Boot作为流行的Java框架&#xff0c;与ClickHouse的结合&#xff0c;将使得数据分析如虎添翼。 文章目录 1. 添加依赖2. 配置连接3. 创建连接工厂4. 执行SQL操作 接下…

同星TTS系列产品全新亮相:让开发测试变得更简单!

TTS系列产品 如果需要完整地测试 ECU&#xff0c;不仅需要将通信网络连接到测试系统&#xff0c;还需要连接 I/O 接口。同星的TTS测试系统将连接 I/O 通道所需的所有电路组件集成在一个模块中&#xff0c;可以极大地简化测试台架和HIL测试系统的设置&#xff0c;提高搭建和测试…

武汉星起航:跨境电商领域的领航者,助力合作伙伴全球布局

在跨境电商的汹涌浪潮中&#xff0c;武汉星起航电子商务有限公司如同一颗璀璨的明星&#xff0c;自2017年起便以亚马逊自营店铺为核心业务&#xff0c;不断积累实战运营经验&#xff0c;逐步建立了自己在市场中的稳固地位。随着2020年公司的正式成立&#xff0c;武汉星起航明确…

layui 中 css 如何设置input placeholder 字体颜色和大小

在 Layui 中设置输入框&#xff08;input&#xff09;的占位符&#xff08;placeholder&#xff09;的字体颜色和大小&#xff0c;可以通过 CSS 来实现。以下是具体的步骤&#xff1a; 1. 添加 CSS 样式&#xff1a;在你的 CSS 文件或 <style> 标签中添加自定义样式。 …

学习笔记——动态路由——IS-IS中间系统到中间系统(背景)

一、IS-IS技术背景 1、前言 IS-IS最初是国际标准化组织ISO(the International Organization for Standardization)为它的无连接网络协议CLNP(ConnectionLess Network Protocol)设计的一种动态路由协议。 和OSPF一样&#xff0c;IS-IS也是一种基于链路状态并使用最短路径优先…

浅谈制造企业如何借力EHS,让安全管理上新台阶

当今商业环境中&#xff0c;企业管理不仅关注经济效益&#xff0c;更将目光投向了长远发展的基石——EHS&#xff08;环境Environment、健康Health、安全Safety&#xff09;管理体系。这一体系的崛起&#xff0c;标志着企业管理理念的一次深刻变革&#xff0c;它如同企业的守护…

Chisel学习笔记(1)——Chisel安装与Verilog代码仿真

参考链接&#xff1a; https://www.chisel-lang.org/docs/installation 使用Chisel语言编写硬件描述语言&#xff0c;相比于使用Verilog会更加地灵敏快捷&#xff0c;Coding效率更高&#xff0c;但似乎debug会出现一些小问题。但新工具还是要尝试一下才知道好不好用。 1 安装C…

构建RAG+nebula graph(知识图谱KG)

目标&#xff1a;通过利用 LlamaIndex 和 NebulaGraph 为费城费城人队&#xff08;Philadelphia Phillies&#xff09;构建一个RAG流程&#xff0c;深入探讨知识图谱。 NebulaGraph 是市场上最好的知识图谱数据库之一。它是开源的、分布式的&#xff0c;并且能够处理具有亿万边…

【linux】网络基础(2)——udp协议

文章目录 引言udp协议的特点udp的头部结构UDP的工作原理简单的UDP网络程序套接字的认识udp服务端代码udp客户端代码服务端运行 引言 用户数据报协议&#xff08;User Datagram Protocol, UDP&#xff09;是一种无连接的传输层协议。它是因特网协议家族的一部分&#xff0c;定义…

表单长时间无响应,页面失效提示

先贴代码&#xff0c;有时间在解释 <template><div :class"$style.root"><div>主页面</div><el-input v-model"txt" input"onChange" /></div> </template> <script> const TIME 10; //时间&…

C语言的数据结构:图的基本概念

前言 之前学过了其它的数据结构&#xff0c;如&#xff1a; 集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。 线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个&#xff0c;如线性表、栈、队列&#xff0c;每一个节点和其它节点之间的关系 一个对一个…

超酷的打字机效果?分享 1 段优质 CSS 代码片段!

大家好&#xff0c;我是大澈&#xff01; 本文约 900 字&#xff0c;整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段优质 CSS 代码片段&#xff0c;实现打字机般的效果或其他类似的离散动画效果。 老规矩&#xff0c;先阅读代码片段并思考&#xff0c;再看代…

Python入门 2024/7/2

目录 格式化的精度控制 字符串格式化 对表达式进行格式化 小练习&#xff08;股票计算小程序&#xff09; 数据输入 布尔类型和比较运算符 if语句 小练习&#xff08;成人判断&#xff09; if-else语句 if-elif-else语句 练习&#xff1a;猜猜心里数字 嵌套语句 猜…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(四)Jenkins配置

一、背景 Jenkins&#xff08;本地宿主机搭建&#xff09; 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码&#xff08;可不改&#xff0c;如果运行报allure找不到就直接注释掉&#xff09; …

offer7.重建二叉树

根据二叉树的前序遍历和中序遍历重建二叉树 问题描述&#xff1a;输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如&#xff0c;输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3…

二叉树之遍历OJ(含迭代)

目录 1.递归实现 前言 &#xff08;1&#xff09;前序遍历 &#xff08;2&#xff09;中序遍历 &#xff08;3&#xff09;后序遍历 2.迭代实现 前言 &#xff08;1&#xff09;前序遍历 方法一 方法二 &#xff08;2&#xff09;中序遍历 方法一 方法二 &#x…