iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >mybatis拦截器怎么使用
  • 494
分享到

mybatis拦截器怎么使用

2023-07-05 13:07:23 494人浏览 安东尼
摘要

今天小编给大家分享一下mybatis拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。mybatis实战之拦截器在

今天小编给大家分享一下mybatis拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    mybatis实战之拦截器

    在服务的开发过程中,往往存在这样的需求,针对业务,实现对数据库操作语句做统一的处理。

    比如对某些敏感数据如用户姓名、手机号等坐脱敏处理保存和查询、对未实现权限的查询通过添加关联查询实现权限控制查询结果等等。

    这时,mybatis框架提供了拦截器的方式,允许在映射语句执行过程中的某一点进行拦截调用,进行自己的业务处理。

    1、使用方法

    这里参考了官网的使用说明,只需实现 Interceptor 接口,并在类中指定想要拦截的方法签名即可。

    比如:

    @Intercepts({@Signature(  type= Executor.class,  method = "update",  args = {MappedStatement.class,Object.class})})public class ExamplePlugin implements Interceptor {  private Properties properties = new Properties();  public Object intercept(Invocation invocation) throws Throwable {    // implement pre processing if need    Object returnObject = invocation.proceed();    // implement post processing if need    return returnObject;  }  public void setProperties(Properties properties) {    this.properties = properties;  }}

    然后在mybatis的配置文件中,添加插件的对应配置即可。

    <!-- mybatis-config.xml --><plugins>  <plugin interceptor="org.mybatis.example.ExamplePlugin">    <property name="someProperty" value="100"/>  </plugin></plugins>

    我们也可以在代码中添加,下面给出在spring

    //通过spring查找sqlSessionFactory对象的逻辑在此省略SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) var3;org.apache.ibatis.session.Configuration c = sqlSessionFactory.getConfiguration();c.addInterceptor(interceptor);

    分别加上处理的业务逻辑,这个拦截器就可以使用了。

    2、需要注意的地方

    第一节简单介绍了,拦截器的使用方法,但在实际项目中这样还远远不够。

    笔者在本节列举了一些需要注意的地方,供大家思考讨论。

    拦截器的执行顺序

    拦截器的调用顺序分为两大种,第一种是拦截的不同对象,第二种是指拦截同一种对象的同一个方法。

    第一种情况,例如拦截 Executor 和 拦截 StatementHandler 就属于不同的拦截对象, 这两类的拦截器在整体执行的逻辑上是不同的。

    StatementHandler 属于 Executor 执行过程中的一个子过程。

    所以这两种不同类别的插件在配置时,一定是先执行 Executor 的拦截器,然后才会轮到 StatementHandler。

    所以这种情况下配置拦截器的顺序就不重要了,在 MyBatis 逻辑上就已经控制了先后顺序。

    第二种情况,例如都拦截 Executor 的 query 方法,这时你配置拦截器的顺序就会对这里有影响了。比如配置如下。

    <plugins>    <plugin interceptor="com.GitHub.pagehelper.ExecutorQueryInterceptor1"/>    <plugin interceptor="com.github.pagehelper.ExecutorQueryInterceptor2"/>    <plugin interceptor="com.github.pagehelper.ExecutorQueryInterceptor3"/></plugins>

    前面我们配置拦截器的顺序是1,2,3。在这里也会按照 1,2,3 的顺序被层层代理,代理后的结构如下:

    Interceptor3:{    Interceptor2: {        Interceptor1: {            target: Executor        }    }}

    然后到执行的逻辑:

    Interceptor3 前置处理
    Interceptor2 前置处理
    Interceptor1 前置处理  
    Object result = executor.query(4个参数方法);     
    Interceptor1 后续处理   
    Interceptor2 后续处理  
    Interceptor3 后续处理   
    return result;

    顺序就是 3>2>1>Executor>1>2>3。MyBatis的拦截器采用责任链设计模式,多个拦截器之间的责任链是通过动态代理组织的。

    我们一般都会在拦截器中的intercept方法中往往会有invocation.proceed()语句,其作用是将拦截器责任链向后传递,本质上便是动态代理的invoke。

    与常用插件的整合遇到的问题

    pageHelper造成分页失效的问题

    通过查看pagehelper源码,可以看到其inercept方法直接获取了excutor然后开始分页查询,当查询到结果时,便返回了。

    就是pagehelper的intercept方法中没有invocation.proceed(),这意味着什么?

    //com.github.pagehelper.PageInterceptor#intercept.....                resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);            }            return dialect.afterPage(resultList, parameter, rowBounds);        } finally {            dialect.afterAll();        }

    这意味着pagehelper没有继续向后传递责任链,而是自行处理直接返回。

    由此,我们可以猜出该问题大概率与拦截器的执行顺序有关。

    通过断点调试,验证了该猜想,当遇到分页查询时,执行到pagehelper就结束了,没有进入我们的自定义拦截器。这就可能造成我们自定义拦截器失效。

    解决方案

    因为PageHelper是Excetor类型的拦截器,所以我们如果想要在PageHelper拦截器前面执行,就必须要将我们自己的拦截器添加到他的拦截器后面。

    这里只介绍最简单最优雅的一种方式:

    注册一个ApplicationListener监听器,监听 ContextRefreshedEvent 事件,当所有的bean都初始化完成后(即PageHelper也已经注册好了),再把我们的自定义 MyBatis 拦截器注册到 SqlSessionFactory 中。

    可以提升的点

    Interceptor接口提供了三个方法分别是拦截器处理逻辑的主要方法、判断是否要进行拦截,然后做出决定是否生成一个代理的方法及设置参数的方法。

    package org.apache.ibatis.plugin;import java.util.Properties;public interface Interceptor {  Object intercept(Invocation invocation) throws Throwable;  default Object plugin(Object target) {    return Plugin.wrap(target, this);  }  default void setProperties(Properties properties) {    // NOP  }}

    这里说的提升点,就是在实现接口的实现类中,我们可以在plugin方法里加上一个判断,因为默认情况下,拦截器根据顺序拦截后,就可以去处理对应逻辑了,这里加上一个判断拦截的条件,可以减少代理类的创建。

        @Override    public Object plugin(Object target) {        if (target instanceof StatementHandler && checkIfNeeded((StatementHandler) target)) {            return Plugin.wrap(target, this);        } else {            return target;        }    }

    以上就是“mybatis拦截器怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: mybatis拦截器怎么使用

    本文链接: https://www.lsjlt.com/news/352229.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • mybatis拦截器怎么使用
      今天小编给大家分享一下mybatis拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。mybatis实战之拦截器在...
      99+
      2023-07-05
    • MyBatis拦截器的原理与使用
      目录一、拦截对象和接口实现示例二、拦截器注册的三种方式        1.XML注册  &n...
      99+
      2024-04-02
    • MyBatis 拦截器介绍
      MyBatis 拦截器介绍 MyBatis 提供了一种插件 (plugin) 的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截 MyBatis 中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执行过程中的...
      99+
      2023-09-02
      mybatis java mysql 拦截器
    • SpringMVC拦截器怎么使用
      今天小编给大家分享一下SpringMVC拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。SpringMVC 的拦...
      99+
      2023-07-05
    • 使用mybatis拦截器处理敏感字段
      目录mybatis拦截器处理敏感字段前言思路解析代码趟过的坑(敲黑板重点)mybatis Excutor 拦截器的使用这里假设一个场景实现过程的关键步骤和代码重点mybatis拦截器...
      99+
      2024-04-02
    • vue axios拦截器怎么使用
      本文小编为大家详细介绍“vue axios拦截器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue axios拦截器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、首先axios不支持vue...
      99+
      2023-06-29
    • SpringBoot怎么使用Interceptor拦截器
      这篇文章主要讲解了“SpringBoot怎么使用Interceptor拦截器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么使用Interceptor拦截器”吧!在sp...
      99+
      2023-07-05
    • MyBatis Excutor 拦截器的巧妙用法
      这里要讲的巧妙用法是用来实现在拦截器中执行额外 MyBatis 现有方法的用法。并且会提供一个解决拦截Executor时想要修改MappedStatement时解决并发的问题。这里假设一个场景:实现一个拦截器,记录 MyBatis 所有的 ...
      99+
      2023-05-31
      mybatis excutor 拦截器
    • 在springboot中怎么使用拦截器
      这篇文章主要介绍“在springboot中怎么使用拦截器”,在日常操作中,相信很多人在在springboot中怎么使用拦截器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在springboot中怎么使用拦截器...
      99+
      2023-06-26
    • vue的Vue.http.interceptors.push拦截器怎么使用
      这篇文章主要介绍“vue的Vue.http.interceptors.push拦截器怎么使用”,在日常操作中,相信很多人在vue的Vue.http.interceptors.push拦截器怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简...
      99+
      2023-07-04
    • MyBatis拦截器怎么动态替换表名
      本篇内容主要讲解“MyBatis拦截器怎么动态替换表名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MyBatis拦截器怎么动态替换表名”吧!一、Mybatis Interceptor 拦截器接...
      99+
      2023-06-30
    • SpringBoot拦截器怎么用
      今天小编给大家分享一下SpringBoot拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。HandlerInter...
      99+
      2023-06-08
    • 如何使用SpringBoot拦截器实现登录拦截
      小编给大家分享一下如何使用SpringBoot拦截器实现登录拦截,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!可以对URL路径进行拦截,可以用于权限验证、解决乱码...
      99+
      2023-06-29
    • mybatis实战之拦截器解读
      目录myBATis实战之拦截器1、使用方法2、需要注意的地方拦截器的执行顺序与常用插件的整合遇到的问题可以提升的点总结mybatis实战之拦截器 在服务的开发过程中,往往存在这样的需求,针对业务,实现对数据库操作语句做统...
      99+
      2023-03-20
      mybatis拦截器 拦截器 mybatis实战
    • MyBatis拦截器的实现原理
      目录前言 1.使用方法2.MyBatis对象的创建3.代理对象的创建3.1 拦截器的获取3.2 代理对象的创建4. 拦截器的执行过程5. 拦截器的执行顺序前言 Mybati...
      99+
      2024-04-02
    • Mybatis拦截器打印sql问题怎么解决
      本篇内容介绍了“Mybatis拦截器打印sql问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.log4j2配置修改关闭log4...
      99+
      2023-07-05
    • Mybatis拦截器打印sql问题
      目录1.log4j2配置修改2.配置日志开关3.添加拦截器插件4.拦截器逻辑描述4.1 注入开关4.2 获取sql4.2 获取参数4.3 sql替换参数4.4 打印sql4.5打印效...
      99+
      2023-05-13
      Mybatis拦截器打印sql Mybatis拦截器 拦截器打印sql
    • MyBatis-Plus 使用拦截器实现数据权限控制
      前言背景 平时开发中遇到根据当前用户的角色,只能查看数据权限范围的数据需求。列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是中途加的,或不希望每个接口都加一遍,就可以方案二加拦截器的...
      99+
      2023-09-07
      mybatis java
    • SpringBoot拦截器的使用
      目录一、拦截器简介二、拦截器配置使用方式1、过滤器拦截器作用范围2、拦截器的使用三、知识点总结1、拦截器的使用2、拦截器和过滤器的相同与不同一、拦截器简介 拦截器通常通过动态代理的方...
      99+
      2024-04-02
    • MyBatis中怎么实现自定义的SQL拦截器
      在 MyBatis 中实现自定义的 SQL 拦截器,通常可以通过实现 org.apache.ibatis.plugin.Interc...
      99+
      2024-05-08
      MyBatis SQL
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作