最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis Excutor 攔截器的巧妙用法

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

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

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

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

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

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

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

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

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

3.攔截器簽名:

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

4.接口方法簡單實(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ā)問題的,所以幾乎任何情況下都不能去修改這個(gè)對(duì)象(通用Mapper除外),想要對(duì)MappedStatement做修改該怎么辦呢?

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

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

總結(jié)

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

相關(guān)文章

  • Spring中的aware接口詳情

    Spring中的aware接口詳情

    這篇文章主要介紹了Spring中的aware接口詳情,Spring中有很多繼承于aware中的接口,這些接口到底是做什么用到的,下面我們就一起來看看吧,文章詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • Spring boot的上傳圖片功能實(shí)例詳解

    Spring boot的上傳圖片功能實(shí)例詳解

    Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了Spring boot 上傳圖片,需要的朋友可以參考下
    2018-03-03
  • 關(guān)于Java中Bean的生命周期詳解

    關(guān)于Java中Bean的生命周期詳解

    這篇文章主要介紹了關(guān)于Java中Bean的生命周期詳解,所謂的?命周期指的是?個(gè)對(duì)象從誕?到銷毀的整個(gè)?命過程,我們把這個(gè)過程就叫做?個(gè)對(duì)象的?命周期,需要的朋友可以參考下
    2023-08-08
  • Java如何使用spire進(jìn)行word文檔的替換詳解

    Java如何使用spire進(jìn)行word文檔的替換詳解

    創(chuàng)作一份文案經(jīng)常會(huì)高頻率地使用某些詞匯,如地名、人名、人物職位等,若表述有誤,就需要整體撤換,下面這篇文章主要給大家介紹了關(guān)于Java如何使用spire進(jìn)行word文檔的替換的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例

    Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例

    最近工作中遇到了一個(gè)需求,需要利用java獲取字符串中的數(shù)字,嘗試幾種方法后發(fā)現(xiàn)利用正則表達(dá)式實(shí)現(xiàn)最為方法,下面這篇文章就主要介紹了Java通過正則表達(dá)式獲取字符串中數(shù)字的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。
    2017-03-03
  • 在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法

    在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法

    本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡潔的雙括弧初始化的方法,有需要的朋友可以參考一下
    2013-04-04
  • Java使用FTPClient類讀寫FTP

    Java使用FTPClient類讀寫FTP

    這篇文章主要為大家詳細(xì)介紹了Java使用FTPClient類讀寫FTP的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java實(shí)現(xiàn)字符串排列組合問題

    java實(shí)現(xiàn)字符串排列組合問題

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)字符串排列組合問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 在java中main函數(shù)如何調(diào)用外部非static方法

    在java中main函數(shù)如何調(diào)用外部非static方法

    這篇文章主要介紹了在java中main函數(shù)如何調(diào)用外部非static方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java實(shí)現(xiàn)識(shí)別二維碼圖片功能

    java實(shí)現(xiàn)識(shí)別二維碼圖片功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)識(shí)別二維碼圖片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評(píng)論

万全县| 江门市| 庆安县| 连山| 太康县| 嘉兴市| 西乌| 东乌珠穆沁旗| 周宁县| 雷州市| 吴江市| 碌曲县| 凉山| 尚志市| 康马县| 彩票| 灌南县| 缙云县| 绥化市| 宁武县| 余江县| 剑河县| 曲松县| 上林县| 达州市| 茶陵县| 新泰市| 栾城县| 庆城县| 云南省| 吉首市| 昌邑市| 南涧| 蓝山县| 三门县| 阿拉善左旗| 桦川县| 田东县| 丹东市| 郓城县| 井陉县|