公共字段自動填充

在開發中經常面臨對于一些公共字段的賦值。

如在下表中:

如何讓程序自動為我們需要賦值的公共字段進行賦值,避免在業務代碼中重復寫這些公共字段的賦值代碼

如下圖所示:

實現思路:

1.自定義注解AutoFill,用于標識需要進行公共字段自動填充的方法

2.自定義切面類AutoFillAspect,統一攔截加入了AutoFill 注解的方法,通過反射為公共字段

3.在Mapper的方法上加入 AutoFill 注解

實現步驟:

1.自定義注解

package com.yang.annotation;import com.yang.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();}

2.自定義切面類AutoFillAspect

package com.yang.aspect;import com.yang.annotation.AutoFill;
import com.yang.constant.AutoFillConstant;
import com.yang.context.BaseContext;
import com.yang.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.reflect.Method;
import java.time.LocalDateTime;/*** 自定義切面,實現公共字段填充處理邏輯*/
@Aspect
@Component
@Slf4j
public class AutoFillAspect {//指定切入點@Pointcut("execution(* com.yang.mapper.*.*(..)) && @annotation(com.yang.annotation.AutoFill)")public void autoFillPointCut(){}/*** 設置前置通知為公共字段賦值*/@Before("autoFillPointCut()")public void autoFill(JoinPoint joinPoint){log.info("開始公共字段的填充...");//獲取當前被攔截的方法的數據庫類型//方法簽名對象//因為需要訪問特定于方法的信息,比如方法名、返回類型、參數類型等,所以需要向下轉型為 MethodSignatureMethodSignature signature = (MethodSignature)joinPoint.getSignature();AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);OperationType type = autoFill.value();//獲取被攔截方法的參數--實體對象Object[] args = joinPoint.getArgs();if (args==null||args.length ==0){return;}Object entity = args[0];//準備賦值的數據LocalDateTime time = LocalDateTime.now();Long id = BaseContext.getCurrentId();//根據當前不同的操作類型,為對應的屬性賦值(通過反射)if (type.equals(OperationType.INSERT)){//為四個公共字段賦值try {//使用反射動態獲取set方法并且指定方法所接收的參數類型Method setCreateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);Method setUpdateTime = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setCreateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateUser = entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//通過反射進行賦值setCreateTime.invoke(entity,time);setUpdateTime.invoke(entity,time);setCreateUser.invoke(entity,id);setUpdateUser.invoke(entity,id);} catch (Exception e) {throw new RuntimeException(e);}}else if (type.equals(OperationType.UPDATE)){//為兩個公共字段賦值try {//使用反射動態獲取set方法并且指定方法所接收的參數類型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,time);setUpdateUser.invoke(entity,id);} catch (Exception e) {throw new RuntimeException(e);}}}}

3.在Mapper的方法上加入 AutoFill 注解

比如:

4.測試

修改前的Category表

修改方法:

新增方法:

表結果:

參考:Day03-03-公共字段自動填充_代碼開發_2_嗶哩嗶哩_bilibili

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714607.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux環境安裝cuda toolkit

1 全新安裝 如果環境中沒安裝過cuda版本, 這種情況下比較簡單。 直接在https://developer.nvidia.com/cuda-toolkit-archive選擇對應版本下載安裝即可。 如下為安裝cuda toolkit 11.8. 2 環境中已經存在其他版本 這種情況下比較復雜一些。 首先要確認最高支持的…

李沐動手學習深度學習——4.2練習

1. 在所有其他參數保持不變的情況下,更改超參數num_hiddens的值,并查看此超參數的變化對結果有何影響。確定此超參數的最佳值。 通過改變隱藏層的數量,導致就是函數擬合復雜度下降,隱藏層過多可能導致過擬合,而過少導…

Git多人合作的推送流程

多人合作時,使用Git進行代碼推動(push)需要一定的協調和規范,以確保代碼庫的整體健康。以下是一個常見的多人合作時的Git代碼推動流程: 同步主分支: 在推送之前,確保你的本地主分支(…

【Java】四大函數式接口

消費型接口Consumer 消費型接口接收一個輸入,沒有返回值 在stream流計算中 forEach() 接收一個消費型接口Consumer用于 遍歷元素 /*** 消費型接口* 接收一個輸入,沒有返回值*/ public class demo01 {public static void main(String[] args) {//TODO 消…

【MySQL】表的內連和外連(重點)

表的連接分為內連和外連。 一、內連接 內連接實際上就是利用 where 子句對兩種表形成的笛卡兒積進行篩選,前面學習的查詢都是內連接,也是在開發過程中使用的最多的連接查詢。 select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件; 注意&…

【數倉】Hadoop集群配置常用參數說明

Hadoop集群中,需要配置的文件主要包括四個 配置核心Hadoop參數: 編輯core-site.xml文件,設置Hadoop集群的基本參數,如文件系統、Hadoop臨時目錄等。 配置HDFS參數: 編輯hdfs-site.xml文件,設置HDFS的相關參…

策略開發:EMA如何計算

EMA的計算原理 EMA 是MA(平滑移動平均線)的另一種形式。全名“加權指數移動平均線”。 2/13就是12日移動平均線的平滑因子,他的意思是指:給予新價格 2/13的權重,給予過去的EMA 11/13的權重。 在計算的時候第一天的M…

Linux使用基礎命令

1.常用系統工作命令 (1).用echo命令查看SHELL變量的值 qiangziqiangzi-virtual-machine:~$ echo $SHELL /bin/bash(2).查看本機主機名 qiangziqiangzi-virtual-machine:~$ echo $HOSTNAME qiangzi-virtual-machine (3).date命令用于顯示/設置系統的時間或日期 qiangziqian…

Linux多線程服務端編程:使用muduo C++網絡庫 學習筆記 附錄B 從《C++ Primer(第4版)》入手學習C++

這是作者為《C Primer(第4版)(評注版)》寫的序言,文中“本書”指的是這本書評注版。 B.1 為什么要學習C 2009年本書作者Stanley Lippman先生應邀來華參加上海祝成科技舉辦的C技術大會,他表示人們現在還用…

MySQL存儲過程和Function

一、存儲過程 MySQL中提供存儲過程和存儲函數機制,將其統稱為存儲程序。 SQL語句要先編譯,然后執行,存儲程序是一組為了完成特定功能的SQL語句,編譯后存到數據庫中。 用戶通過指定存儲程序的名字并給定參數來調用才會執行。 存…

擴展學習|大數據分析的現狀和分類

文獻來源:[1] Mohamed A , Najafabadi M K , Wah Y B ,et al.The state of the art and taxonomy of big data analytics: view from new big data framework[J].Artificial Intelligence Review: An International Science and Engineering Journal, 2020(2):53. 下…

藍橋杯(3.2)

1209. 帶分數 import java.io.*;public class Main {static BufferedReader br new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw new PrintWriter(new OutputStreamWriter(System.out));static final int N 10;static int n, cnt;static int[…

LabVIEW流量控制系統

LabVIEW流量控制系統 為響應水下航行體操縱舵翼環量控制技術的試驗研究需求,通過LabVIEW開發了一套小量程流量控制系統。該系統能夠滿足特定流量控制范圍及精度要求,展現了其在實驗研究中的經濟性、可靠性和實用性,具有良好的推廣價值。 項…

tritonserver學習之八:redis_caches實踐

tritonserver學習之一:triton使用流程 tritonserver學習之二:tritonserver編譯 tritonserver學習之三:tritonserver運行流程 tritonserver學習之四:命令行解析 tritonserver學習之五:backend實現機制 tritonserv…

【C++初階】內存管理

目錄 一.C語言中的動態內存管理方式 二.C中的內存管理方式 1.new/delete操作內置類型 2.new和delete操作自定義類型 3.淺識拋異常 (內存申請失敗) 4.new和delete操作自定義類型 三.new和delete的實現原理 1.內置類型 2.自定義類型 一.C語…

C++學習筆記:二叉搜索樹

二叉搜索樹 什么是二叉搜索樹?搜索二叉樹的操作查找插入刪除 二叉搜索樹的應用二叉搜索樹的代碼實現K模型:KV模型 二叉搜索樹的性能怎么樣? 什么是二叉搜索樹? 二叉搜索樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹: 若它的左子樹…

Linux安裝Nginx詳細步驟

1、創建兩臺虛擬機,分別為主機和從機,區別兩臺虛擬機的IP地址 2、將Nginx素材內容上傳到/usr/local目錄(pcre,zlib,openssl,nginx) 附件 3、安裝pcre庫   3.1 cd到/usr/local目錄 3.2 tar -zxvf pcre-8.36.tar.gz 解壓 3.3 cd…

MATLAB圖像噪聲添加與濾波

在 MATLAB 中添加圖像噪聲和進行濾波通常使用以下函數: 添加噪聲:可以使用imnoise函數向圖像添加各種類型的噪聲,如高斯噪聲、椒鹽噪聲等。 濾波:可以使用各種濾波器對圖像進行濾波處理,例如中值濾波、高斯濾波等。 …

前端學習、HTML

html是由一些標簽構成的,標簽之間可以嵌套,每個標簽都有開始標簽和結束標簽,也有部分標簽只有開始標簽,沒有結束標簽。html的標簽也可以成為元素。(樹形結構) html文件的最頂層標簽就是html。 head用來放…

**藍橋OJ 178全球變暖 DFS

藍橋OJ 178全球變暖 思路: 將每一座島嶼用一個顏色scc代替, 用dx[]和dy[]判斷他的上下左右是否需要標記顏色,如果已經標記過顏色或者是海洋就跳過.后面的淹沒,實際上就是哪個塊上下左右有陸地,那么就不會被淹沒,我用一個tag標記,如果上下左右一旦有海洋,tag就變為false.如果tag…