中山古镇做网站的公司/网站建设建站在线建站
文章目录
-
- 概要
- 整体架构流程
- 技术细节
- 小结
概要
在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表中都会有这些字段,如下:
序号 | 字段名 | 含义 | 数据类型 |
---|---|---|---|
1 | create_time | 创建时间 | datetime |
2 | create_user | 创建人id | bigint |
3 | update_time | 修改时间 | datetime |
4 | update_user | 修改人id | bigint |
而针对于这些字段,我们的赋值方式为:
1). 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。
2). 在更新数据时, 将updateTime 设置为当前时间, updateUser设置为当前登录用户ID。
我们使用AOP切面编程,实现功能增强,来完成公共字段自动填充功能。
技术细节
在实现公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。在上述的问题分析中,我们提到有四个公共字段,需要在新增/更新中进行赋值操作, 具体情况如下:
序号 | 字段名 | 含义 | 数据类型 | 操作类型 |
---|---|---|---|---|
1 | create_time | 创建时间 | datetime | insert |
2 | create_user | 创建人id | bigint | insert |
3 | update_time | 修改时间 | datetime | insert、update |
4 | update_user | 修改人id | bigint | insert、update |
实现步骤:
1). 自定义注解 AutoFill,用于标识需要进行公共字段自动填充的方法
2). 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值
3). 在 Mapper 的方法上加入 AutoFill 注解
若要实现上述步骤,需掌握以下知识(之前课程内容都学过)
技术点:枚举、注解、AOP、反射
- 枚举类:
package com.sky.enumeration;/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}
- 自定义注解:
package com.sky.annotation;import com.sky.enumeration.OperationType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解,用于标识某个方法需要进行功能字段自动填充处理*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//数据库操作类型:UPDATE INSERTOperationType value();
}
- 自定义切面类:
- 公共字段填充,我们选择在连接点(方法)执行前就进行,所以用@Before
- 将连接点上的@AutoFill注解拦截下
- 利用注解的.value()获取到注解中的内容(数据库操作类型)
- 获取到该连接点的参数
- 准备好填充的内容
- 利用反射根据数据库操作类型进行填充
-
package com.sky.aspect;import com.sky.annotation.AutoFIll; import com.sky.constant.AutoFillConstant; import com.sky.context.BaseContext; import com.sky.enumeration.OperationType; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component;import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.time.LocalDateTime;@Aspect @Slf4j @Component public class AutoFillAspect {//切入点@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFIll)")public void autoFillPointCut() {}//前置通知,在通知中进行公共字段的赋值@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint) {log.info("进行公共字段赋值");//获取当前被拦截方法上的注解AutoFIll autoFIll = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(AutoFIll.class);//MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象//AutoFIll autoFill = signature.getMethod().getAnnotation(AutoFIll.class);//获取数据库操作类型(INSERT,UPDATE)OperationType operationType = autoFIll.value();//获取当前被拦截方法上的参数(实体对象)Object[] args = joinPoint.getArgs();if (args == null || args.length == 0) {return;}Object entity = args[0];//准备要填充的内容LocalDateTime now = LocalDateTime.now();Long id = BaseContext.getCurrentId();//根据数据库操作类型进行赋值if (operationType == OperationType.INSERT) {try {Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setCreateTime.invoke(entity, now);setCreateUser.invoke(entity, id);setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, id);} catch (Exception e) {e.printStackTrace();}} else if (operationType == operationType.UPDATE) {try {Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);setUpdateTime.invoke(entity, now);setUpdateUser.invoke(entity, id);} catch (Exception e) {e.printStackTrace();}}} }
@AutoFIll(value = OperationType.INSERT)void insert(Dish dish);
效果展示
相关文章:

使用SpringAOP实现公共字段填充
文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表…...

c++初阶-----适配器---priority_queue
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...

VSCode上安装C#环境教程
本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…...

VS Code 和 Visual Studio 哪个更好
文章目录 VS Code 和 Visual Studio 哪个更好Visual Studio Code简介Visual Studio简介相同点差异点总结 VS Code 和 Visual Studio 哪个更好 Visual Studio Code简介 Visual Studio Code(简称 VS Code)是一款开源的、免费的、跨平台的、轻量级的代码编…...

FCA-数据分析理论试卷
其他参考: https://segmentfault.com/a/1190000043363073 https://blog.csdn.net/CSDN_WYY/article/details/137082340 Part.1:判断题(总分:8分 得分:8) 第1题 判断题 对任意事件A和B,必有 …...

WPF程序通过CadLib4加载CAD .dwg格式文件
1、下载CadLib相关dll文件,主要用到的:WW.dll、WW.Cad.dll、WW.GL.dll 2、程序中引用dll库。 3、创建WPF程序,使用Canvas来加载dwg文件,支持拖动和放大缩小。 4、部分代码: public void Init(string filename) {tr…...

图表全能王(ChartStudio) 上架VisionPro!
图表全能王(ChartStudio) - 终极图表制作工具!支持条形图、折线图、面积图、柱形图、条形图、饼图、玫瑰图、雷达图、牛肉图、风琴图、旭日图、桑基图等图表。 https://apps.apple.com/app/chartstudio-data-analysis/id6474099675 https://apps.apple.com/cn/app/…...

【云原生】Job一次性任务详解
Job一次性任务 文章目录 Job一次性任务一、Job介绍二、运行示例Job 一、Job介绍 Job会创建一个或者多个Pod,并将继续重试Pod的执行,直到指定数量的Pod成功终止。随着Pod成功借宿,Job跟踪记录成功完成的Pod个数。当数量达到指定的成功个数阈值…...

化工厂人员定位采用多种定位技术的融合定位系统的好处
由于化工厂内环境的复杂性和危险性,通常单一的定位技术很难满足全厂区的人员定位需求,如果能将不同定位技术融合在一起,发挥出它们各自的优势,那么就能解决以上问题。 融合定位技术诞生背景 随着科技的不断发展,多种定…...

使用AI绘图工具生成风景图像的教程
随着人工智能技术的飞速发展,AI绘图工具在图像生成和艺术创作方面变得越来越强大,无论你是一个设计师、艺术家,还是仅仅对生成艺术感兴趣的爱好者,AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中,…...

迷你主机:华硕PN65和nuc13pro如何选择?
华硕PN65与NUC 13 Pro:如何做出选择? 在追求高效能与便携性的今天,迷你主机成为了越来越多用户的选择。华硕PN65与英特尔NUC 13 Pro作为市场上两款备受瞩目的产品,各自拥有独特的优势和特点。本文将从处理器性能、扩展性、接口丰…...

分享一个好用的印花重绘工具
本文向大家介绍一款革命性的 AI 工具,它能够将模糊不清的图片转化为具有照片级别的高清图像。这项前沿项目依托于大规模人工智能技术,革新了图像恢复领域。通过文本驱动和智能修复功能,它巧妙地结合了先进的 AI 技术与创新理念,为…...

力扣题解(递增的三元子序列)
334. 递增的三元子序列 给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则&#…...

做不好PPT的原因
新手制作PPT长犯的10个错误 1.Word搬家 为了节约时间,直接把Word素材复制粘贴到PPT上,没有提炼 2.堆积图表 每个页面上堆积了大量的图表,却没有说明数据反映了什么趋势 3.图表业余 想用图表达自己的逻辑,但没有专业的模板&a…...

嵌入式人工智能(45-基于树莓派4B的扩展板-舵机驱动板PCA9685)
1、简介 智能小车、机械臂、摄像头云台会有多个舵机,而微控制器芯片的PWM输出引脚不够的情况下,就可以用PCA9685(16路舵机)来解决这一问题。 PCA9685是一款I2C总线控制的16通道LED控制器,专为红/绿/蓝/琥珀ÿ…...

【数据结构与算法】建立多个栈的三种方案的优缺点分析
在一个算法中需要建立多个栈时可以选用以下三种方案之一,试问这三方案相比各有什么优缺点? (1)分别用多个顺序存储空间建立多个独立的顺序栈。 (2)多个栈共享一个顺序存储空间。 (3)…...

DjangoRF-14-创建request子应用
注意,本应该是requests模块,为了区分,避免错误,用request 1、进入apps,创建request django-admin startapp request 2、因为只发送请求,没有数据库相关,不需要model。 3、进行序列化 from rest_framework …...

SOMEIP_ETS_005:检查字节序
测试目的: 验证DUT在发送和接收参数时对字节序的处理能力。 描述 本测试用例旨在检验DUT在处理具有不同字节序的参数时,是否能够正确地发送和接收数据,并确保返回的UINT32值是传入的两个参数(UINT8和UINT16)的和。 …...

为什么要对医疗器械进行网络安全评估?
对医疗器械进行网络安全评估的原因主要有以下几点: 一、保障患者安全 直接关联患者健康:医疗器械与患者的生命健康直接相关,任何网络安全漏洞都可能导致设备被非法控制或数据泄露,进而威胁患者的生命安全。例如,黑客可…...

沃尔玛1P账号的强悍作用重要反映在那些方面?——WAYLI威利跨境助力商家
沃尔玛作为全球最大的零售商之一,其品牌影响力非常强大。商家通过入驻沃尔玛商超并开设1P账号,能够借助沃尔玛的品牌影响力来提升自身的品牌知名度和美誉度。这种品牌背书的效应,有助于商家吸引更多的消费者关注和购买自己的产品。 一、沃尔玛…...

学习python你不能不知道的几个接单平台!实现如月上万不是梦
学Python后,寻找兼职平台是一个很好的实践和提升技能的方式。以下是一些比较推荐的Python兼职平台: 国内平台 程序员客栈 网址:https://www.proginn.com介绍:程序员客栈是中国非常领先的自由工作平台,为中高端程序员、…...

Golang面试题三(map)
1.map底层实现 由图看出,其实map的底层结构体是hmap,同时hmap里面维护着若干个bucket数组(即桶数组)。bucket数组中每个元素都是bmap结构的,bmap中存储着8个key-value的键值对,如果是满了的话,当…...

[windows10]win10永久禁用系统自动更新操作方法
WinR打开运行 输入regedit打开注册表 点击确定打开注册表 按照如下路径找到UX 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 在空白处点击鼠标右键,新建选择DWORD,然后重命名为FlightSettingsMaxPauseDays 双击FlightSet…...

《西行取经:大学生编程之路的禅悟与陷阱规避2》
《西行取经:大学生编程之路的禅悟与陷阱规避2》 阿弥陀佛,贫僧唐僧,虽身处古代,心却向往智慧之光。观今世大学生于编程之途,犹如我等西天取经,路途遥远且布满荆棘。今欲以吾之“取经”心得,为尔…...

JVM从入门到放弃
前言:关于JVM,其实有很多大厂开发了不同版本的JVM,比较知名的有:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、 Azul VM、 Apache Harmony、 Google Dalvik VM、 Microsoft JVM等等。现在使用的比较多的JDK8版本就是Sun HotSpot V…...

中国地面太阳总辐射逐日资料
数据内容 数据包含站点总辐射辐照度日数据 数据样例 Station_ID_CStaion_NameYearMonDayV1431154832寿光2023116.285754832寿光2023127.778354832寿光2023138.374454832寿光2023147.19154832寿光2023157.506254832寿光2023168.505254832寿光2023179.822154832寿光20231810.0…...

微商来客小程序系统源码分享
微商来客小程序系统源码,这是最新的V7.5.8版本微商来客小程序快速开发系统源码,可以无限开发生成小程序,支持快速生成微信小程序,支付宝小程序,百度小程序,QQ小程序,头条/抖音小程序。能创建的小…...

Java面试题--JVM大厂篇之Parallel GC与其他垃圾回收器的对比与选择
目录 引言: 正文: 结束语: 引言: Java工程师们,当我们在谈论JVM性能优化时,垃圾回收器(GC)无疑是一个绕不开的话题。而在所有的垃圾回收器中,Parallel GC无疑是一个备受关注的角色。今天,我们就来一探究…...

十分钟带你速通 Vue 组件
自定义组件 组件是可复用的 Vue 实例,在开发过程中,我们可以把重复用到的功能封装成自定义组件,达到便捷开发的目的。 组件的组织 通常一个应用会以一棵嵌套的组件树的形式来组织: 你可能会有头部导航、内容区、侧边栏等组件&a…...

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案
支持能源在线监测系统应用的AIOT产品方案 近年来,智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展,打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…...