欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis的插件機(jī)制示例詳解

 更新時(shí)間:2019年06月04日 10:54:47   作者:山東大蔥哥  
這篇文章主要給大家介紹了關(guān)于mybatis插件機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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ì)攔截的處理
  2. 使用動(dòng)態(tài)代理對(duì)目標(biāo)對(duì)象進(jìn)行包裝,達(dá)到攔截的目的
  3. 作用于Mybatis的作用域?qū)ο笾?/li>

攔截

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

以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í)例

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

  1. 自定義插件需要實(shí)現(xiàn)上述接口
  2. 增加@Intercepts注解(聲明是哪個(gè)核心組件的插件,以及對(duì)哪些方法進(jìn)行擴(kuò)展)
  3. 在xml文件中配置插件
/** 插件簽名,告訴mybatis單錢插件用來(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)用查詢方法,查詢方法會(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@7e0b0338
Person{id=2001, username='Tom', email='email@0', gender='F'}

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

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

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

總結(jié)

1.遵循插件盡量不使用的原則,因?yàn)闀?huì)修改底層設(shè)計(jì)
2.插件是生成的層層代理對(duì)象的責(zé)任鏈模式,使用反射機(jī)制實(shí)現(xiàn)
3.插件的編寫要考慮全面,特別是多個(gè)插件層層代理的時(shí)候

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 基于springmvc之常用注解,操作傳入?yún)?shù)

    基于springmvc之常用注解,操作傳入?yún)?shù)

    這篇文章主要介紹了springmvc之常用注解,操作傳入?yún)?shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • redis實(shí)現(xiàn)隊(duì)列的阻塞、延時(shí)、發(fā)布和訂閱

    redis實(shí)現(xiàn)隊(duì)列的阻塞、延時(shí)、發(fā)布和訂閱

    本文主要介紹了redis實(shí)現(xiàn)隊(duì)列的阻塞、延時(shí)、發(fā)布和訂閱,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 關(guān)于Kafka消息隊(duì)列原理的總結(jié)

    關(guān)于Kafka消息隊(duì)列原理的總結(jié)

    這篇文章主要介紹了關(guān)于Kafka消息隊(duì)列原理的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Springboot+SpringSecurity實(shí)現(xiàn)圖片驗(yàn)證碼登錄的示例

    Springboot+SpringSecurity實(shí)現(xiàn)圖片驗(yàn)證碼登錄的示例

    本文主要介紹了Springboot+SpringSecurity實(shí)現(xiàn)圖片驗(yàn)證碼登錄的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java中Hibernate的狀態(tài)總結(jié)

    java中Hibernate的狀態(tài)總結(jié)

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于java中Hibernate的狀態(tài)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • jsoup?框架的使用小結(jié)

    jsoup?框架的使用小結(jié)

    jsoup 是一款基于Java的HTML解析器,它提供了一套非常省力的API,不但能直接解析某個(gè)URL地址、HTML文本內(nèi)容,而且還能通過(guò)類似于 DOM、CSS 或者jQuery的方法來(lái)操作數(shù)據(jù),所以jsoup也可以被當(dāng)做爬蟲工具使用,這篇文章主要介紹了jsoup使用,需要的朋友可以參考下
    2023-04-04
  • dubbo自定義異常的完整步驟與測(cè)試

    dubbo自定義異常的完整步驟與測(cè)試

    最近在項(xiàng)目上遇到一個(gè)有關(guān)dubbo的問(wèn)題,想著給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于dubbo自定義異常的完整步驟與測(cè)試的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Struts2學(xué)習(xí)筆記(8)-Result常用類型

    Struts2學(xué)習(xí)筆記(8)-Result常用類型

    這篇文章主要介紹Struts2中Result四種常用的類型的用法,希望能給大家做一個(gè)參考。
    2016-06-06
  • Spring Security自定義登錄原理及實(shí)現(xiàn)詳解

    Spring Security自定義登錄原理及實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring Security自定義登錄原理及實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 刪除JAVA集合中元素的實(shí)現(xiàn)代碼

    刪除JAVA集合中元素的實(shí)現(xiàn)代碼

    有時(shí)候我們要?jiǎng)h除集合中的某些元素,那么就可以參考下面的代碼
    2013-07-07

最新評(píng)論