2019年Java面試題(十七) Mybatis 2019-04-27

1. 什么是Mybatis轮听?

(1)Mybatis是一個半ORM(對象關(guān)系映射)框架藻茂,它內(nèi)部封裝了JDBC,開發(fā)時只需要關(guān)注SQL語句本身,不需要花費精力去處理加載驅(qū)動折晦、創(chuàng)建連接宁改、創(chuàng)建statement等繁雜的過程谜喊。程序員直接編寫原生態(tài)sql怒坯,可以嚴格控制sql執(zhí)行性能归敬,靈活度高舱污。

(2)MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO映射成數(shù)據(jù)庫中的記錄缤底,避免了幾乎所有的 JDBC 代碼和手動設置參數(shù)以及獲取結(jié)果集膘流。

(3)通過xml 文件或注解的方式將要執(zhí)行的各種 statement 配置起來吸奴,并通過java對象和 statement中sql的動態(tài)參數(shù)進行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結(jié)果映射為java對象并返回。(從執(zhí)行sql到返回result的過程)渐北。

2. Mybaits的優(yōu)點:

答案:

1.把Sql語句從Java中獨立出來破托。

2.封裝了底層的JDBC吴叶,API的調(diào)用逊彭,并且能夠?qū)⒔Y(jié)果集自動轉(zhuǎn)換成JavaBean對象审胸,簡化了Java數(shù)據(jù)庫編程的重復工作。

3.自己編寫Sql語句芽淡,更加的靈活椭赋。

4.入?yún)o需用對象封裝(或者map封裝),使用@Param注解

另一種答案:

(1)基于SQL語句編程,相當靈活,不會對應用程序或者數(shù)據(jù)庫的現(xiàn)有設計造成任何影響,SQL寫在XML里讶迁,解除sql與程序代碼的耦合,便于統(tǒng)一管理;提供XML標簽婶希,支持編寫動態(tài)SQL語句,并可重用换棚。

(2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼萍程,不需要手動開關(guān)連接;

(3)很好的與各種數(shù)據(jù)庫兼容(因為MyBatis使用JDBC來連接數(shù)據(jù)庫嗤堰,所以只要JDBC支持的數(shù)據(jù)庫MyBatis都支持)划鸽。

(4)能夠與Spring很好的集成;

(5)提供映射標簽疏唾,支持對象與數(shù)據(jù)庫的ORM字段關(guān)系映射露氮;提供對象關(guān)系映射標簽莫绣,支持對象關(guān)系組件維護么翰。

3. MyBatis框架的缺點:

(1)SQL語句的編寫工作量較大,尤其當字段多每瞒、關(guān)聯(lián)表多時钞速,對開發(fā)人員編寫SQL語句的功底有一定要求调违。

(2)SQL語句依賴于數(shù)據(jù)庫雳锋,導致數(shù)據(jù)庫移植性差辛蚊,不能隨意更換數(shù)據(jù)庫软啼。

4. MyBatis框架適用場合:

(1)MyBatis專注于SQL本身,是一個足夠靈活的DAO層解決方案贞间。

(2)對性能的要求很高,或者需求變化較多的項目豆同,如互聯(lián)網(wǎng)項目佳晶,MyBatis將是不錯的選擇。

5. ibatis/mybatis框架的優(yōu)缺點?

? ? 優(yōu)點: 易于上手和掌握

? ? ? ? ? sql寫在xml里,便于統(tǒng)一管理和優(yōu)化

? 解除sql與程序代碼的耦合

? 提供對象關(guān)系映射標簽,支持對象關(guān)系組建維護

? 提供xml標簽,支持編寫動態(tài)sql


缺點: 可讀性低,調(diào)試非常困難,非常受限,無法像jdbc那樣在代碼里根據(jù)邏輯實現(xiàn)復雜動態(tài)sql拼接

6. ibatis核心類的作用;MyBatis核心類的作用?

? ? ibatis:

SqlMapClientBuilder: 加載配置文件,返回一個會話

SqlMapClient: 具體的會話

SqlSession: 對數(shù)據(jù)的增刪查改

SqlMapSession: 進行數(shù)據(jù)庫操作

SqlSessionManager: 創(chuàng)建SqlSesstion的對象

SqlMapTransactionManager: 定義事務管理功能

? ? Mybatis:

SqlSessionFactory 每個MyBatis應用的核心

7. mybatis/ibatis跟hibernate的比較;

Hibernate是全自動化的,只要配置映射文件,可以為我們動態(tài)的生成sql

ibatis是半自動化的,需要我們手動的編寫sql,ibatis簡單易學

Hibernate比較復雜,ibatis可以細粒度的優(yōu)化,而Hibernate是根據(jù)映射文件進行優(yōu)化

8. ibatis的工作流程或運行原理?

答案:

Mybatis工作原理:

1.通過SqlSessionFactoryBuilder從mybatis-config.xml配置文件中構(gòu)建出SqlSessionFactory议蟆。

2.SqlSessionFactory開啟一個SqlSession灼伤,通過SqlSession實例獲得Mapper對象并且運行Mapper映射的Sql語句。

3.完成數(shù)據(jù)庫的CRUD操作和事務提交咪鲜,關(guān)閉SqlSession。

另一種答案:

1.在sqlMapConfig的配置文件中進行數(shù)據(jù)庫連接的配置撞鹉。

2.在sqlMapConfig的xml配置文件中引用sqlMap的xml配置文件疟丙。

3.在sqlMap的xml配置文件中進行SQL文件的配置。(文件名稱隨意鸟雏,一般是javaBean的類名加xml享郊。)

4.通過SqlMapClient生成具體的操作,用來操作sqlMap配置文件中SQL文件的IBATIS對象。

5.SqlMapClient對象提供函數(shù)孝鹊,函數(shù)的參數(shù)對應替換sqlMap配置文件的id炊琉,parameter等屬性,完成SQL文件的執(zhí)行

9. #{}和${}的區(qū)別是什么又活?

答案:

${}:簡單字符串替換苔咪,把${}直接替換成變量的值,不做任何轉(zhuǎn)換柳骄,這種是取值以后再去編譯SQL語句团赏。

#{}:預編譯處理,sql中的#{}替換成耐薯?舔清,補全預編譯語句,有效的防止Sql語句注入曲初,這種取值是編譯好SQL語句再取值体谒。

總結(jié):一般用#{}來進行列的代替

另一種答案:

#{}是預編譯處理,${}是字符串替換臼婆。

Mybatis在處理#{}時抒痒,會將sql中的#{}替換為?號,調(diào)用PreparedStatement的set方法來賦值颁褂;

Mybatis在處理${}時评汰,就是把${}替換成變量的值。

使用#{}可以有效的防止SQL注入痢虹,提高系統(tǒng)安全性被去。

10. Mybatis是如何進行分頁的?分頁插件的原理是什么奖唯?

答案:

RowBounds對象分頁

在Sql內(nèi)直接書寫惨缆,帶有物理分頁

另一種答案:

Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁,而非物理分頁坯墨〖呕悖可以在sql內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁功能,也可以使用分頁插件來完成物理分頁捣染。

? ? ? 分頁插件的基本原理是使用Mybatis提供的插件接口骄瓣,實現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql耍攘,然后重寫sql榕栏,根據(jù)dialect方言,添加對應的物理分頁語句和物理分頁參數(shù)蕾各。

11. Ibatis中#與$的區(qū)別扒磁?

(1)#號它會將傳進來的數(shù)據(jù)都當成一個一個字符串,會給數(shù)據(jù)加一對雙引號,而$號它會將傳進來的數(shù)據(jù)直接顯示生成到sql中

(2)#號能夠防止sql的注入,而$號無法防止sql的注入

(3)$方式一把用于傳入數(shù)據(jù)庫對象式曲,比如表名

12. ibatis與mybatis比較? # $ %干什么的

? ? 1 iBATIS3.0以后到goole公司了妨托,更名為mybatis

? ? 2 mybatis增加了接口綁定

? ? 3 傳值方式由##---#{}? $:解析數(shù)據(jù)庫的關(guān)鍵字? %:模糊查詢

? ? 4 mybatis核心類SqlSessionfactory SqlSeession? ? ibatis sqlMapclient

? ? 5 使用ognl表達式,體現(xiàn)在動態(tài)sql上

? ? 6 配置的改變吝羞,如別名的配置兰伤,mybatis移動到了總配置文件中

13. 為什么說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映射工具。

14. Mybatis的一級系吭、二級緩存:

1)一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存五嫂,其存儲作用域為 Session,當 Session flush 或 close 之后肯尺,該 Session 中的所有 Cache 就將清空沃缘,默認打開一級緩存。

2)二級緩存與一級緩存其機制相同则吟,默認也是采用 PerpetualCache槐臀,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace)氓仲,并且可自定義存儲源水慨,如 Ehcache得糜。默認不打開二級緩存,要開啟二級緩存晰洒,使用二級緩存屬性類需要實現(xiàn)Serializable序列化接口(可用來保存對象的狀態(tài)),可在它的映射文件中配置<cache/> 朝抖;

3)對于緩存數(shù)據(jù)更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操作后谍珊,默認該作用域下所有 select 中的緩存將被 clear治宣。

15. mybatis,hibernate如何開發(fā)一對多的案例 過程以及如何配置

? ? ? o : 一方放多方的集合,多方放一方的實體

? ? ? r : 多方放一方的id

? ? ? m :

? ? ? ? mybatis: 查詢數(shù)據(jù)

? ? ? ? ? ? 1 使用嵌套查詢或者嵌套結(jié)果

? ? ? ? ? ? ? ? 嵌套查詢: 先查詢自己的數(shù)據(jù)砌滞,另外發(fā)送一條sql查詢關(guān)聯(lián)數(shù)據(jù)侮邀,在collection標簽上使用select屬性指定id,如select='xxx',

? ? ? ? ? ? ? ? 嵌套結(jié)果: 一條sql查詢自己以及關(guān)聯(lián)數(shù)據(jù)布持,結(jié)果由mybatis自行封裝,在collection標簽上使用resultMap

? ? ? ? ? ? 2 插入數(shù)據(jù) 使用動態(tài)sql

? ? ? hibernate :在set標簽上使用級聯(lián)與反轉(zhuǎn)

? ? ? ? ? ? ? 1 級聯(lián):主對象做什么,其關(guān)聯(lián)對象也做同樣的操作

? ? ? ? ? ? ? 2 反轉(zhuǎn)? 將關(guān)聯(lián)字段的維護權(quán)交給多方陕悬,減少update語句?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末题暖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捉超,更是在濱河造成了極大的恐慌胧卤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拼岳,死亡現(xiàn)場離奇詭異枝誊,居然都是意外死亡,警方通過查閱死者的電腦和手機惜纸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門叶撒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耐版,你說我怎么就攤上這事祠够。” “怎么了粪牲?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵古瓤,是天一觀的道長。 經(jīng)常有香客問我腺阳,道長落君,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任亭引,我火速辦了婚禮绎速,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焙蚓。我一直安慰自己朝氓,他們只是感情好魔市,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赵哲,像睡著了一般待德。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枫夺,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天将宪,我揣著相機與錄音,去河邊找鬼橡庞。 笑死较坛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扒最。 我是一名探鬼主播丑勤,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吧趣!你這毒婦竟也來了法竞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤强挫,失蹤者是張志新(化名)和其女友劉穎岔霸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俯渤,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡呆细,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了八匠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片絮爷。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梨树,靈堂內(nèi)的尸體忽然破棺而出略水,到底是詐尸還是另有隱情,我是刑警寧澤劝萤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布渊涝,位于F島的核電站,受9級特大地震影響床嫌,放射性物質(zhì)發(fā)生泄漏跨释。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一厌处、第九天 我趴在偏房一處隱蔽的房頂上張望鳖谈。 院中可真熱鬧,春花似錦阔涉、人聲如沸缆娃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贯要。三九已至暖侨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崇渗,已是汗流浹背字逗。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宅广,地道東北人葫掉。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像跟狱,于是被迫代替她去往敵國和親俭厚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis 驶臊? MyBatis 是支持定制化 SQL挪挤、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,510評論 0 4
  • Mybatis相關(guān) 1.Mybatis是什么? 2.為什么選擇Mybatis? 3、#{}和${}的區(qū)別是什么资铡? ...
    zhihaoZzz閱讀 1,282評論 0 2
  • Mybatis相關(guān) 1.Mybatis是什么? 2.為什么選擇Mybatis? 3电禀、#{}和${}的區(qū)別是什么幢码? ...
    夢殤_fccd閱讀 982評論 0 5
  • 1.JVM 堆內(nèi)存和非堆內(nèi)存 堆和非堆內(nèi)存按照官方的說法:“Java 虛擬機具有一個堆(Heap)笤休,堆是運行時數(shù)據(jù)...
    yanzhu728閱讀 907評論 0 0
  • 1.StringBuffer與String的區(qū)別 StringBuffer是線程安全的,每次操作字符串症副,Strin...
    zdd5457閱讀 997評論 0 5