-
IBatis和MyBatis在細(xì)節(jié)上有哪些不同量愧?
- 在sql里面變量命名有原來的#變量# 變成了#{變量} 原來的變成了${變量}乳绕;
- 原來在sql節(jié)點(diǎn)里面的class都換名字交type辫樱;
- 原來的queryForObject、queryForList 變成了selectOne厨诸、selectList飒赃;
- 原來的別名設(shè)置在映射文件里面放在了核心配置文件;
-
IBatis和MyBatis在核心處理類分別叫什么聪全?
- IBatis里面的核心處理類交SqlMapClient, MyBatis里面的核心處理類叫做SqlSession
-
Mybatis比IBatis比較大的幾個改進(jìn)是什么泊藕?
- 有接口綁定,包括注解綁定sql和xml綁定Sql ,
- 動態(tài)sql由原來的節(jié)點(diǎn)配置變成OGNL表達(dá)式 OGNL(Object Graphic Navigation Language,對象圖導(dǎo)航語言)
- 在一對一,一對多的時候引進(jìn)了association,在一對多的時候引入了collection 節(jié)點(diǎn),不過都是在resultMap里面配置难礼。
-
使用MyBatis的mapper接口調(diào)用時有哪些要求娃圆?
- Mapper.xml文件中的namespace即是mapper接口的類路徑
- Mapper接口方法名和mapper.xml中定義的每個sql的id相同
- Mapper接口方法的輸入?yún)?shù)類型和mapper.xml中定義的每個sql 的parameterType的類型相同
- Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個sql的resultType的類型相同
-
什么情況下用注解綁定,什么情況下用xml綁定 ?
- 當(dāng)Sql語句比較簡單時候,用注解綁定, 當(dāng)SQL語句比較復(fù)雜時候,用xml綁定,一般用xml綁定的比較多蛾茉。
-
什么是MyBatis的接口綁定,有什么好處讼呢?
- 接口映射就是在MyBatis中任意定義接口,然后把接口里面的方法和SQL語句綁定, 我們直接調(diào)用接口方法就可以,這樣比起原來了SqlSession提供的方法我們可以有更加靈活的選擇和設(shè)置.
-
MyBatis中一級緩存失效的四種情況分別是什么?
- 不同的SqlSession對應(yīng)不同的一級緩存
- 同一個SqlSession但是查詢條件不同
- 同一個SqlSession兩次查詢期間執(zhí)行了任何一次增 刪改操作
- 同一個SqlSession兩次查詢期間手動清空了緩存
-
Mybatis動態(tài)sql是做什么的谦炬?都有哪些動態(tài)sql悦屏?能簡述一下動態(tài)sql的執(zhí)行原理不?
- Mybatis動態(tài)sql可以讓我們在Xml映射文件內(nèi)键思,以標(biāo)簽的形式編寫動態(tài)sql础爬,完成邏輯判斷和動態(tài)拼接sql的功能。
- Mybatis提供了9種動態(tài)sql標(biāo)簽:trim|where|set|foreach|if|choose|when|otherwise|bind吼鳞。
- 其執(zhí)行原理為看蚜,使用OGNL從sql參數(shù)對象中計算表達(dá)式的值,根據(jù)表達(dá)式的值動態(tài)拼接sql赔桌,以此來完成動態(tài)sql的功能供炎。
-
Mybatis的Xml映射文件中,不同的Xml映射文件纬乍,id是否可以重復(fù)碱茁?
- 不同的Xml映射文件,如果配置了namespace仿贬,那么id可以重復(fù)纽竣;如果沒有配置namespace,那么id不能重復(fù);畢竟namespace不是必須的蜓氨,只是最佳實(shí)踐而已聋袋。
- 原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有namespace穴吹,就剩下id幽勒,那么,id重復(fù)會導(dǎo)致數(shù)據(jù)互相覆蓋港令。有了namespace啥容,自然id就可以重復(fù),namespace不同顷霹,namespace+id自然也就不同咪惠。
-
為什么說Mybatis是半自動ORM映射工具?它與全自動的區(qū)別在哪里淋淀?
- Hibernate屬于全自動ORM映射工具遥昧,使用Hibernate查詢關(guān)聯(lián)對象或者關(guān)聯(lián)集合對象時,可以根據(jù)對象關(guān)系模型直接獲取朵纷,所以它是全自動的炭臭。而Mybatis在查詢關(guān)聯(lián)對象或關(guān)聯(lián)集合對象時,需要手動編寫sql來完成袍辞,所以鞋仍,稱之為半自動ORM映射工具。
-
MyBatis實(shí)現(xiàn)一對一有幾種方式?具體怎么操作的搅吁?
- 有聯(lián)合查詢和嵌套查詢,聯(lián)合查詢是幾個表聯(lián)合查詢,只查詢一次, 通過在resultMap里面配置association節(jié)點(diǎn)配置一對一的類就可以完成; 嵌套查詢是先查一個表,根據(jù)這個表里面 的結(jié)果的外鍵id,去再另外一個表里面查詢數(shù)據(jù),也是通過association配置,但另外一個表的查詢通過select屬性配置凿试。
-
MyBatis實(shí)現(xiàn)一對多有幾種方式,怎么操作的?
- 有聯(lián)合查詢和嵌套查詢,聯(lián)合查詢是幾個表聯(lián)合查詢,只查詢一次,通過在resultMap里面配 置collection節(jié)點(diǎn)配置一對多的類就可以完成; 嵌套查詢是先查一個表,根據(jù)這個表里面的 結(jié)果的外鍵id,去再另外一個表里面查詢數(shù)據(jù),也是通過配置collection,但另外一個表的查詢通過select節(jié)點(diǎn)配置似芝。
-
簡述Mybatis的Xml映射文件和Mybatis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之間的映射關(guān)系?
- Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Configuration內(nèi)部板甘。在Xml映射文件中党瓮,<parameterMap>標(biāo)簽會被解析為ParameterMap對象,其每個子元素會被解析為ParameterMapping對象盐类。<resultMap>標(biāo)簽會被解析為ResultMap對象寞奸,其每個子元素會被解析為ResultMapping對象。每一個<select>在跳、<insert>枪萄、<update>、<delete>標(biāo)簽均會被解析為MappedStatement對象猫妙,標(biāo)簽內(nèi)的sql會被解析為BoundSql對象瓷翻。
-
Mybatis都有哪些Executor執(zhí)行器?它們之間的區(qū)別是什么?
Mybatis有三種基本的Executor執(zhí)行器齐帚,SimpleExecutor妒牙、ReuseExecutor、BatchExecutor对妄。- SimpleExecutor:每執(zhí)行一次update或select湘今,就開啟一個Statement對象,用完立刻關(guān)閉Statement對象剪菱。
- ReuseExecutor:執(zhí)行update或select摩瞎,以sql作為key查找Statement對象,存在就使用孝常,不存在就創(chuàng)建旗们,用完后,不關(guān)閉Statement對象茫因,而是放置于Map<String, Statement>內(nèi)蚪拦,供下一次使用。簡言之冻押,就是重復(fù)使用Statement對象驰贷。
- BatchExecutor:執(zhí)行update(沒有select,JDBC批處理不支持select)洛巢,將所有sql都添加到批處理中(addBatch())括袒,等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個Statement對象稿茉,每個Statement對象都是addBatch()完畢后锹锰,等待逐一執(zhí)行executeBatch()批處理。與JDBC批處理相同漓库。
作用范圍:Executor的這些特點(diǎn)恃慧,都嚴(yán)格限制在SqlSession生命周期范圍內(nèi)。