Mybatis中 Dao接口和XML文件的SQL如何建立关联
一、解析XML:
首先,Mybatis在初始化?SqlSessionFactoryBean?的時候,找到?mapperLocations?路徑去解析里面所有的XML文件,這里我們重點關注兩部分。
1、創建SqlSource:
Mybatis會把每個SQL標簽封裝成SqlSource對象。然后根據SQL語句的不同,又分為動態SQL和靜態SQL。其中,靜態SQL包含一段String類型的sql語句;而動態SQL則是由一個個SqlNode組成。
假如我們有這樣一個SQL:
<select id="getUserById" resultType="user">
?? ?select * from user?
?? ?<where>
?? ??? ?<if test="uid!=null">
?? ??? ??? ?and uid=#{uid}
?? ??? ?</if>
?? ?</where>
</select>?? ?
它對應的SqlSource對象看起來應該是這樣的:
2、創建MappedStatement:
ML文件中的每一個SQL標簽就對應一個MappedStatement對象,這里面有兩個屬性很重要。
① id:全限定類名+方法名組成的ID。
② sqlSource:當前SQL標簽對應的SqlSource對象。
創建完?MappedStatement對象,將它緩存到?Configuration 中。Configuration對象就是Mybatis中的大管家,基本所有的配置信息都維護在這里。把所有的XML都解析完成之后,Configuration就包含了所有的SQL信息。
到目前為止,XML就解析完成了。當我們執行Mybatis方法的時候,就通過全限定類名+方法名找到MappedStatement對象,然后解析里面的SQL內容,執行即可。
?
二、Dao接口代理:
我們的Dao接口并沒有實現類,那么,我們在調用它的時候,它是怎樣最終執行到我們的SQL語句的呢?
首先,我們在Spring配置文件中,一般會這樣配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.viewscenes.netsupervisor.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>或者你的項目是基于SpringBoot的,那么肯定也見過這種:?@MapperScan("com.xxx.dao")
它們的作用是一樣的。將包路徑下的所有類注冊到Spring Bean中,并且將它們的beanClass設置為?MapperFactoryBean。MapperFactoryBean?實現了?FactoryBean?接口,俗稱工廠Bean。那么,當我們通過?@Autowired?注入這個Dao接口的時候,返回的對象就是MapperFactoryBean?這個工廠Bean中的?getObject()?方法對象。
那么,這個方法干了些什么呢?
簡單來說,它就是通過JDK動態代理,返回了一個Dao接口的代理對象,這個代理對象的處理器是MapperProxy對象。所有,我們通過@Autowired注入Dao接口的時候,注入的就是這個代理對象,我們調用到Dao接口的方法時,則會調用到MapperProxy對象的invoke()方法。
那么,目前為止,我們通過Dao接口也有了代理實現,所以就可以執行到它里面的方法了。
?
三、執行:
如上所述,當我們調用Dao接口方法的時候,實際調用到代理對象的invoke()方法。 在這里,實際上調用的就是SqlSession里面的東西了。
public class DefaultSqlSession implements SqlSession {public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {try {MappedStatement ms = configuration.getMappedStatement(statement);return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);}} }看到以上代碼,說明我們想的不錯。它就是通過statement(全限定類型+方法名)拿到MappedStatement 對象,然后通過執行器Executor去執行具體SQL并返回。
?
四、總結:
1、針對Mybatis中的Dao接口和XML文件里的SQL是如何建立關系的問題,主要可以歸納為下面幾點小點:
- SqlSource以及動態標簽SqlNode
- MappedStatement對象
- Spring 工廠Bean 以及動態代理
- SqlSession以及執行器
2、針對有兩個XML文件和這個Dao建立關系是否會沖突的問題:不管有幾個XML和Dao建立關系,只要保證namespace+id唯一即可。
總結
以上是生活随笔為你收集整理的Mybatis中 Dao接口和XML文件的SQL如何建立关联的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC多线程:线程池的创建及工作原理 和
- 下一篇: asp.net ajax控件工具集 Au