MyBatis框架是如何去執(zhí)行SQL語句?相信不只是你們,筆者也想要知道是如何進行的。相信有上一章的引導大家都知道SqlSession接口的作用。當然默認情況下還是使用DefaultSqlSession類。關于SqlSession接口的用法有很多種。筆者還是比較喜歡用getMapper方法。對于getMapper方法的實現(xiàn)方式。筆者不能下一個定論。筆者只是想表示一下自己的理解而以——動態(tài)代理。

筆者把關于getMapper方法的實現(xiàn)方式理解為動態(tài)代理。事實上筆者還想說他可以是一個AOP思想的實現(xiàn)。那么具體是一個什么樣子東西。相信筆者說了也不能代表什么。一切還是有大家自己去查看和理解。從源碼上我們可以看到getMapper方法會去調用Configuration類的getMapper方法。好了。一切的開始都在這里了。

DefaultSqlSession類:

 public <T> T getMapper(Class<T> type) {    return configuration.<T>getMapper(type, this);
  }

對于Configuration類上一章里面就說明他里面存放了所有關于XML文件的配置信息。從參數(shù)上我們可以看到他要我們傳入一個Class<T>類型。這已經(jīng)可以看到后面一定要用到反射機制和動態(tài)生成相應的類實例。讓我們進一步查看一下源碼。

Configuration類:

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {    return mapperRegistry.getMapper(type, sqlSession);
  }

當筆者點擊進來發(fā)現(xiàn)他又調用MapperRegistry類的getMapper方法的時候,心里面有一種又恨又愛的沖動——這就是構架之美和復雜之恨。MapperRegistry類筆者把他理解存放動態(tài)代理工廠(MapperProxyFactory類)的庫存。當然我們還是進去看一看源碼吧。

MapperRegistry類:

萬碼學堂,電腦培訓,計算機培訓,Java培訓,JavaEE開發(fā)培訓,青島軟件培訓,軟件工程師培訓

 1  public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 2     final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); 3