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.mzph.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之后…