当前位置: 首页 > news >正文

公共字段自动填充

问题分析

  • 总会有些公共字段,例如创建时间和创建人

在这里插入图片描述

实现思路

  • 对mapper定义注解,使用切面思想来判断是不是更新和新增操作
  • 对于指定的操作来更新公共字段

在这里插入图片描述

自定义操作类型

在这里插入图片描述

package com.sky.enumeration;/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}

自定义注解AutoFill

在这里插入图片描述

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 {OperationType value();
}

自定义切面

  1. 定义切点
  2. 获取当前的mapper方法的具体操作类型
  3. 获取当前的mapper方法的参数 实体对象entity
  4. 获取要填充的数据
  5. 根据操作类型进行填充
package com.sky.aspect;import cn.hutool.core.util.ObjectUtil;
import com.sky.annotation.AutoFill;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import com.sky.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
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.time.LocalDateTime;import static com.sky.constant.AutoFillConstant.*;
import static com.sky.constant.MessageConstant.AUTO_FILL_FAILED;/*** 自动填充切面*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {// 切入点// mapper包下的所有方法 所有的参数类型@Pointcut("execution(* com.sky.mapper..*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut() {}// 前置通知 在方法执行之前执行// 进行自动填充@Before("autoFillPointCut()")public void before(JoinPoint joinPoint) {log.info("自动填充切面执行");// 获取当前的mapper方法的具体操作类型MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();OperationType operationType = methodSignature.getMethod().getAnnotation(AutoFill.class).value();// 获取当前的mapper方法的参数 实体对象entityObject[] args = joinPoint.getArgs();//非空判断if(ObjectUtil.isEmpty(args)) return;// 获取实体对象Object entity = args[0];// 获取要填充的数据// 获取当前登录用户的信息Long currentUserId = BaseContext.getCurrentId();// 获取当前时间LocalDateTime now = LocalDateTime.now();// 根据操作类型进行填充switch (operationType) {case INSERT:// 插入操作try {entity.getClass().getMethod(SET_CREATE_USER, Long.class).invoke(entity, currentUserId);entity.getClass().getMethod(SET_UPDATE_USER, Long.class).invoke(entity, currentUserId);entity.getClass().getMethod(SET_CREATE_TIME, LocalDateTime.class).invoke(entity, now);entity.getClass().getMethod(SET_UPDATE_TIME, LocalDateTime.class).invoke(entity, now);} catch (Exception e) {log.error(AUTO_FILL_FAILED, e);throw new BaseException(AUTO_FILL_FAILED);}break;case UPDATE:// 更新操作try {entity.getClass().getMethod(SET_UPDATE_USER, Long.class).invoke(entity, currentUserId);entity.getClass().getMethod(SET_UPDATE_TIME, LocalDateTime.class).invoke(entity, now);} catch (Exception e) {log.error(AUTO_FILL_FAILED, e);throw new BaseException(AUTO_FILL_FAILED);}break;default:break;}}
}

使用

    @AutoFill(OperationType.UPDATE)void update(Category category);
    @AutoFill(OperationType.INSERT)@Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +" VALUES" +" (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")void insert(Category category);

相关文章:

公共字段自动填充

问题分析 总会有些公共字段,例如创建时间和创建人 实现思路 对mapper定义注解,使用切面思想来判断是不是更新和新增操作对于指定的操作来更新公共字段 自定义操作类型 package com.sky.enumeration;/*** 数据库操作类型*/ public enum OperationType {/*…...

超详细 Git 教程:二十篇博客,三万字干货

Git 是最流行的版本管理工具,可以说是任何程序员都应该掌握的工具。 当然,其他人也可以学习它用来进行版本控制 为此,我将之前学习 Git 时的笔记整理了下(预计有二十篇),作为博客发出来,希望能帮…...

“出参”和“入参”的命名由来

有些开发者会用“入参”和“出参”来描述函数、方法或接口的参数和返回值。尽管我们基本都知道“入参”就是方法的参数,“出参”就是返回值。但是对于一些起步就是JAVA的开发者来说,可能并不清楚这两个名词的由来。这篇文章就来分享一下关于“入参”和“…...

webrtc gclient sync报错问题解决

报错信息 strp_current_url current_url[:-4] if current_url.endswith( ^^^^^^^^^^^^^^^^^^^^ AttributeError: ‘NoneType’ object has no attribute ‘endswith’ gclient syncsrc/base (ERROR) ---------------------------------------- [0:00:00] Started. ----------…...

FLUX模型,或许这几点你还未曾都了解,最详细的Flux模型介绍(附模型安装包)

当我们还在沉浸在惊叹和体验快手的Kolors模型之时,SD原开发团队组成的“黑森林”出的FLUX模型就袭来了。我们不得不感叹FLUX模型给我们带来的冲击,模型所绘制的画面质感、精细度的确让我们眼前一亮,之前发布的SD3开源模型给我们带来的些许失落…...

RAG(Retrieval-Augmented Generation)检索增强生成技术基础了解学习与实践

RAG(Retrieval-Augmented Generation)是一种结合了信息检索(Retrieval)和生成模型(Generation)的技术,旨在提高生成模型的性能和准确性。RAG 技术通过在生成过程中引入外部知识库,使…...

基于SpringBoot实现高性能缓存组件

1. 简介 为了体现我们的实力,首先我们要有造轮子的能力。这意味着我们不仅要熟练掌握现有的技术栈和框架,还要具备深厚的技术功底。通过自主设计和实现关键组件,如高性能缓存系统,我们能够深入理解技术背后的原理,掌握…...

【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 详细理解并附实现代码。

【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN) 文章目录 【深度学习基础模型】递归神经网络 (Recurrent Neural Networks, RNN)1.算法原理介绍:递归神经网络 (Recurrent…...

python全栈学习记录(十九) hashlib、shutil和tarfile、configparser

hashlib、shutil和tarfile、configparser 文章目录 hashlib、shutil和tarfile、configparser一、hashlib二、shutil和tarfile1.shutil2.tarfile 三、configparser 一、hashlib hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。如果把hash…...

RL进阶(一):变分推断、生成模型、SAC

参考资料: 视频课程《CS285: Deep Reinforcement Learning, Decision Making, and Control》第18讲、第19讲,Sergey Levine,UCerkeley课件PDF下载:https://rail.eecs.berkeley.edu/deeprlcourse/主要内容:变分推断、生成模型、以及Soft Actor-Critic。变分推断在model-bas…...

WPF 绑定 DataGrid 里面 Button点击事件 TextBlock 双击事件

TextBlock双击事件 <DataGridTemplateColumn Width"*" Header"内标"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBlockBackground"Transparent"Tag"{Binding InternalId}"Text"…...

828华为云征文|华为云Flexus云服务器X实例Windows系统部署一键短视频生成AI工具moneyprinter

在追求创新与效率并重的今天&#xff0c;我们公司迎难而上&#xff0c;决定自主搭建一款短视频生成AI工具——MoneyPrinter&#xff0c;旨在为市场带来前所未有的创意风暴。面对服务器选择的难题&#xff0c;我们经过深思熟虑与多方比较&#xff0c;最终将信任票投给了华为云Fl…...

非标精密五金加工的技术要求

非标精密五金加工在现代制造业中占据着重要地位&#xff0c;其对于产品的精度、质量和性能有着较高的要求。以下是时利和整理的其具体的技术要求&#xff1a; 一、高精度的加工设备 非标精密五金加工需要先进的加工设备来保证加工精度。例如&#xff0c;高精度的数控机床是必不…...

新手小白怎么通过云服务器跑pytorch?

新手小白怎么通过云服务器跑pytorch&#xff1f;安装PyTorch的步骤可以根据不同的操作系统和需求有所差异&#xff0c;通过云服务器运行PyTorch的过程主要包括选择GPU云服务器平台、配置服务器环境、部署和运行PyTorch模型、优化性能等步骤。具体步骤如下&#xff1a; 第一步&a…...

Spring 全家桶使用教程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Spark SQL性能优化高频面试题及答案

目录 高频面试题及答案1. 如何通过分区&#xff08;Partitioning&#xff09;优化Spark SQL查询性能&#xff1f;2. 什么是数据倾斜&#xff08;Data Skew&#xff09;&#xff1f;如何优化&#xff1f;3. 如何使用广播&#xff08;Broadcast&#xff09;优化Join操作&#xff…...

云原生链路观测平台 openobserve + fluent-bit,日志收集

grpc-opentracing https://github.com/grpc-ecosystem/grpc-opentracing openobserve fluent-bit 为啥会选择这个组合 一个 rust 写的一个是c写的&#xff0c;性能和内存方面不用担心&#xff0c;比java 那套好太多了 openobserve 文档 &#xff1a;https://openobserve.ai/…...

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务&#xff0c;车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说&#xff0c;如何将自己的应用程序无缝集成到车载系统中&#xff0c;利用汽车的硬件和服务能力&#xff0c;是一个极具挑战性…...

【Linux网络 —— 网络基础概念】

Linux网络 —— 网络基础概念 计算机网络背景网络发展 初始协议协议分层协议分层的好处 OSI七层模型TCP/IP五层(或四层)模型 再识协议为什么要有TCP/IP协议&#xff1f;什么是TCP/IP协议&#xff1f;TCP/IP协议与操作系统的关系所以究竟什么是协议&#xff1f; 网络传输基本流程…...

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...