MyBatis 如何通过拦截器修改 SQL

news2024/9/23 13:26:53

目录

    • 1. 实现Interceptor接口
    • 2. 注册配置文件

假如我们想实现多租户,或者在某些 SQL 后面自动拼接查询条件。在开发过程中大部分场景可能都是一个查询写一个 SQL 去处理,我们如果想修改最终 SQL 可以通过修改各个 mapper.xml 中的 SQL 来处理。

但实际过程中我们可能穿插着 ORM 和 SQL 的混合使用,隐藏在代码中不容易被发现,还有假如项目中有很多很多的 SQL 我们不可能一个一个的去修改解决。

这个时候我们就需要通过 mybatis 拦截 SQL 并且最终修改 SQL。

在这里插入图片描述

具体操作如下:

1. 实现Interceptor接口

实现Interceptor接口,并写相关逻辑

package cn.source.framework.interceptor.impl;

import cn.source.common.core.domain.BaseEntity;
import cn.source.common.core.domain.entity.SysUser;
import cn.source.common.utils.DateUtils;
import cn.source.common.utils.SecurityUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

/**
 * @Description: 自定义拦截器,注入创建人,创建日期,修改人,修改日期,企业id
 */
@Intercepts({
   @Signature(
       type = Executor.class,
       method = "update",
       args = {MappedStatement.class, Object.class}),
})
public class HandleBaseInfoInterceptor implements Interceptor {

     @Override
     public Object intercept(Invocation invocation) throws Throwable {
       Object[] args = invocation.getArgs();
       MappedStatement mappedStatement = (MappedStatement) args[0];
       SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
       // 用户类不处理,会导致获取不到用户信息出错
       if (args[1] instanceof SysUser) {
         return invocation.proceed();
       }
       if (args[1] instanceof BaseEntity) {
         BaseEntity baseEntity = (BaseEntity) args[1];
         if (sqlCommandType == SqlCommandType.UPDATE) {
           baseEntity.setUpdateTime(DateUtils.getNowDate());
           baseEntity.setUpdateBy(SecurityUtils.getUsername());
         } else if (sqlCommandType == SqlCommandType.INSERT) {
           baseEntity.setCreateTime(DateUtils.getNowDate());
           baseEntity.setCreateBy(SecurityUtils.getUsername());
           // System.out.println("赋值企业ID:" + baseEntity.getCompanyId());
           baseEntity.setCompanyId(SecurityUtils.getLoginUser().getUser().getCompanyId());
         }
       }
       return invocation.proceed();
     }

     @Override
     public Object plugin(Object target) {
       return Plugin.wrap(target, this);
     }
    
     @Override
     public void setProperties(Properties properties) {
     }
        
}

2. 注册配置文件

将插件注册到 mybatis 的配置文件 mybatis-config.xml

<plugins>
    <!-- 自定义拦截器,注入企业id-->
	<plugin interceptor="cn.source.framework.interceptor.impl.HandleSelectInterceptor">   </plugin>
	<!-- 自定义拦截器,注入创建人,创建日期,修改人,修改日期,企业id-->
	<plugin interceptor="cn.source.framework.interceptor.impl.HandleBaseInfoInterceptor">  </plugin>
</plugins>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】结构体内存布局解析——字节对齐

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、什么是字节对齐&…

开源个性化自托管服务仪表板:Dashy

**Dashy&#xff1a;**一站式管理&#xff0c;个性化展现- 精选真开源&#xff0c;释放新价值。 概览 Dashy是一个创新的自托管仪表板解决方案&#xff0c;旨在为用户提供一个集中管理多个在线服务的平台。通过直观的界面设计&#xff0c;Dashy允许用户快速访问他们的自托管应…

【C++】内联函数vs宏 nullptr

目录 宏的优缺点分析概念回顾宏的缺点宏的优点 内联函数&#xff08;inline&#xff09;inline函数的定义和声明总结 宏的优缺点分析 概念回顾 下面是宏的申明方式&#xff1a; #define name( parament-list ) stuff //其中的 parament-list 是一个由逗号隔开的符号表&#x…

一个能够在网上爬取思维导图的python小程序

这个小程序是为需要从网上爬取思维导图的朋友写的,时间久了怕被遗忘在垃圾箱里,所以贴出来,给需要的同学使用。 河西石原创地址:https://haigear.blog.csdn.net/article/details/140878039 二、使用方法及流程介绍 简单的说明一下使用的方法: 1、在网上找到自己需要的思…

GBase8c psycopg2安装(centos6)

GBase8c psycopg2安装(centos6) 安装步骤&#xff1a; [rootcentos6 ~]# cd /opt/python/ [rootcentos6 python]# ls psycopg2-2.7.7.tar.gz [rootcentos6 python]# tar -zxf psycopg2-2.7.7.tar.gz [rootcentos6 python]# cd psycopg2-2.7.7 # 安装命令 [rootcentos6 psycop…

【C++:jsoncpp库的配置CMAKE的安装】

CMAKE的安装&#xff1a; 安装路径&#xff1a;Download CMake安装就是无脑Next跳出以下窗口以上步骤完了之后&#xff0c;页面如此&#xff0c;然后点击generate jsoncpp库的配置&#xff1a; 打开生成的源文件所在路径&#xff0c;找到名为jsoncpp.sln的文件&#xff0c;以vs…

大数据信用报告怎么查?有哪些注意事项?

大数据信用对于有资金周转的人来说是比较重要的&#xff0c;主要由于大数据信用无形的被不少机构用于贷前风控&#xff0c;无论是机构要求的还是自查&#xff0c;提前了解大数据信用情况是常规操作&#xff0c;那大数据信用报告如何查询?有哪些需要注意的呢?本文详细为大家讲…

【Kubernetes】k8s集群的资源发布方式

目录 一.常见的发布方式 二.如何实现 1.滚动升级 2.蓝绿升级 3.实现金丝雀发布&#xff08;灰度发布&#xff09; 一.常见的发布方式 蓝绿发布&#xff1a;两套环境交替升级&#xff0c;旧版本保留一定时间便于回滚。优点 用户无感知&#xff0c;部署和回滚速度较快缺点 …

使用 Python 对雷达卫星 sar 图像进行降噪的三种方法

合成孔径雷达 (SAR) 图像广泛应用于各种领域(航空航天、军事、气象等)。问题是这种图像在其原始格式中受到噪点的影响。虽然这些图像通常也是沉重的文件,但从科学的角度来看,有效地对其进行去噪的任务似乎既具有挑战性,又在现实世界中非常有用。 卫星图像有两大类: 光学…

嵌入式C++、QML与MQTT:智能化农业灌溉管理系统设计思路(代码示例)

目录 一、项目概述 二、系统架构 三、环境搭建 1. 硬件环境 2. 软件环境 四、代码实现 1. 硬件端代码示例 2. 软件端代码示例 a. 后端代码&#xff08;Node.js MQTT&#xff09; b. 前端代码&#xff08;QML&#xff09; 五、项目总结 一、项目概述 随着全球对农业…

Xinference如何注册自定义模型

环境&#xff1a; Xinference 问题描述&#xff1a; Xinference如何注册自定义模型 解决方案&#xff1a; 1.写个model_config.json&#xff0c;内容如下 {"version": 1,"context_length": 2048,"model_name": "custom-llama-3"…

Java 中的缓冲流

字符流 前面学习的字节流和字符流都是基本流&#xff0c;其中字符流的底层其实已经在内存中创建了一个长度为8192的字节数组作为缓存区。而字节流中则是没有的。 在内存中增加缓冲区的目的是为了减少内存与硬盘的交互的次数&#xff0c;因为这一操作比较耗时。 下面是一个图…

PixelMaster - 图片像素化终极利器 !

PixelMaster 是将普通图像转变为令人惊叹的像素艺术杰作的终极工具。非常适合艺术家、设计师和像素艺术爱好者&#xff01; https://apps.apple.com/app/pixelmaster-image-pixelator/id6502478442 为什么选择 PixelMaster&#xff1f; • 自定义像素形状&#xff1a;选择或导…

【Linux修行路】进度条小程序

目录 ⛳️推荐 一、预备知识 1.1 回车换行 1.2 缓冲区 二、倒计时 2.1 注意事项 三、进度条 3.1 源代码 3.2 代码分析 3.2 实际使用场景 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

安卓基本布局(上)

文章目录 LinerLayout线性布局RelativeLayout相对布局根据父容器定位根据兄弟组件定位margin偏移padding填充 LinerLayout线性布局 以水平或垂直的方式来排列界面中的控件。 常用属性详细描述orientation布局中组件的排列方式。horizonta&#xff1a;水平&#xff1b;vertical…

GPT-4o mini模型:小型化AI解决方案的创新应用案例

文章目录 每日一句正能量前言开发者视角初步接触与性能评估集成与开发流程成本效益分析创新应用案例面临的挑战与解决方案社区贡献与经验分享未来展望 性能评估处理能力与响应速度准确性与可靠性多功能性与灵活性资源效率可扩展性与集成性用户定制与微调 结论 成本效益分析初始…

C语言基础知识之函数指针和指针函数

函数指针和指针函数 函数指针和指针函数指向函数的指针返回指针值的函数指针函数和函数指针的区别 问题1_1代码1_1结果1_1 函数指针和指针函数 指向函数的指针 用函数指针变量调用函数 可以用指针变量指向整型变量、字符串、数组&#xff0c;也可以指向一个函数。一个…

ctfshow-web入门-sql注入(web176-web180)

目录 1、web176 2、web177 3、web178 4、web179 5、web180 1、web176 1 order by 4-- 闭合后简单判断了下字段数是 3 测试联合查询注入&#xff0c;存在关键字的过滤&#xff0c;包括 select 和 union &#xff08;后面经过测试实际只过滤了 select&#xff09; 大小写绕…

常⻅CMS漏洞

常⻅CMS漏洞 ⼀&#xff1a;WordPress ​ WordPress是⼀个以PHP和MySQL为平台的⾃由开源的博客软件和内容管理系统。WordPress具 有插件架构和模板系统。截⾄2018年4⽉&#xff0c;排名前1000万的⽹站中超过30.6%使⽤WordPress。 WordPress是最受欢迎的⽹站 内容管理系统。全…

Linux网络之多路转接——实用的epoll

目录 一、高级IO 1.1 概念 1.2 五种IO模型 1.3 小结 二、多路转接的实用派 2.1 epoll 接口 2.1.1 epoll_create 2.1.2 epoll_ctl 2.1.3 epoll_wait 2.2 epoll 底层原理 2.2.1 epoll_ctl 2.2.2 epoll_wait 2.2.3 epoll_create 三、 epoll 类的编写 3.1 类的框…