溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mybatis插件機(jī)制的示例分析

發(fā)布時(shí)間:2021-12-28 11:34:18 來(lái)源:億速云 閱讀:108 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“mybatis插件機(jī)制的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“mybatis插件機(jī)制的示例分析”這篇文章吧。

前言

Mybatis作為一個(gè)應(yīng)用廣泛的優(yōu)秀的ORM框架,已經(jīng)成了JavaWeb世界近乎標(biāo)配的部分,這個(gè)框架具有強(qiáng)大的靈活性,在四大組件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)處提供了簡(jiǎn)單易用的插件擴(kuò)展機(jī)制。Mybatis對(duì)持久層的操作就是借助于四大核心對(duì)象。MyBatis支持用插件對(duì)四大核心對(duì)象進(jìn)行攔截,對(duì)mybatis來(lái)說(shuō)插件就是攔截器,用來(lái)增強(qiáng)核心對(duì)象的功能,增強(qiáng)功能本質(zhì)上是借助于底層的動(dòng)態(tài)代理實(shí)現(xiàn)的,換句話說(shuō),MyBatis中的四大對(duì)象都是代理對(duì)象。

四大核心對(duì)象簡(jiǎn)介

MyBatis 四大核心對(duì)象

ParameterHandler:處理SQL的參數(shù)對(duì)象

ResultSetHandler:處理SQL的返回結(jié)果集

StatementHandler:數(shù)據(jù)庫(kù)的處理對(duì)象,用于執(zhí)行SQL語(yǔ)句

Executor:MyBatis的執(zhí)行器,用于執(zhí)行增刪改查操作

Mybatis插件原理

  1. Mybatis的插件借助于責(zé)任鏈的模式進(jìn)行對(duì)攔截的處理  使用動(dòng)態(tài)代理對(duì)目標(biāo)對(duì)象進(jìn)行包裝,達(dá)到攔截的目的  作用于Mybatis的作用域?qū)ο笾?/p>

攔截

插件具體是如何攔截并附加額外的功能的呢?

以ParameterHandler 來(lái)說(shuō)

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object object, BoundSql sql, InterceptorChain interceptorChain){ ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement,object,sql); parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler); return parameterHandler; }public Object pluginAll(Object target) { for (Interceptor interceptor : interceptors) { target = interceptor.plugin(target); } return target; }

interceptorChain 保存了所有的攔截器(interceptors),是mybatis初始化的時(shí)候創(chuàng)建的。調(diào)用攔截器鏈中的攔截器依次的對(duì)目標(biāo)進(jìn)行攔截或增強(qiáng)。interceptor.plugin(target)中的target就可以理解為mybatis中的四大對(duì)象。返回的target是被重重代理后的對(duì)象。

插件接口

Mybatis插件接口-Interceptor

1.Intercept方法,插件的核心方法

2.plugin方法,生成target的代理對(duì)象

3.setProperties方法,傳遞插件所需參數(shù)

插件實(shí)例

插件開(kāi)發(fā)需要以下步驟

  1. 自定義插件需要實(shí)現(xiàn)上述接口  增加@Intercepts注解(聲明是哪個(gè)核心組件的插件,以及對(duì)哪些方法進(jìn)行擴(kuò)展)  在xml文件中配置插件

/** 插件簽名,告訴mybatis單錢(qián)插件用來(lái)攔截那個(gè)對(duì)象的哪個(gè)方法 **/@Intercepts({@Signature(type = ResultSetHandler.class,method ="handleResultSets",args = Statement.class)})public class MyFirstInterceptor implements Interceptor { /** @Description 攔截目標(biāo)對(duì)象的目標(biāo)方法 **/ @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println("攔截的目標(biāo)對(duì)象:"+invocation.getTarget()); Object object = invocation.proceed(); return object; } /** * @Description 包裝目標(biāo)對(duì)象 為目標(biāo)對(duì)象創(chuàng)建代理對(duì)象 * @Param target為要攔截的對(duì)象 * @Return 代理對(duì)象 */ @Override public Object plugin(Object target) { System.out.println("將要包裝的目標(biāo)對(duì)象:"+target); return Plugin.wrap(target,this); } /** 獲取配置文件的屬性 **/ @Override public void setProperties(Properties properties) { System.out.println("插件配置的初始化參數(shù):"+properties); }}

在mybatis.xml中配置插件

<!-- 自定義插件 --> <plugins>  <plugin interceptor="mybatis.interceptor.MyFirstInterceptor">   <!--配置參數(shù)-->   <property name="name" value="Bob"/>  </plugin> </plugins>

調(diào)用查詢(xún)方法,查詢(xún)方法會(huì)返回ResultSet

public class MyBatisTest { public static SqlSessionFactory sqlSessionFactory = null; public static SqlSessionFactory getSqlSessionFactory() {  if (sqlSessionFactory == null) {   String resource = "mybatis-config.xml";   try {    Reader reader = Resources.getResourceAsReader(resource);    sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);   } catch (IOException e) {    e.printStackTrace();   }  }  return sqlSessionFactory; } public void testGetById() {  SqlSession sqlSession = this.getSqlSessionFactory().openSession();  PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);  Person person=personMapper.getById(2001);  System.out.println(person.toString()); }public static void main(String[] args) {  new MyBatisTest().testGetById(); }}

輸出結(jié)果

插件配置的初始化參數(shù):{name=Bob}將要包裝的目標(biāo)對(duì)象:org.apache.ibatis.executor.CachingExecutor@754ba872將要包裝的目標(biāo)對(duì)象:org.apache.ibatis.scripting.defaults.DefaultParameterHandler@192b07fd將要包裝的目標(biāo)對(duì)象:org.apache.ibatis.executor.resultset.DefaultResultSetHandler@7e0b0338將要包裝的目標(biāo)對(duì)象:org.apache.ibatis.executor.statement.RoutingStatementHandler@1e127982攔截的目標(biāo)對(duì)象:org.apache.ibatis.executor.resultset.DefaultResultSetHandler@7e0b0338Person{id=2001, username='Tom', email='email@0', gender='F'}

多插件開(kāi)發(fā)過(guò)程

1.創(chuàng)建代理對(duì)象時(shí),按照插件配置的順序進(jìn)行包裝

2.執(zhí)行目標(biāo)方法后,是按照代理的逆向進(jìn)行執(zhí)行

以上是“mybatis插件機(jī)制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI