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

SpringMVC:拦截Mybatis的mapper

我们在使用mybatis的时候会碰到一些公共添加时间,操作人员,更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码,那这个时候我们就需要使用一些通用方法,统一就行修改和赋值。

我们就需要使用到拦截,那我们如何拦截 Mybatis的mapper呢?

我们拦截mapper有两种方法:

1、使用@Aspect注解

要去使用jdk的代理,否则代理不了mapper(即mybatis代理的mapper没有默认的构造器,cglib无法再给这个代理构造代理,会报如下错误

org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy13]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy13)

那我们需要将对@Aspect支持修改为jdk代理

<!-- 启动对@Aspectj的支持 true为cglib,false为jdk代理,为true的话,会导致拦截不了mybatis的mapper-->
<aop:aspectj-autoproxy proxy-target-class="false" />

之后就是使用注解去配置拦截,进行修改记录的操作

@Aspect
@Component
public class DataLogAspect {private static final Logger logger = LoggerFactory.getLogger(DataLogAspect.class);@Resourceprivate ActionMapper actionMapper;@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.insert*(..)) " +"&& !execution(public * com.kingbal.infrastructure.repository.mapper.ActionMapper.insert*(..))")public void insert(){}@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.update*(..))")public void update(){}@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.delete*(..))")public void delete(){}@Around("insert() || update() || delete()")public Object addOperateLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {...}
}
2、使用MethodInterceptor

 使用aopalliance的MethodInterceptor

(1)配置文件

        去掉对@Aspect注解的支持(也可以不去掉,只要不是proxy-target-class = true就可以)。然后配置aop

<bean id="dataLogInterceptor" class="com.kingbal.infrastructure.dataLog.dataLogInterceptor" />
<aop:config><aop:pointcut id="dataLogInsertPointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..insert*(..))&amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogUpdatePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..update*(..)) &amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogDeletePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..delete*(..)) &amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogInsertPointCut" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogUpdatePointCut" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogDeletePointCut" />
</aop:config>

(2)实现MethodInterceptor

public class DataLogInterceptor implements MethodInterceptor{private static final Logger logger = LoggerFactory.getLogger(DataLogInterceptor.class);public DataLogInterceptor() {}@Resourceprivate ActionMapper actionMapper;@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {Method method = methodInvocation.getMethod();String methodName = method.getName();Class<?> cls = method.getDeclaringClass();Object service = methodInvocation.getThis();Object[] args = methodInvocation.getArguments();Integer actionType = -1; ...}
}

推荐使用 @Aspect

注意事项

1、如果service层有实现接口,则在其他地方注入的时候必须使用接口声明,否则会报错

2、拦截mapper,如果使用注解@Aspect ,必须强制使用JDK代理。

相关文章:

SpringMVC:拦截Mybatis的mapper

我们在使用mybatis的时候会碰到一些公共添加时间&#xff0c;操作人员&#xff0c;更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码&#xff0c;那这个时候我们就需要使用一些通用方法&#xff0c;统一就行修改…...

MySQL查询性能优化解决方案

解决方案 主键与默认常用查询字段建立索引&#xff0c;普通字段类型选择 UNIQUE&#xff0c;索引方法 BTREE &#xff1b;长文本使用 FULLTEXT&#xff0c;索引方法为无&#xff1b; 新建表时引擎默认设置为 MyISAM&#xff0c;不使用 InnoDB&#xff0c;因为 MyISAM 支持 MAT…...

系统安全(补充)

拒绝服务漏洞&#xff08;拒绝服务漏洞将导致网络设备停止服务&#xff0c;危害网络服务可用性&#xff09;旁路&#xff08;旁路漏洞绕过网络设备的安全机制&#xff0c;使得安全措施没有效果&#xff09;代码执行&#xff08;该类漏洞使得攻击者可以控制网络设备&#xff0c;…...

腾讯云[HiFlow】| 自动化 -------HiFlow:还在复制粘贴?

文章目录 前言&#xff1a;一&#xff1a;HiFlow是什么二&#xff1a;功能介绍1.全连接2.自动化2.1定时处理特定任务2.2实时同步变更信息2.3及时获取通知提醒 3.零代码4.多场景5.可信赖 三&#xff1a;用户体验最后 前言&#xff1a; 随着网络时代的不断发展&#xff0c;自动化…...

音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

误删群晖NAS数据有什么找回的方法?

1、使用群晖 NAS 自带的备份功能&#xff1a;如果您之前启用了群晖的备份计划&#xff0c;例如 Hyper Backup 或 Snapshot Replication&#xff0c;您可以从备份中恢复数据。 1.1、Hyper Backup 可以将数据备份到多种目的地&#xff0c;包括本地存储、外部硬盘、其他 NAS 设备等…...

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash&#xff0c;都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…...

【QT】C++ || 左值引用、右值引用、移动语义、完美转发

在C中&#xff0c;左右值引用是高级语言特性&#xff0c;用于更高效的内存和资源管理。了解左右值引用的概念对于编写高效的C代码非常重要。下面解释左右值引用的概念、用途和区别&#xff0c;并通过示例来说明它们的使用。 左值引用&#xff08;Lvalue Reference&#xff09;…...

【深度学习驱动流体力学】计算流体力学算例剖析与实现

目录 一.求解器分类汇总压缩性流动求解器(Compressible Flow Solvers):不可压缩流动求解器(Incompressible Flow Solvers):多相流动求解器(Multiphase Flow Solvers):热传递求解器(Heat Transfer Solvers):其他特殊求解器:其他常见求解器:求解器分类:二.求解器案…...

Midjourney角色一致性如何控制两个人物

实操演示 如何用Midjourney完成《甄嬛大战蝙蝠侠》 思路 先生成一个大致符合要求的图片&#xff0c;作为底图基于底图&#xff0c;用局部重绘功能&#xff0c;逐步修改细节 生成底图 我们想要甄嬛大战蝙蝠侠&#xff0c;先试一下直接让他生成 Zhen Huan vs. Batman, in t…...

Python基础-引用参数、斐波那契数列、无极分类

1.引用参数的问题 &#xff08;1&#xff09;列表&#xff08;list&#xff09; 引用参数&#xff0c;传地址的参数&#xff0c;即list1会因list2修改而改变。 list1 [1,2,3,4] list2 list1 print(list1) list2[2] 1 print(list2) print(list1)非引用参数&#xff0c;不传…...

【MySQL统计函数count详解】

MySQL统计函数count详解 1. count()概述2. count(1)和count(*)和count(列名)的区别3. count(*)的实现方式 1. count()概述 count() 是一个聚合函数&#xff0c;返回指定匹配条件的行数。开发中常用来统计表中数据&#xff0c;全部数据&#xff0c;不为null数据&#xff0c;或…...

大数据的发展,带动电子商务产业链,促进了社会的进步【电商数据采集API接口推动电商项目的源动力】

最近几年计算机技术在诸多领域得到了有效的应用&#xff0c;同时在多方面深刻影响着我国经济水平的发展。除此之外&#xff0c;人民群众的日常生活水平也受大数据技术的影响。 在这其中电子商务领域也在大数据技术的支持下&#xff0c;得到了明显的进步。虽然电子商务领域的发…...

Python类中变量定义详解

✨前言&#xff1a; Python中的类可以定义两种类型的变量&#xff1a;类变量和实例变量。 类变量&#xff08;Class Variables&#xff09;&#xff1a; 类变量是在类级别上定义的变量&#xff0c;它们是对所有实例共享的。这意味着类变量只有一个副本&#xff0c;无论你创建了…...

c++ extern 关键字详解

extern关键字在C中用于声明变量或函数的外部链接。它通常用于以下几种场景&#xff1a; 声明全局变量&#xff1a;在一个文件中定义变量&#xff0c;在其他文件中使用extern声明该变量&#xff0c;以便在多个文件之间共享。C和C混合编程&#xff1a;在C代码中引用C语言编写的函…...

计算机网络:运输层 - TCP 流量控制 拥塞控制

计算机网络&#xff1a;运输层 - TCP 流量控制 & 拥塞控制 滑动窗口流量控制拥塞控制慢开始算法拥塞避免算法快重传算法快恢复算法 滑动窗口 如图所示&#xff1a; 在TCP首部中有一个窗口字段&#xff0c;该字段就基于滑动窗口来辅助流量控制和拥塞控制。所以我们先讲解滑…...

Python学习打卡:day10

day10 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day1073、文件的读取操作文件的操作步骤open()打开函数mode常用的三种基础访问模式读操作相关方法read()方法readlines()方法readline()方法for循…...

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助。《Ubuntu Linux运…...

[Qt的学习日常]--窗口

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、窗口的分…...

Vue发送http请求

1.创建项目 创建一个新的 Vue 2 项目非常简单。在终端中&#xff0c;进入您希望创建项目的目录(我的目录是D:\vue)&#xff0c;并运行以下命令&#xff1a; vue create vue_test 2.切换到项目目录&#xff0c;运行项目 运行成功后&#xff0c;你将会看到以下的编译成功的提示…...

学习使用js和jquery修改css路径,实现html页面主题切换功能

学习使用js和jquery修改css路径&#xff0c;实现html页面主题切换功能 效果图html代码js切换css关键代码jquery切换css关键代码 效果图 html代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>修改css路径</title&g…...

(转)请介绍一下Redis的数据淘汰策略

1. **NoEviction&#xff08;不淘汰&#xff09;**&#xff1a;当内存不足时&#xff0c;直接返回错误&#xff0c;不淘汰任何数据。该策略适用于禁止数据淘汰的场景&#xff0c;但需要保证内存足够。 2. **AllKeysLFU&#xff08;最少使用次数淘汰&#xff09;**&#xff1a;…...

APP自动化测试-Appium常见操作之详讲

一、基本操作 1、点击操作 示例&#xff1a;element.click() 针对元素进行点击操作 2、初始化&#xff1a;输入中文的处理 说明&#xff1a;如果连接的是虚拟机&#xff08;真机无需加这两个参数&#xff0c;加上可能会影响手工输入&#xff09;&#xff0c;在初始化配置中…...

写给大数据开发:谈谈数仓建模的反三范式

在数仓建设中&#xff0c;我们经常谈论反三范式。顾名思义&#xff0c;反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。简单来说&#xff0c;就是浪费存储空间&#xff0c;节省查询时间。用行话讲&#xff0c;这就是以空间换时间。听起来像是用大炮打蚊子&#…...

Stable diffusion 3 正式开源

6月12日晚&#xff0c;著名开源大模型平台Stability AI正式开源了&#xff0c;文生图片模型Stable Diffusion 3 Medium&#xff08;以下简称“SD3-M”&#xff09;权重。 SD3-M有20亿参数&#xff0c;平均生成图片时间在2—10秒左右推理效率非常高&#xff0c;同时对硬件的需求…...

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…...

python tensorflow 各种神经元

感知机神经元&#xff08;Perceptron Neuron&#xff09;&#xff1a; 最基本的人工神经元模型&#xff0c;用于线性分类任务。 import numpy as npclass Perceptron:def __init__(self, input_size, learning_rate0.01, epochs1000):self.weights np.zeros(input_size 1) #…...

Gone框架介绍27 - 再讲 Goner 和 依赖注入

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 文章目录 Goner 和 依赖注入Goner的定义依赖标记Goners 注册Priest函数 Goner 和 依赖注入 Gone 作为一个依赖注入框架&am…...

【Python/Pytorch 】-- 滑动窗口算法

文章目录 文章目录 00 写在前面01 基于Python版本的滑动窗口代码02 算法效果 00 写在前面 写这个算法原因是&#xff1a;训练了一个时序网络&#xff0c;该网络模型的时序维度为32&#xff0c;而测试数据的时序维度为90。因此需要采用滑动窗口的方法&#xff0c;生成一系列32…...

Clickhouse集群create drop database可删除集群数据库或只删除本地数据库

集群环境下&#xff0c;在任意一个节点创建数据库&#xff0c;如果加上了ON CLUSTER clustername&#xff0c;则在集群环境的所有节点上都创建了该数据库&#xff0c;并在集群环境的所有节点上都创建了该数据库对应的目录&#xff0c;且数据库的metadata_path对应的目录路径在所…...

毕设做微课资源网站设计可以吗/苏州关键词优化怎样

题意 有 nnn 个点&#xff0c; 每次从高的点到低的点不消耗体力&#xff0c;从低的点到高的点消耗 111 点体力&#xff0c;问从 111 到 nnn 消耗的最少体力。 分析 不难得出转移方程&#xff1a; fimin(fj[ai≥aj])(i−k≤j≤i−1)f_i min(f_j [a_i \geq a_j])~~~~(i-k\le…...

做旅游行程的网站推荐/网站点击量软件

我安装的是PHP Version 5.3.26&#xff0c;按照网上提示在Eclipse中使用XDebug进行调试&#xff0c;不过配置了却使用不了&#xff0c;下面把解决方法简要说一下。 XDebug老是加载不了 From PHP 5.3 onwards, you always need to use the zend_extension PHP.ini setting name,…...

深圳企业营销型网站建设/企业文化ppt

题意&#xff1a;已知C(m,n)m!/(n!(m-n)!),求C(p,q)/C(r,s) 因为C(p,q)/C(r,s)可以化简成(p!(r-s)!(s!))/(q!(p-q)!r!) 然后就可以用唯一分解定理&#xff0c;算出这个式子中分别的素数的个数 再乘起来就可以了 1 #include<iostream> 2 #include<cstdio> 3 #incl…...

现在最好的企业网站管理系统/科技公司网站制作公司

公司要做一个项目的demo&#xff0c;要求地图上可以插红旗&#xff0c;所以就用到了Raphael。 因为是个demo&#xff0c;所以地图就用了一张图片&#xff0c;效果如下&#xff1a; 所以为了更好的封装一下这个功能&#xff0c;就写了一个简单的插件&#xff1a;jquery-pointpai…...

wordpress如何开发手机/淄博seo推广

重载 函数签名是指函数的参数个数&#xff0c;参数类型以及参数的顺序。重载的定义是&#xff1a;在同一作用域内函数签名不同但函数名相同的函数互为重载。 // 以下几个函数互为重载 void print(); void print(int a); void print(double a, int b); void print(int a, double…...

申请阿里巴巴网站首页/免费获客软件

3209: 花神的数论题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2498 Solved: 1129[Submit][Status][Discuss]Description 背景众所周知&#xff0c;花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包括 CH 啦。描述话说花神这天又来讲课了。课后照例有超…...