hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

mybatis的插件机制

2019-11-18杂谈搜奇网32°c
A+ A-

一、mybatis的插件引见

关于mybatis的插件,我想人人也都用过,就比方最经常运用的逆向工程,依据表构造生成model,dao,xml文件,另有分页插件,那这些插件的事情道理是怎样的呢,就比方分页插件,它为什么能转变我们在xml文件中写的sql语句,本文将带人人一起来相识mybatis的插件机制。(由于本人也是在不断学习,文中不免有毛病或不足之处,还望斧正,本文基于mybatis3.3.0版本),下面将缭绕这几个方面

1、插件进口,即怎样把插件注入到mybatis代码内里

2、插件能阻拦哪些类或哪些要领

3、举例浅易分表插件道理

二、插件进口

在先相识前,我们来一段自定义mybatis插件的代码

 1 import org.apache.ibatis.executor.statement.StatementHandler;
 2 import org.apache.ibatis.plugin.*;
 3 
 4 import java.sql.Connection;
 5 import java.util.Properties;
 6 
 7 @Intercepts(
 8         value = {
 9                 @Signature(
10                         type = StatementHandler.class,
11                         method = "prepare",
12                         args = {Connection.class} // 差别版本的prepare要领参数不一样,高版本的另有一个Integer参数
13                 )
14         }
15 )
16 public class PluginDemo implements Interceptor {
17     @Override
18     public Object intercept(Invocation invocation) throws Throwable {
19         return invocation.proceed();
20     }
21 
22     @Override
23     public Object plugin(Object target) {
24         return Plugin.wrap(target,this);
25     }
26 
27     @Override
28     public void setProperties(Properties properties) {
29 
30     }

 

要自定义mybatis插件,必须得完成Interceptor接口,这个接口有三个笼统要领

1、intercept,这个要领是mybatis的中心要领,要完成自定义逻辑,基础都是革新这个要领,个中invocation参数能够经由历程反射要猎取原始要领和对应参数信息

2、plugin,它的作用是用来生成一个阻拦对方,也就是代办对象,使得被代办的对象一定会经由intercept要领,一般都邑运用mybatis供应的东西类Plugin来猎取代办对象,假如有本身奇特需求,能够自定义

3、setProperties,这个要领就是用来设置插件的一些属性

个中@intercepts注解就是用来标明阻拦哪些类,哪些要领。

当我们离开spring容器来运用mybatis的时刻,我们一般是如许写代码的

 

 

 而在mybatisConfig.xml文件中,我们有设置数据库衔接信息,插件,别号,mapper文件映照地点等信息,(温馨提醒,这些设置有一定递次,假如不根据递次设置,则mybatis剖析时会抛出非常,细致设置信息能够参考mbatis的dtd文件设置)既然在设置文件中设置了,那一定也会被剖析掉,如下图,在XmlConfigBuild中举行剖析

 

剖析后,插件信息会被存储到configuation中InterceptorChain鸠合内里,这个configuation在mybatis运转周期是一个单例的,它担任存储一切的设置信息

 

 

 

 

 终究,mybatis的插件信息完全的注入到了configuation内里。

二、mybaits插件能阻拦哪些类或哪些要领

在一般开辟流程中,我们基础都是经由历程先猎取sqlSession,假如不采纳自定义设置,在默许的sqlsession完成就是defaultSqlSession,在该类的一个要领里就隐含了融会插件,

个中会猎取到executor,这个类是经由历程configuation猎取的,

 

 终究融会插件的要领就是图中红框的代码。它会为原始的executor类生成代办类。从而你在实行executor类的一些要领时,比方query,update要领,会教师成对应的代办对象,myabtis采纳的是jdk的动态代办,代办后,你实行executor类的query,update要领时会自动转接到你自定义的插件intercept要领内里,也能够理解为掩盖本来的要领。

经由历程这,我们也许也能够猜想的出,mybatis插件要阻拦的类,很大原因在configuation类中有生成,也不带人人绕弯子了,来看截图

阻拦statementHandler接口的完成类,它经由历程routingStatementHandler来完成路由,终究定向到prepareStatementHandler类

阻拦parameterHandler。这个接口是用来封装参数用的,也就是终究将参数设置到sql内里

 

阻拦ResultSetHandler接口,它重要用于处置惩罚sql运转返回的效果

 

 

 总结,mybatis能够阻拦的类分四大类

一、executor,executor类能够说是实行sql的全历程,如组装参数,sql革新,效果处置惩罚,比较普遍,但现实用的不多

二、StatementHandler,这个是实行sql的历程,能够猎取到待实行的sql,可用来革新sql,如分页,分表,最常阻拦的类

三、paremeterHandler,这个用来阻拦sql的参数,能够自定义参数组装划定规矩

四、resultHandler,这个用来处置惩罚效果

三、浅易版分表插件

 1 import org.apache.ibatis.executor.statement.StatementHandler;
 2 import org.apache.ibatis.mapping.BoundSql;
 3 import org.apache.ibatis.plugin.*;
 4 import org.apache.ibatis.reflection.MetaObject;
 5 import org.apache.ibatis.reflection.SystemMetaObject;
 6 
 7 import java.sql.Connection;
 8 import java.util.Properties;
 9 
10 @Intercepts(
11         value = {
12                 @Signature(
13                         type = StatementHandler.class,
14                         method = "prepare",
15                         args = {Connection.class}
16                 )
17         }
18 )
19 public class PluginDemo implements Interceptor {
20     @Override
21     public Object intercept(Invocation invocation) throws Throwable {
22 
23         /**
24          * 猎取被阻拦的现在类,在这里是阻拦了statementHandler,一切现在类也就是它
25          * 经由历程这个类我们能够拿到待实行的sql语句,一般运用mataObject东西类来猎取
26          * 关于这个东西类,人人可自行相识,个人以为这个东西类很壮大
27           */
28         StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
29         MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
30         /**
31          * 先诠释下为什么写成delegate.boundSql就能够拿到boundSql类
32          * 从前面也能够得知,statementHandler的默许完成是routingStatementHandler。
33          * 这个类有一个属性statementHandler,属性名就叫delegate,而这个属性的默许完成又是preparedStatementHandler
34          * 背面这个类又有属性boundSql,所以,终究构成的写法就是delegate.boundSql。
35          * 所以这也表现了MetaObject东西类的壮大,能够经由历程实例传参,就能够依据属性名猎取对应属性值
36          */
37         BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
38 
39         // 待实行的sql,在这里也就是预编译后的sql,即参数位都是?号
40         String sql = boundSql.getSql();
41         /**
42          * 既然拿到了预编译后的sql,那就能够根据你本身的主意随心所欲,如分页,按年分表等等
43          * 分表的话,个人引荐druid的sql剖析器,我以为照样不错的,人人能够自行相识
44          * 末了革新完sql,别忘了把它设置归去
45          * metaObject.setValue("delegate.boundSql.sql",sql);
46          *  invocation.proceed,即原始要领的实行
47          *  注重点就是,由于mybatis插件采纳的是代办形式,所以假如存在多个插件,会构成多个代办
48          *  你假如要拿到最原始的对象,还得进一步举行剖析
49          *  如:while(metaObject.getValue(""h) != null){
50          *      Object obj = metaObject.getValue("h");
51          *       ....
52          *  }
53          */
54         return invocation.proceed();
55     }
56 
57     @Override
58     public Object plugin(Object target) {
59         return Plugin.wrap(target,this);
60     }
61 
62     @Override
63     public void setProperties(Properties properties) {
64 
65     }
66 }

 

 -----------------------------------------------------------------------------------------------------------------------------分界线-------------------------------------------------------------------------------------

以上就是全部内容

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
mybatis的插件机制

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282133.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>