Spring AOP實現Mapper層查詢返回重新賦值

需求:

? ? ? ? 針對查詢返回的數據,在數據庫層處理可能會影響到性能,在考慮性能及維護方便的情況下,采用AOP實現

1,自定義注解


import java.lang.annotation.*;/*** 針對 mapper層返回值 按照一定規則進行特殊處理后返回*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MapperReturnData {/*** 指定執行規則的方法,默認方法為:transferReturnData* @return*/String method() default "transferReturnData";Class<? extends MapperReturnDataInterface> operation();
}

2,定義公共業務處理接口

/*** 不同的業務場景 其 針對返回值 解析處理規則不同,須根據自身情況實現該接口* @param <T>*/
public interface MapperReturnDataInterface<R> {R transferReturnData(Object request);}

3,編寫AOP核心實現


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;/*** 針對 mapper層返參進行特殊處理*/
@Component
@Aspect
public class MapperReturnDataAspect {private static final Logger log = LoggerFactory.getLogger(MapperReturnDataAspect.class);//定義pointcut簽名@Pointcut("execution(* com.taia.yms.mapper.*.*(..)) && @annotation(com.taia.yms.aop.reponse.MapperReturnData)")private void pointCut() {//方法為空,僅做簽名}//對切點方法進行前置增強,就是在調用切點方法前進行做一些必要的操作,這就成為增強@Around("pointCut()")public Object getRes(ProceedingJoinPoint joinPoint) throws Throwable {// 獲取被攔截的方法簽名MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 獲取被攔截的方法Method method = signature.getMethod();// 獲取返回值Object returnObj = joinPoint.proceed();MapperReturnData annotation = method.getAnnotation(MapperReturnData.class);// 查找并獲取注解try{// 讀取注解的屬性Class<? extends MapperReturnDataInterface> operation = annotation.operation();MapperReturnDataInterface operationInstance = operation.getDeclaredConstructor().newInstance();String methoded = annotation.method();Method operationMethod = operation.getDeclaredMethod(methoded, Object.class);return operationMethod.invoke(operationInstance,returnObj);}catch (Exception e){log.error("類[{}]的方法[{}]執行失敗,報錯:{}",annotation.operation().getName(),annotation.method(),e.getMessage());return returnObj;}}}

4,編寫業務處理實現


import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class TechnologyGetDataTypeList implements MapperReturnDataInterface<List<String>>{@Overridepublic List<String> transferReturnData(Object request) {List<String> list = (List<String>) request;if(CollectionUtils.isEmpty(list)){return new ArrayList<>(1);}List<String> results = list.stream().map(v -> v.substring(v.indexOf("_")+1)).collect(Collectors.toList());return results;}
}

5,在mapper指定接口方法上使用

    @MapperReturnData(operation = TechnologyGetDataTypeList.class)List<String> getDataTypeList(List<String> columnList);

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

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

相關文章

Vue學習JSON.parse()與JSON.stringify()對象與字符串互轉

Vue學習JSON.parse(&#xff09;與JSON.stringify(&#xff09;對象與字符串互轉 一、前言1、代碼 一、前言 JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于處理 JSON 數據的兩個方法。 JSON.parse() 方法將一個 JSON 字符串解析為對應的 JavaScript 對象或數組。例…

kaggle競賽實戰3

接前文&#xff0c;本文主要做以下幾件事&#xff1a; 1、把前面處理完的幾個表拼成一個大表 2、做特征衍生&#xff08;把離散特征和連續特征兩兩組合得出&#xff09; # In[89]: #開始拼接表 transaction pd.concat([new_transaction, history_transaction], axis0, ignor…

JAVA實現圖書管理系統(初階)

一.抽象出對象: 1.要有書架&#xff0c;圖書&#xff0c;用戶&#xff08;包括普通用戶&#xff0c;管理員用戶&#xff09;。根據這些我們可以建立幾個包&#xff0c;來把繁雜的代碼分開&#xff0c;再通過一個類來把這些&#xff0c;對象整合起來實現系統。說到整合&#xf…

[數組查找]2.圖解二分查找及其代碼實現

二分查找 二分查找也是一種在數組中查找數據的算法。和線性查找不同&#xff0c;它只能查找已經排好序的數據。二分查找通過比較數組中間的數據與目標數據的大小&#xff0c;可以得知目標數據是在數組的左邊還是右邊。因此&#xff0c;比較一次就可以把查找范圍縮小一半。重復執…

嵌入式進階——舵機控制PWM

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 舵機信號線代碼示例初始化PWM初始化UART打印日志初始化外部中斷Extimain函數 舵機最早用于船舶上實現轉向功能,由于可以通過程序連…

MySQL中, 自增主鍵和UUID作為主鍵有什么區別?

首先我們來看看, 存儲自增主鍵和uuid的數據類型 我們知道, mysql中作為主鍵的通常是int類型的數據, 這個 數據從第一條記錄開始, 從1開始主鍵往后遞增, 例如我有100條數據, 那么根據主鍵排序后, 里面的記錄從上往下一次就是1, 2, 3 ... 100, 但是UUID就不一樣了, UUID是根據特殊…

打卡信奧刷題(21)用Scratch圖形化工具信奧P7071 [CSP-J2020] 優秀的拆分

使用2進制進行拆分是比較好的解決方案&#xff0c;畢竟對于大家來說二進制轉換是非常熟的&#xff0c;如果不會可以參考打卡信奧刷題&#xff08;19&#xff09;用Scratch圖形化工具信奧B3972 [語言月賽 202405] 二進制 題解 &#xff0c;輸出的時候再轉換一下輸出&#xff0c;…

M功能-支付平臺(三)

target&#xff1a;離開柬埔寨倒計時-221day 前言 今天周六&#xff0c;但是在柬埔寨還是工作日&#xff0c;想著國內的朋友開始休周末就羨慕呀&#xff0c;記不清在這邊過了多少個周六了&#xff0c;多到我已經習慣了。而且今天技術部還停電了&#xff0c;真的是熱的受不了呀…

c++11:智能指針的種類以及使用場景

指針管理困境 內存釋放&#xff0c;指針沒有置空&#xff1b;內存泄漏&#xff1b;資源重復釋放 怎樣解決&#xff1f; RAII 智能指針種類 shared_ptr 實現原理&#xff1a;多個指針指向同一資源&#xff0c;引用計數清零&#xff0c;再調用析構函數釋放內存。 使用場景…

ASP.NET 代碼審計

ASP.NET 官方文檔 名詞解釋 IIS&#xff08;Internet Information Services&#xff09; IIS 是微軟開發的一款 Web 服務器軟件&#xff0c;用于在 Windows 服務器上托管和提供Web應用程序和服務。它支持 HTTP、HTTPS、FTP、SMTP 等多種協議&#xff0c;主要用于&#xff1a…

基于混合Transformer-CNN模型的多分辨率學習方法的解剖學標志檢測

文章目錄 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法實驗結果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精確定位…

跨域計算芯片,一把被忽視的汽車降本尖刀

作者 |王博 編輯 |德新 2019年前后&#xff0c;「中央運算單元區域控制」的架構被提出。基于這一趨勢&#xff0c;從板級的多芯片&#xff0c;到板級的單芯片&#xff0c;集成度越來越高&#xff0c;跨域計算芯片隨之來到聚光燈下。 跨域計算芯片的特點是&#xff0c;與專為智…

Django 里傳參給html文件

第一步&#xff1a;在 urls.py 文件里修改 from django.contrib import admin from django.urls import path from app01 import views # 添加這一行urlpatterns [#path(admin/, admin.site.urls),path(index/, views.index), # 添加這一行 ]第二步&#xff1a;在 settings…

若依框架的配置文件詳解:從數據庫配置到高級定制

若依框架&#xff08;RuoYi&#xff09;作為一個基于Spring Boot和MyBatis的快速開發平臺&#xff0c;提供了豐富的配置選項&#xff0c;讓開發者能夠靈活地調整和擴展其功能。配置文件在若依框架中扮演著至關重要的角色&#xff0c;通過合理配置&#xff0c;可以實現對數據庫連…

牛客網刷題 | BC97 回文對稱數

目前主要分為三個專欄&#xff0c;后續還會添加&#xff1a; 專欄如下&#xff1a; C語言刷題解析 C語言系列文章 我的成長經歷 感謝閱讀&#xff01; 初來乍到&#xff0c;如有錯誤請指出&#xff0c;感謝&#xff01; 描述 今天牛牛學到了回文…

鎖相環的一些學習筆記--(1)

下圖兩組1.2.3可以對應起來&#xff1b; 一些分析&#xff1a; 1.根據這個可知最后vco_voltage停在0.5v 參考資料&#xff1a; 1. Matlab https://www.bilibili.com/video/BV1bR4y1Z7Xg/?spm_id_from333.1296.top_right_bar_window_history.content.click&vd_source555…

Redis RDB 持久化問題

前言 Redis 是內存數據庫&#xff0c;它將自己的數據儲存在內存里面&#xff0c;如果不想辦法將儲存在內存中的數據保存到磁盤里面&#xff0c;那么一旦服務器進程退出&#xff0c;服務器中的數據也就沒了。 因此&#xff0c;Redis 提供了 RDB 持久化功能&#xff0c;這個功能…

如何將Windows PC變成Wi-Fi熱點?這里提供詳細步驟

序言 Windows 10和Windows 11都有內置功能,可以將你的筆記本電腦(或臺式機)變成無線熱點,允許其他設備連接到它并共享你的互聯網連接。以下是操作指南。 由于Windows中隱藏的虛擬Wi-Fi適配器功能,你甚至可以在連接到另一個Wi-Fi網絡或無線路由器時創建Wi-Fi熱點,通過另…

魯教版七年級數學上冊-筆記

文章目錄 第一章 三角形1 認識三角形2 圖形的全等3 探索三角形全等的條件4 三角形的尺規作圖5 利用三角形全等測距離 第二章 軸對稱1 軸對稱現象2 探索軸對稱的性質4 利用軸對稱進行設計 第三章 勾股定理1 探索勾股定理2 一定是直角三角形嗎3 勾股定理的應用舉例 第四章 實數1 …

實習生在Linux環境下如何日常使用?

那我簡單來說兩個我使用的場景吧 我在搭建我們的測試環境的時候&#xff0c;先上傳jar包到測試環境對應的目錄下&#xff0c;然后呢此時jar包是不可被執行的&#xff0c;所有就有了 chmod x jar包名稱, 接下來&#xff0c;我是用 jps 查看Java的進程&#xff0c;獲取到pid之后…