日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Mybatis中 Dao接口和XML文件的SQL如何建立关联

發(fā)布時(shí)間:2024/9/30 asp.net 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis中 Dao接口和XML文件的SQL如何建立关联 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、解析XML:

首先,Mybatis在初始化?SqlSessionFactoryBean?的時(shí)候,找到?mapperLocations?路徑去解析里面所有的XML文件,這里我們重點(diǎn)關(guān)注兩部分。

1、創(chuàng)建SqlSource:

Mybatis會把每個(gè)SQL標(biāo)簽封裝成SqlSource對象。然后根據(jù)SQL語句的不同,又分為動態(tài)SQL和靜態(tài)SQL。其中,靜態(tài)SQL包含一段String類型的sql語句;而動態(tài)SQL則是由一個(gè)個(gè)SqlNode組成。

假如我們有這樣一個(gè)SQL:

<select id="getUserById" resultType="user">
?? ?select * from user?
?? ?<where>
?? ??? ?<if test="uid!=null">
?? ??? ??? ?and uid=#{uid}
?? ??? ?</if>
?? ?</where>
</select>?? ?

它對應(yīng)的SqlSource對象看起來應(yīng)該是這樣的:

2、創(chuàng)建MappedStatement:

ML文件中的每一個(gè)SQL標(biāo)簽就對應(yīng)一個(gè)MappedStatement對象,這里面有兩個(gè)屬性很重要。

① id:全限定類名+方法名組成的ID。

② sqlSource:當(dāng)前SQL標(biāo)簽對應(yīng)的SqlSource對象。

創(chuàng)建完?MappedStatement對象,將它緩存到?Configuration 中。Configuration對象就是Mybatis中的大管家,基本所有的配置信息都維護(hù)在這里。把所有的XML都解析完成之后,Configuration就包含了所有的SQL信息。

到目前為止,XML就解析完成了。當(dāng)我們執(zhí)行Mybatis方法的時(shí)候,就通過全限定類名+方法名找到MappedStatement對象,然后解析里面的SQL內(nèi)容,執(zhí)行即可。

?

二、Dao接口代理:

我們的Dao接口并沒有實(shí)現(xiàn)類,那么,我們在調(diào)用它的時(shí)候,它是怎樣最終執(zhí)行到我們的SQL語句的呢?

首先,我們在Spring配置文件中,一般會這樣配置:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.viewscenes.netsupervisor.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>

或者你的項(xiàng)目是基于SpringBoot的,那么肯定也見過這種:?@MapperScan("com.xxx.dao")

它們的作用是一樣的。將包路徑下的所有類注冊到Spring Bean中,并且將它們的beanClass設(shè)置為?MapperFactoryBean。MapperFactoryBean?實(shí)現(xiàn)了?FactoryBean?接口,俗稱工廠Bean。那么,當(dāng)我們通過?@Autowired?注入這個(gè)Dao接口的時(shí)候,返回的對象就是MapperFactoryBean?這個(gè)工廠Bean中的?getObject()?方法對象。

那么,這個(gè)方法干了些什么呢?

簡單來說,它就是通過JDK動態(tài)代理,返回了一個(gè)Dao接口的代理對象,這個(gè)代理對象的處理器是MapperProxy對象。所有,我們通過@Autowired注入Dao接口的時(shí)候,注入的就是這個(gè)代理對象,我們調(diào)用到Dao接口的方法時(shí),則會調(diào)用到MapperProxy對象的invoke()方法。

那么,目前為止,我們通過Dao接口也有了代理實(shí)現(xiàn),所以就可以執(zhí)行到它里面的方法了。

?

三、執(zhí)行:

如上所述,當(dāng)我們調(diào)用Dao接口方法的時(shí)候,實(shí)際調(diào)用到代理對象的invoke()方法。 在這里,實(shí)際上調(diào)用的就是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);}} }

看到以上代碼,說明我們想的不錯(cuò)。它就是通過statement(全限定類型+方法名)拿到MappedStatement 對象,然后通過執(zhí)行器Executor去執(zhí)行具體SQL并返回。

?

四、總結(jié):

1、針對Mybatis中的Dao接口和XML文件里的SQL是如何建立關(guān)系的問題,主要可以歸納為下面幾點(diǎn)小點(diǎn):

  • SqlSource以及動態(tài)標(biāo)簽SqlNode
  • MappedStatement對象
  • Spring 工廠Bean 以及動態(tài)代理
  • SqlSession以及執(zhí)行器

2、針對有兩個(gè)XML文件和這個(gè)Dao建立關(guān)系是否會沖突的問題:不管有幾個(gè)XML和Dao建立關(guān)系,只要保證namespace+id唯一即可。

總結(jié)

以上是生活随笔為你收集整理的Mybatis中 Dao接口和XML文件的SQL如何建立关联的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。