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,一经查实,立即删除!

相关文章

基于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 各…

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

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

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

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

基于微信小程序的优鲜易购平台设计与实现

系统摘要 随着网络科技的迅速发展以及社会大众消费习惯的转变,微信小程序逐渐以其便捷性和易用性引起了人们的广泛关注。本文意在研发设计并实现一种基于微信小程序开发的优鲜商品易购系统,即一个专注于生鲜产品网上选购服务的买菜网站,利用SpringBoot和Vue.js的技术栈…

学习笔记——动态路由——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;定义…

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…

BIOS设置与系统分区

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

《植物大战僵尸融合版》1.0预览版下载以及安装教程

游戏介绍 《植物大战僵尸融合版》是一款基于经典游戏《植物大战僵尸》的创新改版&#xff0c;由B站UP主蓝飘飘fly开发。这款游戏的特色在于引入了植物融合系统&#xff0c;允许玩家将两种不同的植物合体&#xff0c;创造出具有新特性的植物&#xff0c;从而带来全新的策略对战…

Canvas:掌握贝塞尔曲线与封装路径

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

文件夹加密软件推荐,这款软件满足各种加密需求

文件夹加密是保护电脑数据安全的重要方式&#xff0c;而在加密文件夹时&#xff0c;我们需要选择专业的文件夹加密软件。下面小编就为大家推荐一款优秀的文件夹加密软件&#xff0c;满足你的各种文件夹加密需求。 文件夹加密超级大师 由于文件夹储存的数据不同&#xff0c;比如…