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類:
1 public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 2 final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); 3