Mybatis 插件原理解析

 更新时间:2021年10月12日 14:42:06   作者:一叶知秋_dba  
mybatis是一款优秀的ORM开源框架,这个框架具有极强的灵活性,本文再次给大家介绍Mybatis 插件原理,感兴趣的朋友一起看看吧

Mybati s作为⼀个应⽤⼴泛的优秀的ORM开源框架,这个框架具有强⼤的灵活性,在四⼤组件
(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易⽤的插 件扩展机制。
Mybatis对持久层的操作就是借助于四⼤核⼼对象。MyBatis⽀持⽤插件对四⼤核⼼对象进 ⾏拦截,对mybatis来说
插件就是拦截器,⽤来增强核⼼对象的功能,增强功能本质上是借助于底层的 动态代理实现的,换句话说,
MyBatis中的四⼤对象都是代理对象

在这里插入图片描述

MyBatis所允许拦截的⽅法如下:

  • 执⾏器Executor (update、query、commit、rollback等⽅法);
  • SQL语法构建器StatementHandler (prepare、parameterize、batch、updates query等⽅法);
  • 参数处理器ParameterHandler (getParameterObject、setParameters⽅法);
  • 结果集处理器ResultSetHandler (handleResultSets、handleOutputParameters等⽅法);

在四⼤对象创建的时候

  • 每个创建出来的对象不是直接返回的,⽽是interceptorChain.pluginAll(parameterHandler);
  • 获取到所有的Interceptor (拦截器)(插件需要实现的接⼝);调⽤ interceptor.plugin(target);返回
  • target 包 装后的对象
  • 插件机制,我们可以使⽤插件为⽬标对象创建⼀个代理对象;AOP (⾯向切⾯)我们的插件可 以为四⼤对象

创建出代理对象,代理对象就可以拦截到四⼤对象的每⼀个执⾏;
自定义插件拦截:

Intercepts ({//注意看这个⼤花括号,也就这说这⾥可以定义多个@Signature对多个地⽅拦截,都⽤这个拦截器
@Signature (type = StatementHandler .class , //这是指拦截哪个接⼝
method = "prepare",//这个接⼝内的哪个⽅法名,不要拼错了
args = { Connection.class, Integer .class}), 这是拦截的⽅法的⼊参,按顺序写到
这,不要多也不要少,如果⽅法重载,可是要通过⽅法名和⼊参来确定唯⼀的
})
public class MyPlugin implements Interceptor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// //这⾥是每次执⾏操作的时候,都会进⾏这个拦截器的⽅法内
Override
public Object intercept(Invocation invocation) throws Throwable {
//增强逻辑
System.out.println("对⽅法进⾏了增强....");
return invocation.proceed(); //执⾏原⽅法
}
/**
* //主要是为了把这个拦截器⽣成⼀个代理放到拦截器链中
* ^Description包装⽬标对象 为⽬标对象创建代理对象
* @Param target为要拦截的对象
* @Return代理对象
*/
Override
public Object plugin(Object target) {
System.out.println("将要包装的⽬标对象:"+target);
return Plugin.wrap(target,this);
 }
/**获取配置⽂件的属性**/
//插件初始化的时候调⽤,也只调⽤⼀次,插件配置的属性从这⾥设置进来
Override
public void setProperties(Properties properties) {
System.out.println("插件配置的初始化参数:"+properties );
} }

到此这篇关于Mybatis 插件原理解析的文章就介绍到这了,更多相关Mybatis 插件原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot详细讲解断言机制原理

    SpringBoot详细讲解断言机制原理

    断言Assertion是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告
    2022-06-06
  • SpringBoot从yml配置文件中读常用参数值实例方法

    SpringBoot从yml配置文件中读常用参数值实例方法

    在本篇文章里小编给大家整理了关于SpringBoot从yml配置文件中读常用参数值实例方法,有需要的朋友们学习下。
    2019-12-12
  • 自定义对象作为HashMap的Key问题

    自定义对象作为HashMap的Key问题

    这篇文章主要介绍了自定义对象作为HashMap的Key问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java实现把文件及文件夹压缩成zip

    Java实现把文件及文件夹压缩成zip

    这篇文章主要介绍了Java实现把文件及文件夹压缩成zip,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java调用groovy实现原理代码实例

    Java调用groovy实现原理代码实例

    这篇文章主要介绍了Java调用groovy实现原理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 使用Javacsv.jar的jar包操作csv文件的方法

    使用Javacsv.jar的jar包操作csv文件的方法

    使用javacsv的jar包很方便的可以操作csv文件。下面通过本教程给大家介绍使用javacsv.jar操作csv文件的方法,感兴趣的朋友一起看下吧
    2016-08-08
  • 详解Java排序算法中的冒泡和选择排序

    详解Java排序算法中的冒泡和选择排序

    这篇文章主要给大家介绍了Java排序算法中的冒泡排序和选择排序,文中有详细的图文解释和代码示例,对我们学习Java算法有一定的帮助,感兴趣的同学可以参考阅读下
    2023-06-06
  • java方法替换word文档中需要替换的部分操作步骤

    java方法替换word文档中需要替换的部分操作步骤

    这篇文章主要介绍了java方法替换word文档中需要替换的部分操作的相关资料,需要的朋友可以参考下,包括引入依赖、创建业务方法、测试以及扩展功能,需要的朋友们可以参考下
    2024-12-12
  • Mybatis分解式查询使用方法

    Mybatis分解式查询使用方法

    这篇文章主要介绍了Mybatis分解式查询使用方法,分解式查询就是将一条Sql语句拆分成多条。在 MyBatis 多表查询中,使用连接查询时一个 Sql 语句就可以查询出所有的数据
    2023-04-04
  • java 根据前端返回的字段名进行查询数据

    java 根据前端返回的字段名进行查询数据

    本文介绍了如何在Java中使用SpringDataJPA实现动态查询功能,以便根据前端传递的字段名动态构建查询语句,通过创建实体类、Repository接口、构建动态查询、在Service层和Controller中使用动态查询,实现了前后端分离架构中的灵活查询需求
    2024-11-11

最新评论