什么是MyBatis
MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis。是一個(gè)基于Java的持久層框架
下面是精心整理的18個(gè)MyBatis高頻知識(shí)及學(xué)習(xí)筆記,不管處不處在面試階段的朋友都可以領(lǐng)取保存,以備不時(shí)之需
01 18個(gè)MyBatis高頻知識(shí)點(diǎn)(含解析)
1 精講#{}和${}的區(qū)別是什么?
- mybatis在處理#{}時(shí),會(huì)將sql中的#{}替換為?號(hào),調(diào)用PreparedStatement的set方法來賦值。
- mybatis在處理時(shí),就是把{}時(shí),就是把時(shí),就是把{}替換成變量的值。
- 使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性。原因在于:預(yù)編譯機(jī)制。預(yù)編譯完成之后,SQL的結(jié)構(gòu)已經(jīng)固定,即便用戶輸入非法參數(shù),也不會(huì)對(duì)SQL的結(jié)構(gòu)產(chǎn)生影響,從而避免了潛在的安全風(fēng)險(xiǎn)。
- 預(yù)編譯是提前對(duì)SQL語句進(jìn)行預(yù)編譯,而其后注入的參數(shù)將不會(huì)再進(jìn)行SQL編譯。我們知道,SQL注入是發(fā)生在編譯的過程中,因?yàn)閻阂庾⑷肓四承┨厥庾址?,最后被編譯成了惡意的執(zhí)行操作。而預(yù)編譯機(jī)制則可以很好的防止SQL注入。
既然{}會(huì)引起sql注入,為什么有了#{}還需要有{}呢?那其存在的意義是什么?#{}主要用于預(yù)編譯,而預(yù)編譯的場(chǎng)景其實(shí)非常受限,而${}用于替換,很多場(chǎng)景會(huì)出現(xiàn)替換,而這種場(chǎng)景可不是預(yù)編譯2 數(shù)據(jù)庫鏈接中斷如何處理?數(shù)據(jù)庫的訪問底層是通過tcp實(shí)現(xiàn)的,當(dāng)鏈接中斷是程序是無法得知,導(dǎo)致程序一直會(huì)停頓一段時(shí)間在這,最終會(huì)導(dǎo)致用戶體驗(yàn)不好,因此面對(duì)數(shù)據(jù)庫連接中斷的異常,該怎么設(shè)置mybatis呢?connection操作底層是一個(gè)循環(huán)處理操作,因此可以進(jìn)行時(shí)間有關(guān)的參數(shù):
- max_idle_time : 表明最大的空閑時(shí)間,超過這個(gè)時(shí)間socket就會(huì)關(guān)閉
- connect_timeout : 表明鏈接的超時(shí)時(shí)間
數(shù)據(jù)庫服務(wù)器活的杠杠的,但是因?yàn)榫W(wǎng)絡(luò)用塞,客戶端仍然連不上服務(wù)器端,這個(gè)時(shí)候就要設(shè)置timeout,別一直傻等著3 在開發(fā)過程中,經(jīng)常遇到插入重復(fù)的現(xiàn)象,這種情況該如何解決呢?插入的過程一般都是分兩步的:先判斷是否存在記錄,沒有存在則插入否則不插入。如果存在并發(fā)操作,那么同時(shí)進(jìn)行了第一步,然后大家都發(fā)現(xiàn)沒有記錄,然后都插入了數(shù)據(jù)從而造成數(shù)據(jù)的重復(fù)解決插入重復(fù)的思路 :
- 先判斷數(shù)據(jù)庫是否存在數(shù)據(jù),有的話則不進(jìn)行任何操作。沒有數(shù)據(jù)的話,進(jìn)行下一步;
- 向redis set key,其中只有一個(gè)插入操作A會(huì)成功,其他并發(fā)的操作(B和C…)都會(huì)失敗的 ;
- 當(dāng)set key 成功的操作A,開始執(zhí)行插入數(shù)據(jù)操作,無論是否插入數(shù)據(jù)成功,都在需要將redis key刪除?!咀ⅰ坎迦氩怀晒梢远鄧L試幾次,增加成功的概率 ;
- 然而set key 失敗的操作B和C,sleep一下,競(jìng)爭(zhēng)贏的插入操作重復(fù)以上步驟。
總結(jié):多線程同時(shí)插入數(shù)據(jù),誰獲取鎖并插入數(shù)據(jù)成功了其他線程不做任何操作。當(dāng)插入數(shù)據(jù)失敗后,其他線程搶鎖進(jìn)行插入數(shù)據(jù)。篇幅有限,完整版18個(gè)Mybatis高頻知識(shí)點(diǎn)如下所示:(需要下載完整版的朋友可以 私信 “學(xué)習(xí)” 免費(fèi)領(lǐng)取~~)
18個(gè)Mybatis高頻知識(shí)點(diǎn)
02 32道面試常見的MyBtis題目+解析
1 什么是 MyBatis?答:MyBatis 是一個(gè)可以自定義 SQL、存儲(chǔ)過程和高級(jí)映射的持久層框架。2 講下 MyBatis 的緩存答:MyBatis 的緩存分為一級(jí)緩存和二級(jí)緩存,一級(jí)緩存放在 session 里面,默認(rèn)就有,二級(jí)緩存放在它的命名空間里,默認(rèn)是不打開的,使用二級(jí)緩存屬性類需要實(shí)現(xiàn) Serializable 序列化接口(可用來保存對(duì)象的狀態(tài)),可在它的映射文件中配置3 Mybatis 是如何進(jìn)行分頁的?分頁插件的原理是什么?答:1)Mybatis 使用 RowBounds 對(duì)象進(jìn)行分頁,也可以直接編寫 sql 實(shí)現(xiàn)分頁,也可以使用Mybatis 的分頁插件。2)分頁插件的原理:實(shí)現(xiàn) Mybatis 提供的接口,實(shí)現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的 sql,然后重寫 sql。舉例:select * from student,攔截 sql 后重寫為:select t.* from (select * from student)tlimit 0,104 簡(jiǎn)述 Mybatis 的插件運(yùn)行原理,以及如何編寫一個(gè)插件?答:1)Mybatis 僅可以編寫針對(duì) ParameterHandler、ResultSetHandler、StatementHandler、Executor 這 4 種接口的插件,Mybatis 通過動(dòng)態(tài)代理,為需要攔截的接口生成代理對(duì)象以實(shí)現(xiàn)接口方法攔截功能,每當(dāng)執(zhí)行這 4 種接口對(duì)象的方法時(shí),就會(huì)進(jìn)入攔截方法,具體就是InvocationHandler 的 invoke()方法,當(dāng)然,只會(huì)攔截那些你指定需要攔截的方法。2)實(shí)現(xiàn) Mybatis 的 Interceptor 接口并復(fù)寫 intercept()方法,然后在給插件編寫注解,指定要攔截哪一個(gè)接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。
篇幅有限,完整版32道面試常見的Mybatis題目+解析如下所示:
32道面試常見的Mybatis題目+解析
03 MyBatis技術(shù)內(nèi)幕(書籍PDF)
MyBatis技術(shù)內(nèi)幕(書籍PDF)
最后分享一波需要文中分享的那些MyBatis全部學(xué)習(xí)資料的朋友注意啦,轉(zhuǎn)發(fā)+私信 “學(xué)習(xí)”即可免費(fèi)領(lǐng)?。。?!好啦,既然這次談到了Mybatis,那么順便這里在給大家分享一下 【SSM框架】的 技術(shù)圖譜 以及 學(xué)習(xí)資料
SSM框架技術(shù)圖譜
SSM框架學(xué)習(xí)筆記
最后說一次,需要MyBatis以及整個(gè)SSM框架的全部學(xué)習(xí)資料的,轉(zhuǎn)發(fā)+轉(zhuǎn)發(fā)+轉(zhuǎn)發(fā)+私信 “學(xué)習(xí)” 即可免費(fèi)獲取哦~~