Mybatis拦截器

2023-11-03

MyBatis介绍

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。它支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis拦截器

MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。对于拦截器Mybatis为我们提供了一个Interceptor接口,通过实现该接口就可以定义我们自己的拦截器。

MyBatis默认调用四种类型的方法:

1.Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

2.ParameterHandler (getParameterObject, setParameters)

3.ResultSetHandler (handleResultSets, handleOutputParameters)

4.StatementHandler (prepare, parameterize, batch, update, query)

以上4个都是Configuration的方法,这些方法在MyBatis的一个操作(新增,删除,修改,查询)中都会被执行到,执行的先后顺序是Executor,ParameterHandler,ResultSetHandler,StatementHandler。

接口的定义是:



这三个方法中,plugin用于处理器的构建,intercept用于处理代理类,setProperties用语拦截器属性设置。

Plugin类实现了InvocationHandler的接口,返回了一个JDK自身的动态动态代理类,对于plugin的wrap方法:



判断当前目标对象是否有实现对应需要拦截的接口,如果没有则返回目标对象本身,如果有则返回一个代理对象。

代理对象的InvocationHandler正是一个Plugin,当目标对象执行接口方法时,如果是通过代理对象执行的,会调用invocationHandler的invoke方法,就是Plugin的invoke方法:



如果当前执行的方法是定义好的需要拦截的方法,则把目标对象、要执行的方法以及方法参数封装成一个Invocation对象,再把封装好的Invocation作为参数传递给当前拦截器的intercept方法。如果不需要拦截,则直接调用当前的方法。

对于getSignatureMap方法



getSignatureMap是首先会拿到拦截器这个Intercept注解,遍历拿到type属性,然后根据这个type得到带有method属性和args属性的method,最终返回一个type为key,value为Set<Method>的Map。例对Executor.class的update方法进行过滤,会产生key为Executro,value为Method实例,里面带有MappedStatement和method方法对应的参数。


拦截器的可配置性:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis拦截器 的相关文章

  • strassen矩阵乘法

    Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下 两个n n 阶的矩阵A与B的乘积是另一个n n 阶矩阵C C可表示为假如每一个C i j 都用此公式计算 则计算C所需要的操作次数为n3 m n2 n 1 a 其中m表

随机推荐

  • vue获取input值的方法总结

    1 v model 使用v model创建双向数据绑定 用来监听用户的输入事件以更新数据
  • PL/SQL(显示游标):查询部门为20的(所有员工信息)

    方法一 代码如下 set serveroutput on 1 声明 相关内容 declare 2 程序体 begin for temp in select empno ename job from emp where deptno 20 l
  • 硬件系统工程师宝典(3)-----信号完整性分析是个啥?

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们读到硬件电路的概要设计需要考虑的问题 相关的可行性分析可以使开发工作事半功倍 信号完整性分析概述 今天我们开始学习在高速电路设计中 经常遇到的问
  • v-if与component动态组件与Vue-Router

    v if与component动态组件区别 v if和component动态组件的区别以及优缺点如下 v if是一个指令 它可以根据条件来决定是否渲染一个元素或组件 如果条件为真 那么元素或组件就会被渲染 如果条件为假 那么元素或组件就会被销
  • everything 很多文件搜索不到?

    everything 很多文件搜索不到 知乎链接 https www zhihu com question 42052606 直接解决办法 把 C Users Administrator AppData Local Everything 下
  • TestNG同时使用DataProvider和Parameters

    TestNG Test测试方法中同时使用DataProvider和Parameters 实践中经常会遇到需要在 Test方法中混合使用TestNG的 DataProvider和 Parameters的情形 比如 根据参数的不同使用不同的测试
  • InnoDB存储引擎——表的逻辑存储及实现

    文章目录 表的逻辑存储结构 表分区 表的逻辑存储结构 在InnoDB存储引擎上 表都是根据主键顺序组织存放的 这种存储方式的表称为索引组织表 index organized table 如果一个表没有指定主键 那么会 首先判断是否存在唯一非
  • sql优化(查询大数据量时sql执行时间过长)

    问题 Oracle数据库 sql查询的优化 成交额统计表的sql查询时间过长进行的优化 解决办法 对sql语句中使用视图的部分替换为子查询 对查询表条件字段建立索引 引发的问题 在什么情况下建立索引 及建立索引后引发的开销有哪些 经查询or
  • 分布式应用部署模式下的Quartz配置

    本来计划做一次应用的部署升级 由单机模式 改为集群模式 但是在考虑方案时 除了遇到的SpringBoot优雅退出问题 还有一个需要考虑的问题 就是Quartz定时任务的处理 单机模式下 quartz定时任务很简单 按照文档使用即可 使用RA
  • 为mysql数据库建立索引;mysql索引总结----mysql 索引类型以及创建;mysql_建立索引的优缺点

    因为欣赏所以转载 http www cnblogs com cy163 archive 2008 10 27 1320798 html http www cnblogs com lihuiyong p 5623191 html http w
  • 修改MySQL账号的加密规则plugin和命令查看外键信息

    MySQL8之前的版本中加密规则是mysql native password 而在MySQL8之后 加密规则 是caching sha2 password 现在给大家介绍怎么修改用户的加密规则 修改成旧的加密规则 ALTER USER ro
  • Redis 一些基础知识以及数据类型

    3 启动后杂项基础知识 3 1 redis benchmark Redis 自带一个叫 redis benchmark 的工具来模拟N个客户端同时发出M个请求 启动 redis benchmark 可以通过 redis benchmark
  • CTFshow 文件上传 web156

    目录 思路 总结 思路 这次发现把shell php改成png上传的时候 提示文件类型不合规 可能对文件头进行检测 可以利用图片马来写入shell https github com huntergregal PNG IDAT Payload
  • 【element】el-autocomplete的常见用法

    前言 这段时间突然发现很少写博客了 平时都在平衡工作和休息的时间 周末也没动过笔 而且更重要的是我找不到写的内容了 在经历的初始的新知识的学习阶段后 目前的阶段更加转入对于业务的理解 很多模块在不同项目中都是可以复用的 而且工作中发现开发并
  • JS扁平化(flatten)数组

    JS扁平化分类 1 对象扁平化 深度很深的对象 经过扁平化编程深度为 1 的对象 2 数组扁平化 降维过程 多维数组经过扁平化变成一维数组 首先让我们思考一个这样的题目 假如有一个数组 var arr 1 2 3 4 我们怎么能把arr变成
  • 【python 10】python 魔术方法

    文章目录 一 getitem 获取属性 二 setitem 设置属性 三 delitem 删除属性 四 len 求长度 五 call 将类变成一个可调用的函数 python 中以 开头和结尾的成员 都被称为类的特殊成员 特殊属性和方法 一
  • Linux 中的 sysctl 命令及示例

    介绍 Linux管理员使用该命令在运行时sysctl读取或修改内核参数 无需重新启动即可实时控制和修改网络 I O 操作和内存管理设置的选项对于高可用性系统至关重要 了解如何使用该sysctl命令及其选项来动态调整系统性能
  • osgi 引用不同版本的jar_如何把公共模块做成sdk给其他项目引用

    实际开发过程中 会有这么一种需求 我们写的某些代码 不仅我们这个项目需要 其他部门 其他项目可能也需要 我们怎么把我们的项目给别人使用呢 有2种方法 第一种方法 只在本机中的其他项目中使用 不方便给他人使用 也可以发jar包给他人使用 但是
  • MyBatis使用association实现一对一级联查询的几种案例

    我们平日经常会遇到需要级联查询的场景 这里通过案例给大家展示实现过程 我们要查询的用户信息里面有个角色信息 一个用户对应一个角色 我们现在要求查出用户信息的同时 关联查出用户的角色信息 那么这个时候我们可以通过级联属性的方式 将角色中的数据
  • Mybatis拦截器

    MyBatis介绍 MyBatis本是apache的一个开源项目iBatis 2010年这个项目由apache software foundation 迁移到了google code 并且改名为MyBatis 它支持普通 SQL查询 存储过