91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis Excutor 攔截器的巧妙用法

發布時間:2020-09-17 10:59:25 來源:腳本之家 閱讀:175 作者:動力節點 欄目:編程語言

這里要講的巧妙用法是用來實現在攔截器中執行額外 MyBatis 現有方法的用法。

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

這里假設一個場景:

實現一個攔截器,記錄 MyBatis 所有的 insert,update,delete 操作,將記錄的信息存入數據庫。

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

實現過程的關鍵步驟和代碼:

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

2.日志表相關的實體類為SqlLog.

3.攔截器簽名:

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

4.接口方法簡單實現:

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());
  //執行真正的方法
  Object result = invocation.proceed();
  //記錄影響行數
  log.setResult(Integer.valueOf(Integer.parseInt(result.toString())));
  //記錄時間
  log.setWhencreated(new Date());
  //TODO 還可以記錄參數,或者單表id操作時,記錄數據操作前的狀態
  //獲取insertSqlLog方法
  ms = ms.getConfiguration().getMappedStatement("insertSqlLog");
  //替換當前的參數為新的ms
  args[0] = ms;
  //insertSqlLog 方法的參數為 log
  args[1] = log;
  //執行insertSqlLog方法
  invocation.proceed();
  //返回真正方法執行的結果
  return result;
}

重點 

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

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

這里日志的例子就是一個更簡單的應用,并沒有創建ms,只是獲取了一個新的ms替換現有的ms,然后去執行。

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

光泽县| 社旗县| 邮箱| 如东县| 临潭县| 新和县| 八宿县| 上思县| 灌南县| 加查县| 平谷区| 沁阳市| 奇台县| 故城县| 龙州县| 门源| 开平市| 井冈山市| 广宁县| 舞阳县| 五华县| 兴山县| 安福县| 徐州市| 东阳市| 阿拉尔市| 晴隆县| 岑巩县| 将乐县| 固安县| 保亭| 石首市| 房山区| 获嘉县| 玛多县| 凭祥市| 天祝| 阿鲁科尔沁旗| 青铜峡市| 鄂州市| 乡城县|