MyBatis框架是如何去執(zhí)行SQL語句?相信不只是你們,筆者也想要知道是如何進(jìn)行的。相信有上一章的引導(dǎo)大家都知道SqlSession接口的作用。當(dāng)然默認(rèn)情況下還是使用DefaultSqlSession類。關(guān)于SqlSession接口的用法有很多種。筆者還是比較喜歡用getMapper方法。對(duì)于getMapper方法的實(shí)現(xiàn)方式。筆者不能下一個(gè)定論。筆者只是想表示一下自己的理解而以——?jiǎng)討B(tài)代理。
筆者把關(guān)于getMapper方法的實(shí)現(xiàn)方式理解為動(dòng)態(tài)代理。事實(shí)上筆者還想說他可以是一個(gè)AOP思想的實(shí)現(xiàn)。那么具體是一個(gè)什么樣子?xùn)|西。相信筆者說了也不能代表什么。一切還是有大家自己去查看和理解。從源碼上我們可以看到getMapper方法會(huì)去調(diào)用Configuration類的getMapper方法。好了。一切的開始都在這里了。
DefaultSqlSession類:
public <T> T getMapper(Class<T> type) { return configuration.<T>getMapper(type, this); }
對(duì)于Configuration類上一章里面就說明他里面存放了所有關(guān)于XML文件的配置信息。從參數(shù)上我們可以看到他要我們傳入一個(gè)Class<T>類型。這已經(jīng)可以看到后面一定要用到反射機(jī)制和動(dòng)態(tài)生成相應(yīng)的類實(shí)例。讓我們進(jìn)一步查看一下源碼。
Configuration類:
public <T> T getMapper(Class<T> type, SqlSession sqlSession) { return mapperRegistry.getMapper(type, sqlSession); }
當(dāng)筆者點(diǎn)擊進(jìn)來發(fā)現(xiàn)他又調(diào)用MapperRegistry類的getMapper方法的時(shí)候,心里面有一種又恨又愛的沖動(dòng)——這就是構(gòu)架之美和復(fù)雜之恨。MapperRegistry類筆者把他理解存放動(dòng)態(tài)代理工廠(MapperProxyFactory類)的庫存。當(dāng)然我們還是進(jìn)去看一看源碼吧。
MapperRegistry類:
1 public <T> T getMapper(Class<T> type, SqlSession sqlSession) { 2 final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type); 3 &n