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

MyBatis Excutor 攔截器的巧妙用法

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

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

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

這里假設(shè)一個場景:

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

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

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

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

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

3.攔截器簽名:

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

4.接口方法簡單實現(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())));
  //記錄時間
  log.setWhencreated(new Date());
  //TODO 還可以記錄參數(shù),或者單表id操作時,記錄數(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;
}

重點 

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

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

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

總結(jié)

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

相關(guān)文章

  • Spring中的aware接口詳情

    Spring中的aware接口詳情

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

    Spring boot的上傳圖片功能實例詳解

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

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

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

    Java如何使用spire進行word文檔的替換詳解

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

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

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

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

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

    Java使用FTPClient類讀寫FTP

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

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

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

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

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

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

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

最新評論

会昌县| 始兴县| 康马县| 库伦旗| 同江市| 克东县| 惠州市| 玉树县| 涞水县| 五家渠市| 哈尔滨市| 彭泽县| 库车县| 绥阳县| 东乌珠穆沁旗| 延寿县| 阳高县| 吴旗县| 东兴市| 偏关县| 封丘县| 东源县| 黑山县| 广东省| 祁连县| 漳平市| 苍溪县| 柘城县| 辰溪县| 道孚县| 勐海县| 泸水县| 石屏县| 白沙| 行唐县| 长阳| 慈利县| 永善县| 高青县| 石泉县| 葫芦岛市|