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());
	@Autowired
    protected 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.mfbz.cn/a/761399.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目方案:社会视频资源整合接入汇聚系统解决方案(八)---视频监控汇聚应用案例

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分…

多片体育场地建球馆,就选气膜球馆—轻空间

随着现代社会对健康生活的追求日益增加&#xff0c;体育场地的需求也在不断增长。尤其是羽毛球作为一项受欢迎的全民运动&#xff0c;其场地需求量更是与日俱增。在众多的球馆建设方案中&#xff0c;气膜球馆因其独特的优势&#xff0c;正逐渐成为多片体育场地建设的最佳选择。…

微尺度气象数值模拟—大涡模拟技术

原文链接&#xff1a;微尺度气象数值模拟—大涡模拟技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247607904&idx4&snc02e7b7b104c500626cc7456c819112a&chksmfa826787cdf5ee91860e66b4f45532b995760edc1780cdde52bb8b36349b9b997392d21aed18&…

为什么安装了SSL证书还是不能HTTPS访问?

即便是正确安装了SSL证书&#xff0c;有时网站仍然无法通过HTTPS正常访问&#xff0c;这背后可能隐藏着多种原因。以下是一些常见的问题及解决方案&#xff0c;帮助您排查并解决这一困扰。 PC点此申请&#xff1a;SSL证书申请_https证书下载-极速签发 注册填写注册码230918&a…

mysql-5.6.26-winx64免安装版本

mysql为什么要使用免安装 MySQL 提供免安装版本主要有以下几个原因和优势&#xff1a; 便捷性&#xff1a;用户无需经历安装过程&#xff0c;直接解压即可使用。这对于需要快速部署环境或者在不支持安装权限的系统上使用MySQL非常有用。灵活性&#xff1a;免安装版允许用户将…

基于SSM的挂号系统(简单)

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SSMJSP 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 首页 登录 查看医生信息 挂号 挂号记录查看 个人信息查看 需要可加V分享源码 package com.hg.controller;impor…

idk17配置

只需要把zip包解压&#xff0c;然后配置环境变量&#xff1a; bin目录路径粘到path里面就好了 然后打开cmd窗口分别输入 java javac java -version 验证

IT专业入门,高考假期预习指南

文章目录 一、了解IT专业的基本概念二、选择适合的编程语言入门三、掌握基本的编程工具和环境四、学习基础的数据结构和算法五、实践项目和动手实验六、利用在线资源进行学习七、参加编程竞赛和社区活动总结 高考结束后&#xff0c;许多同学将迎来大学生活&#xff0c;而对于选…

ARP 原理详解 二

只要确定了 IP 地址后&#xff0c;就能够向这个 IP 地址所在的主机发送数据报&#xff0c;这是我们所熟知的事情。 但是再往深了想&#xff0c;IP 地址只是标识网络层的地址&#xff0c;那么在网络层下方数据链路层是不是也有一个地址能够告诉对方主机自己的地址呢&#xff1f…

【Python画图-循环01】一文叫你搭建python画图最优环境配置

【Python画图-循环01】一文叫你搭建python画图最优环境配置 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#…

突发!1本“On Hold”期刊惨遭除名!共12本期刊被剔除!Scopus目录更新!

【欧亚科睿学术】 近期&#xff0c;爱思唯尔更新了Scopus期刊目录&#xff0c;这是本年度的第五次更新。 图片来源&#xff1a;Elsevier 本次Scopus来源出版物列表(Scopus Sources)共有46097本期刊被收录。其中&#xff0c;有12本期刊不再被数据库收录(Discontinued titles)&a…

复制 pdf 的表格到 markdown 版本的Typora 或者 word 中

在 pdf 中选中复制表格内容&#xff0c;直接粘贴到 typora 中失败&#xff0c;可以使用 txt文件和 excel 做过渡。 准备一个空的 txt 文件&#xff0c;将 pdf 中表格的数据复制粘贴到txt文件中&#xff0c;文本内容会以空格分开&#xff0c;如下图的形式&#xff1a; 打开 exc…

[Shell编程学习路线]——shell脚本中case语句多分支选择详解

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月21日16点30分 &#x1f004;️文章质量&#xff1a;95分 ————前言———— 在Shell编程中&#xff0c;处理多种条件…

简单爬虫案例——爬取快手视频

网址&#xff1a;aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3NlYXJjaC92aWRlbz9zZWFyY2hLZXk9JUU2JThCJTg5JUU5JTlEJUEy 找到视频接口&#xff1a; 视频链接在photourl中 完整代码&#xff1a; import requestsimport re url https://www.kuaishou.com/graphql cookies {did: web_…

SpringCloud-服务网关-Gateway

1.服务网关在微服务中的应用 (1)对外提供服务的难题分析&#xff1a; 微服务架构下的应用系统体系很庞大&#xff0c;光是需要独立部署的基础组件就有注册中心、配置中心和服务总线、Turbine异常聚合和监控大盘、调用链追踪器和链路聚合&#xff0c;还有Kaka和MQ之类的中间件&…

最短路模型——AcWing 188. 武士风度的牛

最短路模型 定义 最短路模型是图论中的一个经典问题&#xff0c;旨在寻找从图中一个顶点到另一个顶点的路径&#xff0c;使得这条路径上的边&#xff08;或边的权重&#xff09;之和最小。这一模型在许多实际问题中有着广泛的应用&#xff0c;比如网络路由、地图导航、物流配…

AI绘画-Stable Diffusion 原理介绍及使用

引言 好像很多朋友对AI绘图有兴趣&#xff0c;AI绘画背后&#xff0c;依旧是大模型的训练。但绘图类AI对计算机显卡有较高要求。建议先了解基本原理及如何使用&#xff0c;在看看如何实现自己垂直行业的绘图AI逻辑。或者作为使用者&#xff0c;调用已有的server接口。 首先需…

Advanced slides插件无法预览幻灯片

advanced-slides的官方地址&#xff1a; MSzturc/obsidian-advanced-slides: Create markdown-based reveal.js presentations in Obsidian (github.com) 官方教程和文档&#xff1a; Advanced Slides Documentation (mszturc.github.io) 中文版也有博客翻译了&#xff1a;Ob…

[数据集][目标检测]桥梁检测数据集VOC+YOLO格式1116张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1116 标注数量(xml文件个数)&#xff1a;1116 标注数量(txt文件个数)&#xff1a;1116 标注…

51单片机第21步_将TIM0用作两个8位定时器同时将TIM1用作波特率发生器

本章重点讲解将TIM0用作两个8位定时器&#xff0c;同时将TIM1用作波特率发生器。 当定时器T0在方式3时&#xff0c;T1不能产生中断&#xff0c;但可以正常工作在方式0、1、2下&#xff0c;大多数情况下&#xff0c;T1将用作串口的波特率发生器。 1、定时器0工作在模式3框图&a…