最新MyBatis 拦截器使用方法总结_mybatis拦截器的使用,2024年最新看这篇文章就行了

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})

})


##### 2.1.1. type


`MyBatis`拦截器默认会按顺序拦截以下的四个接口中的所有方法:



org.apache.ibatis.executor.Executor //拦截执行器方法
org.apache.ibatis.executor.statement.StatementHandler //拦截SQL语法构建处理
org.apache.ibatis.executor.parameter.ParameterHandler //拦截参数处理
org.apache.ibatis.executor.resultset.ResultSetHandler //拦截结果集处理


具体是拦截这四个接口对应的实现类:



org.apache.ibatis.executor.CachingExecutor
org.apache.ibatis.executor.statement.RoutingStatementHandler
org.apache.ibatis.scripting.defaults.DefaultParameterHandler
org.apache.ibatis.executor.resultset.DefaultResultSetHandler


![](https://img-blog.csdnimg.cn/img_convert/314b0b6169cbce1483f70075407ce30d.png)


##### 2.1.2. method


这个可以根据`MyBatis`源码了解下。


##### 2.1.3. args


根据参数类型区分重载的方法。


#### 2.2. 方法实现


##### 2.2.1. intercept


进行拦截的时候要执行的方法。该方法参数`Invocation`类中有三个字段:



private final Object target;
private final Method method;
private final Object[] args;


可通过这三个字段分别获取下面的信息:



Object target = invocation.getTarget();//被代理对象
Method method = invocation.getMethod();//代理方法
Object[] args = invocation.getArgs();//方法参数




| 拦截接口 | 接口实现类 |
| --- | --- |
| `Executor` | `CachingExecutor` |
| `StatementHandler` | `RoutingStatementHandler` |
| `ParameterHandler` | `DefaultParameterHandler` |
| `ResultSetHandler` | `DefaultResultSetHandler` |


##### 2.2.2. plugin


插件用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理,可以决定是否要进行拦截进而决定要返回一个什么样的目标对象,官方提供了示例:`return Plugin.wrap(target, this);`,可以在这个方法中提前进行拦截对象类型判断,提高性能:



@Override
public Object plugin(Object target) {
    //只对要拦截的对象生成代理
    if(target instanceof StatementHandler){
        //调用插件
        return Plugin.wrap(target, this);
    }
    return target;
}

`MyBatis`拦截器用到责任链模式+动态代理+反射机制;  
 所有可能被拦截的处理类都会生成一个代理类,如果有`N`个拦截器,就会有`N`个代理,层层生成动态代理是比较耗性能的。而且虽然能指定插件拦截的位置,但这个是在执行方法时利用反射动态判断的,初始化的时候就是简单的把拦截器插入到了所有可以拦截的地方。所以尽量不要编写不必要的拦截器。另外我们可以在调用插件的地方添加判断,只要是当前拦截器拦截的对象才进行调用,否则直接返回目标对象本身,这样可以减少反射判断的次数,提高性能。


##### 2.2.3. setProperties


如果我们拦截器需要用到一些变量参数,而且这个参数是支持可配置的,类似`Spring`中的`@Value("${}")`从`application.properties`文件获取自定义变量属性,这个时候我们就可以使用这个方法。


(1)在`application.properties`文件中添加配置:



mybatis.config-location=classpath:mybatis-config.xml


(2)在`resources`目录下添加`mybatis-config.xml`配置文件,并添加插件和属性配置。添加完需要注意去掉自定义`MyBatis`拦截器上的`@Component`注解,否则该拦截器相当于注册了两个,会执行两遍拦截方法。



<?xml version="1.0" encoding="UTF-8" ?>

(3)在拦截器插件的`setProperties`方法中进行。这些自定义属性参数会在项目启动的时候被加载。



@Override
public void setProperties(Properties properties) {
    System.out.println("key1=" + properties.getProperty("key1"));
    System.out.println("key2=" + properties.getProperty("key2"));
    System.out.println("key3=" + properties.getProperty("key3"));
}

### 3. 代码示例



package com.example.demo.mapper.plugin;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Properties;

@Intercepts({
@Signature(type = StatementHandler.class, method = “prepare”, args = {Connection.class, Integer.class})
})
public class MyPlugin implements Interceptor {

Properties properties = null;

/\*\*

* 拦截方法逻辑
* 这里主要是通过反射去获取要执行的SQL相关信息,然后进行操作
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object target = invocation.getTarget();//被代理对象
Method method = invocation.getMethod();//代理方法
Object[] args = invocation.getArgs();//方法参数
// do something … 方法拦截前执行代码块
Object result = invocation.proceed();
// do something …方法拦截后执行代码块
return result;
}

/\*\*

* 生成MyBatis拦截器代理对象

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值