MyBatis拦截器(Interceptor)的理解与实践

news2025/3/5 10:45:41

文章目录

      • 1. 什么是MyBatis拦截器?
      • 2. 拦截器的基本原理
      • 3. 编写自定义拦截器
        • 3.1 示例:实现SQL执行时间统计拦截器
        • 3.2 配置拦截器
      • 4. 实战应用场景
      • 5. 总结

在这里插入图片描述

🎉欢迎来到SpringBoot框架学习专栏~


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:SpringBoot
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在MyBatis中,拦截器(Interceptor)是一种强大的机制,它允许开发者在执行SQL语句或处理结果集的过程中介入,并且可以进行自定义的处理逻辑。本文将深入探讨MyBatis拦截器的基本概念、工作原理,以及如何在实际项目中应用拦截器来解决常见问题和优化性能。

在这里插入图片描述

1. 什么是MyBatis拦截器?

MyBatis拦截器是一种基于Java反射机制和动态代理的插件,用于拦截MyBatis的方法调用。它允许开发者在SQL语句执行前后、结果集处理前后等关键节点进行拦截,并在拦截器中编写自定义逻辑。主要作用包括但不限于:

  • SQL语句重写、增强或修改;
  • 对参数进行加工;
  • 对结果集进行加工;
  • 统计SQL执行时间;
  • 实现分页、缓存等通用功能。

2. 拦截器的基本原理

MyBatis拦截器基于Java的动态代理机制实现。当执行MyBatis的方法时,实际上是调用了代理对象的方法。拦截器通过实现Interceptor接口,并覆盖其中的intercept方法,实现对目标对象方法的拦截和增强。主要涉及的核心类和接口包括:

  • Interceptor:拦截器接口,定义了拦截和处理逻辑;
  • Invocation:方法调用对象,包含了目标方法、参数等信息;
  • Plugin:MyBatis提供的工具类,用于生成代理对象并应用拦截器。

3. 编写自定义拦截器

接下来,我们将通过一个实际的示例来展示如何编写和配置自定义拦截器,并说明其实现的功能和作用。

3.1 示例:实现SQL执行时间统计拦截器

我们编写一个拦截器,用于统计每个SQL语句的执行时间。首先,创建一个实现Interceptor接口的拦截器类:

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

@Intercepts({
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class})
})
public class SqlExecuteTimeInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = invocation.proceed();
        long endTime = System.currentTimeMillis();
        long timeElapsed = endTime - startTime;

        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        String sqlId = mappedStatement.getId();
        System.out.println("执行SQL【" + sqlId + "】耗时:" + timeElapsed + "ms");

        return result;
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 可以配置拦截器的属性
    }
}
3.2 配置拦截器

在MyBatis的配置文件(例如mybatis-config.xml或者Spring Boot中的配置类)中配置该拦截器:

<plugins>
    <plugin interceptor="com.example.interceptor.SqlExecuteTimeInterceptor">
        <!-- 这里可以配置拦截器的属性 -->
    </plugin>
</plugins>

或者在Spring Boot中,通过配置类来注入拦截器:

@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {

    @Bean
    public SqlExecuteTimeInterceptor sqlExecuteTimeInterceptor() {
        return new SqlExecuteTimeInterceptor();
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.addInterceptor(sqlExecuteTimeInterceptor());
    }
}

4. 实战应用场景

除了简单的SQL执行时间统计外,MyBatis拦截器在实际项目中有着更广泛的应用场景:

  • 参数处理与加密解密:对参数进行预处理或者解密,确保数据库安全;
  • 结果集缓存与二级缓存:通过拦截查询语句,实现结果集的缓存和二级缓存的增强;
  • 多租户隔离:在SQL执行前动态修改租户ID,实现多租户数据隔离;
  • 动态SQL语句优化:根据特定业务场景动态生成或者优化SQL语句。

5. 总结

本文详细介绍了MyBatis拦截器的基本概念、工作原理,并通过一个实际的示例演示了如何编写和配置自定义拦截器。拦截器作为MyBatis的重要扩展机制,能够在不修改原始代码的情况下,实现更多的功能增强和业务逻辑处理,极大地提升了开发效率和系统性能。

希望本文能帮助读者更深入理解MyBatis拦截器的应用与实践,为项目开发中遇到的问题提供解决思路和方法。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础&#xff0c;想要拥有一个基本美观的大屏&#xff0c;就得考虑页面整体模块的宽高自适应&#xff0c;我们自然就会想到具有强大灵活性flex布局&#xff0c;再借助百分比布局来辅助。至此&#xff0c;大屏页面布局问题即可得到解决。 可视化大屏开发系…

三大交易所全面恢复 IPO 申请

6月21日晚间&#xff0c;北交所受理了3家企业的IPO申请&#xff0c;这是北交所时隔3个月之后恢复IPO受理。6月20日晚间&#xff0c;沪深交易所各受理了1家IPO申请&#xff0c;这是沪深交易所时隔半年后再次受理IPO。这也意味着&#xff0c;三大交易所IPO受理全部恢复。 6月21日…

Ubuntu-基础工具配置

基础工具配置 点击左下角 在弹出界面中点击 以下命令都是在上面这个界面执行&#xff08;请大家注意空格&#xff09; 命令输入完后&#xff0c;回车键就是执行,系统会提示输入密码&#xff08;就是你登录的密码&#xff09; 1.安装net工具 &#xff1a;&#xff08;ifconfi…

代码-功能-python-爬取博客网标题作者发布时间

环境&#xff1a; python 3.8 代码&#xff1a; # 爬取博客园内容 # https://www.cnblogs.com/import re from lxml import etree import requests import json import threading from queue import Queue import pymysql import timeclass HeiMa:def __init__(self):# 请…

2小时极速入门 TypeScript-慕课网 笔记

TS文档&#xff1a;https://www.tslang.cn/docs/handbook/modules.html 一&#xff0c;什么是TS 注:Typescript无法在浏览器中运行 ,所以需要编译器,将TS转变为JS 问&#xff1a;TS运行这么麻烦&#xff0c;为什么还要有TS&#xff1f; 答&#xff1a;TS强类型 1&#xff0c;规…

【大疆pocket3】到手后5个必改初始设置关键点(上)

【大疆pocket3】到手后5个必改初始设置关键点&#xff08;上&#xff09; 一&#xff0c;简介二&#xff0c;必改关键点2.1 视频拍摄格式2.2 竖拍选择2.3 开拍后息屏设置2.4 摇杆转速设置2.5 提示音设置为静音 一&#xff0c;简介 本文记录大疆pocket3上手后5个必改关键点&…

独立看门狗窗口开门狗

独立看门狗 接线图&#xff1a;按键用于阻塞喂狗。独立看门狗&窗口开门狗接线一样。 第一步&#xff0c;是开启时钟了&#xff0c;只有这个LSI时钟开启了独立看门狗才能运行&#xff0c;所以初始化独立看门狗之前&#xff0c;LSI必须得开启&#xff0c;但是这个开启LSI的…

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败 解决方法&#xff1a; 首先%oracle_home%/network/admin下的sqlnet.ora文件&#xff0c;把SQLNET.AUTHENTICATION_SERVICES (NTS)加个 # 注释掉就好了

稳态与敏态业务阶段

稳态业务就是比如你登录学校的图书馆教务处这些业务系统 用户数量和数据基本上不会发生太大的变化 业务系统的更新也不是很频繁&#xff0c;比较方便资源的采购 敏态业务就是比如我开发一个应用上线了&#xff0c;我不知道有多少用户和数量&#xff0c;无法预估 这就没办法…

计算机专业:昔日万金油,明日科技潮头的弄潮儿

高考后的十字路口&#xff1a;计算机专业&#xff0c;依旧闪耀吗&#xff1f; 随着2024年高考的尘埃落定&#xff0c;数百万青春洋溢的脸庞再次凝视着未来的迷雾&#xff0c;试图在繁星点点的专业宇宙中找到那颗最亮的星——计算机科学与技术。长久以来&#xff0c;计算机专业…

自动驾驶辅助功能测试用例表格(续2)

自动驾驶辅助功能测试用例表格&#xff08;续&#xff09; 用例编号测试类型测试项目测试描述车辆准备车辆状态车辆场景车辆执行可变因素具体信号状态通过标准预期标准通过/失败TJA-001功能测试交通拥堵辅助 (TJA)测试TJA系统在交通拥堵情况下的自动跟车和保持车道功能TJA系统已…

高性能并行计算华为云实验四:快排算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建快排算法源码 3.2 makefile的创建与编译 3.3 主机文件配置与运行监测 四、实验结果与分析 4.1 结果一及分析 4.2 结果二及分析 五、实验思考与总结 5.1 实验思考 5.2 实验总结 END&#xff5e; 一、实验目的…

吴恩达机器学习 第三课 week2 推荐算法(上)

目录 01 学习目标 02 推荐算法 2.1 定义 2.2 应用 2.3 算法 03 协同过滤推荐算法 04 电影推荐系统 4.1 问题描述 4.2 算法实现 05 总结 01 学习目标 &#xff08;1&#xff09;了解推荐算法 &#xff08;2&#xff09;掌握协同过滤推荐算法&#xff08;Collabo…

正则表达式之三剑客grep

正则表达式匹配的是文本内容&#xff0c;linux的文本三剑客 都是针对文本内容 grep 过滤文本内容 sed 针对文本内容进行增删改查 awk 按行取列 文本三剑客都是按行进行匹配。 grep grep 的作用就是使用正则表达式来匹配文本内容 选项&#xff1a; -m …

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…

最长考拉兹序列

题目&#xff1a; 考虑如下定义在正整数集上的迭代规则&#xff1a; n n/2 (若n为偶数) n 3n1 &#xff08;若n为奇数&#xff09; 从13开始&#xff0c;可以迭代生成如下的序列&#xff1a; 13 40 20 10 5 16 8 4 2 1 可以看出这个序列&#xff08;从13…

实时语音翻译软件哪个好?多语言实时沟通无负担

众所周知&#xff0c;英语是国际交流的共同语言。无论是跨国商务洽谈还是学术研讨&#xff0c;英语的流畅使用至关重要。 然而&#xff0c;语言的障碍依然存在&#xff0c;这时一款高效的英语语音翻译软件就显得尤为关键。它们能够即时转换语言&#xff0c;让我们的对话无国界…

跨境电商系列02:跨境电商的本质,是一场现代文明的“侵x入”吗

作者|夏虫&#xff08;题图&#xff1a;中国龙&#xff09; 公号&#xff0c;数据虫巢(ID: blogchong) “ 不知道有没有人想过一个问题&#xff0c;海出电商市场是增量的没问题&#xff0c;那为何是跨境电商的模式呢&#xff1f;所谓跨境电商&#xff0c;一定是存在商品流动&a…

pytest测试框架pytest-rerunfailures插件重试失败用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;介绍下插件pytest-rerunfailures &#xff0c;用于在测试用例失败时自动重新运行这些测试用例。 pytest-rerunfailures官方显示的python和pytest版本限制&#xff1a; Python 3.8pytest 7.2 或更新版本 此插件可以通过以下可…

《计算机英语》Unit2 Operating System and Computer Architecture 操作系统和计算机构造

SectionA Operating System操作系统 不同操作系统 批处理操作系统(Batch Processing Operating System) 分时操作系统(Time Sharing Operating System) 实时操作系统(Real Time Operating System) 个人操作系统(Personal Operating System) 网络操作系统(NOS, Network Operati…