亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis Excutor 攔截器的巧妙用法

 更新時(shí)間:2017年10月13日 14:14:40   作者:動(dòng)力節(jié)點(diǎn)  
這里要講的巧妙用法是用來(lái)實(shí)現(xiàn)在攔截器中執(zhí)行額外 MyBatis 現(xiàn)有方法的用法,并提供了解決攔截Executor時(shí)想要修改MappedStatement時(shí)解決并發(fā)的問(wèn)題。感興趣的朋友一起看看吧

這里要講的巧妙用法是用來(lái)實(shí)現(xiàn)在攔截器中執(zhí)行額外 MyBatis 現(xiàn)有方法的用法。

并且會(huì)提供一個(gè)解決攔截Executor時(shí)想要修改MappedStatement時(shí)解決并發(fā)的問(wèn)題。

這里假設(shè)一個(gè)場(chǎng)景:

實(shí)現(xiàn)一個(gè)攔截器,記錄 MyBatis 所有的 insert,update,delete 操作,將記錄的信息存入數(shù)據(jù)庫(kù)。

這個(gè)用法在這里就是將記錄的信息存入數(shù)據(jù)庫(kù)。

實(shí)現(xiàn)過(guò)程的關(guān)鍵步驟和代碼:

1.首先在某個(gè) Mapper.xml 中定義好了一個(gè)往日志表中插入記錄的方法,假設(shè)方法為id="insertSqlLog"。

2.日志表相關(guān)的實(shí)體類(lèi)為SqlLog.

3.攔截器簽名:

@Intercepts({@org.apache.ibatis.plugin.Signature(
  type=Executor.class, 
  method="update", 
  args={MappedStatement.class, Object.class})})
public class SqlInterceptor implements Interceptor

4.接口方法簡(jiǎn)單實(shí)現(xiàn):

public Object intercept(Invocation invocation) throws Throwable {
  Object[] args = invocation.getArgs();
  MappedStatement ms = (MappedStatement) args[0];
  Object parameter = args[1];
  SqlLog log = new SqlLog();
  Configuration configuration = ms.getConfiguration();
  Object target = invocation.getTarget();
  StatementHandler handler = configuration.newStatementHandler((Executor) target, ms, 
       parameter, RowBounds.DEFAULT, null, null);
  BoundSql boundSql = handler.getBoundSql();
  //記錄SQL
  log.setSqlclause(boundSql.getSql());
  //執(zhí)行真正的方法
  Object result = invocation.proceed();
  //記錄影響行數(shù)
  log.setResult(Integer.valueOf(Integer.parseInt(result.toString())));
  //記錄時(shí)間
  log.setWhencreated(new Date());
  //TODO 還可以記錄參數(shù),或者單表id操作時(shí),記錄數(shù)據(jù)操作前的狀態(tài)
  //獲取insertSqlLog方法
  ms = ms.getConfiguration().getMappedStatement("insertSqlLog");
  //替換當(dāng)前的參數(shù)為新的ms
  args[0] = ms;
  //insertSqlLog 方法的參數(shù)為 log
  args[1] = log;
  //執(zhí)行insertSqlLog方法
  invocation.proceed();
  //返回真正方法執(zhí)行的結(jié)果
  return result;
}

重點(diǎn) 

MappedStatement是一個(gè)共享的緩存對(duì)象,這個(gè)對(duì)象是存在并發(fā)問(wèn)題的,所以幾乎任何情況下都不能去修改這個(gè)對(duì)象(通用Mapper除外),想要對(duì)MappedStatement做修改該怎么辦呢?

并不難,Executor中的攔截器方法參數(shù)中都有MappedStatement ms,這個(gè)ms就是后續(xù)方法執(zhí)行要真正用到的MappedStatement,這樣一來(lái),問(wèn)題就容易解決了,根據(jù)自己的需要,深層復(fù)制MappedStatement對(duì)象中自己需要修改的屬性,然后修改這部分屬性,之后將修改后的ms通過(guò)上面代碼中args[0]=ms這種方式替換原有的參數(shù),這樣就能實(shí)現(xiàn)對(duì)ms的修改而且不會(huì)有并發(fā)問(wèn)題了。

這里日志的例子就是一個(gè)更簡(jiǎn)單的應(yīng)用,并沒(méi)有創(chuàng)建ms,只是獲取了一個(gè)新的ms替換現(xiàn)有的ms,然后去執(zhí)行。

總結(jié)

以上所述是小編給大家介紹的MyBatis Excutor 攔截器的巧妙用法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • nacos gateway動(dòng)態(tài)路由實(shí)戰(zhàn)

    nacos gateway動(dòng)態(tài)路由實(shí)戰(zhàn)

    這篇文章主要介紹了nacos gateway動(dòng)態(tài)路由實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • mybatis教程之查詢(xún)緩存(一級(jí)緩存二級(jí)緩存和整合ehcache)

    mybatis教程之查詢(xún)緩存(一級(jí)緩存二級(jí)緩存和整合ehcache)

    這篇文章主要介紹了mybatis教程之查詢(xún)緩存(一級(jí)緩存二級(jí)緩存和整合ehcache),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 基于slf4j日志MDC輸出格式的問(wèn)題

    基于slf4j日志MDC輸出格式的問(wèn)題

    這篇文章主要介紹了基于slf4j日志MDC輸出格式的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java設(shè)計(jì)模式之觀(guān)察者模式(Observer Pattern)詳解

    Java設(shè)計(jì)模式之觀(guān)察者模式(Observer Pattern)詳解

    觀(guān)察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都能夠自動(dòng)地得到通知并進(jìn)行更新,本文將詳細(xì)的給大家介紹一下Java觀(guān)察者模式,需要的朋友可以參考下
    2023-07-07
  • 重寫(xiě)hashCode()和equals()方法詳細(xì)介紹

    重寫(xiě)hashCode()和equals()方法詳細(xì)介紹

    這篇文章主要介紹了重寫(xiě)hashCode()和equals()方法詳細(xì)介紹,涉及重寫(xiě)equals()方法,重寫(xiě)hashCode()方法,重寫(xiě)equals()而不重寫(xiě)hashCode()的風(fēng)險(xiǎn)等相關(guān)內(nèi)容的介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java中你絕對(duì)沒(méi)用過(guò)的一個(gè)關(guān)鍵字Record的使用

    Java中你絕對(duì)沒(méi)用過(guò)的一個(gè)關(guān)鍵字Record的使用

    這篇文章主要給大家介紹一個(gè)?Java?中的一個(gè)關(guān)鍵字?Record,那?Record?關(guān)鍵字跟不可變類(lèi)有什么關(guān)系呢?看完今天的文章你就知道了,快跟隨小編一起學(xué)習(xí)一下吧
    2022-11-11
  • 使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢(xún)和更新操作

    使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢(xún)和更新操作

    這篇文章主要介紹了使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢(xún)和更新操作,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Springboot2 配置AOP日志的方法步驟

    Springboot2 配置AOP日志的方法步驟

    這篇文章主要介紹了Springboot2 配置AOP日志的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 詳解在SpringBoot中使用MongoDb做單元測(cè)試的代碼

    詳解在SpringBoot中使用MongoDb做單元測(cè)試的代碼

    這篇文章主要介紹了詳解在SpringBoot中使用MongoDb做單元測(cè)試的代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java 中Collection存儲(chǔ)器詳解及簡(jiǎn)單實(shí)例

    java 中Collection存儲(chǔ)器詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java 中Collection存儲(chǔ)器詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論