更新時(shí)間:2022-12-19 16:06:12 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1549次
MyBatis是一個(gè)半ORM(對(duì)象關(guān)系映射)框架,它內(nèi)部封裝了JDBC,開(kāi)發(fā)時(shí)只需要關(guān)注SQL語(yǔ)句本身,不需要花費(fèi)精力去加載驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建Statement等繁雜過(guò)程。程序員直接編寫(xiě)原生態(tài)sql,可以嚴(yán)格控制sql執(zhí)行性能,靈活度高。所以MyBatis是我們?cè)诿嬖嚂r(shí)需要準(zhǔn)備的:
1、#{}和${}的區(qū)別是什么?
${}是字符串替換,相當(dāng)于直接顯示數(shù)據(jù),#{}是預(yù)編譯處理,相當(dāng)于對(duì)數(shù)據(jù)加上雙引號(hào)
即#是將傳入的值當(dāng)做字符串的形式,先替換為?號(hào),然后調(diào)用PreparedStatement的set方法來(lái)賦值,而$是將傳入的數(shù)據(jù)直接顯示生成sql語(yǔ)句
--Mybatis在處理#{}時(shí)
select id,name,age from student where id =#{id}
當(dāng)前端把id值1傳入到后臺(tái)的時(shí)候,就相當(dāng)于:
select id,name,age from student where id ='1'
--Mybatis在處理${}時(shí)
select id,name,age from student where id =${id}
當(dāng)前端把id值1傳入到后臺(tái)的時(shí)候,就相當(dāng)于:
select id,name,age from student where id = 1
PS:使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性(語(yǔ)句的拼接),如果使用在order by 中就需要使用 ${}。
最大區(qū)別在于:#{} 傳入值時(shí),sql解析參數(shù)是帶引號(hào)的,而${}傳入值時(shí),sql解析參數(shù)是不帶引號(hào)的。
2、如何理解Mybatis?(Mybatis是什么)
Mybatis內(nèi)部封裝了jdbc,開(kāi)發(fā)者只需要關(guān)注sql語(yǔ)句本身,而不需要花費(fèi)精力去處理加載驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建statement等繁雜的過(guò)程。
mybatis通過(guò)xml或注解的方式將要執(zhí)行的各種statement配置起來(lái),并通過(guò)java對(duì)象和statement中sql的動(dòng)態(tài)參數(shù)進(jìn)行映射生成最終執(zhí)行的sql語(yǔ)句,最后由mybatis框架執(zhí)行sql并將結(jié)果映射為java對(duì)象并返回。
(3)MyBatis 支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生信息,將接口和 Java 的 POJO映射成數(shù)據(jù)庫(kù)中的記錄。
3、Mybatis 中一級(jí)緩存與二級(jí)緩存的區(qū)別?
緩存:合理使用緩存是優(yōu)化中最常見(jiàn)的方法之一,將從數(shù)據(jù)庫(kù)中查詢(xún)出來(lái)的數(shù)據(jù)放入緩存中,下次使用時(shí)不必從數(shù)據(jù)庫(kù)查詢(xún),而是直接從緩存中讀取,避免頻繁操作數(shù)據(jù)庫(kù),減輕數(shù)據(jù)庫(kù)的壓力,同時(shí)提高系統(tǒng)性能。
一級(jí)緩存是SqlSession級(jí)別的緩存:
Mybatis對(duì)緩存提供支持,但是在沒(méi)有配置的默認(rèn)情況下,它只開(kāi)啟一級(jí)緩存。一級(jí)緩存在操作數(shù)據(jù)庫(kù)時(shí)需要構(gòu)造sqlSession對(duì)象,在對(duì)象中有一個(gè)數(shù)據(jù)結(jié)構(gòu)用于存儲(chǔ)緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域是互相不影響的。也就是他只能作用在同一個(gè)sqlSession中,不同的sqlSession中的緩存是互相不能讀取的。
二級(jí)緩存是mapper級(jí)別的緩存:
MyBatis的二級(jí)緩存是mapper級(jí)別的緩存,它可以提高對(duì)數(shù)據(jù)庫(kù)查詢(xún)的效率,以提高應(yīng)用的性能。多個(gè)SqlSession去操作同一個(gè)Mapper的sql語(yǔ)句,多個(gè)SqlSession可以共用二級(jí)緩存,二級(jí)緩存是跨SqlSession的。
開(kāi)啟二級(jí)緩存:
A.mybatis.xml配置文件中加入:
<span style="font-size:18px;"><settings>
<!--開(kāi)啟二級(jí)緩存-->
<setting name="cacheEnabled" value="true"/>
</settings> </span>
B.在需要開(kāi)啟二級(jí)緩存的mapper.xml中加入caceh標(biāo)簽
<span style="font-size:18px;"><cache/></span>
C.讓使用二級(jí)緩存的POJO類(lèi)實(shí)現(xiàn)Serializable接口
<span style="font-size:18px;">public class User implements Serializable {}</span>
4、使用 MyBatis 的 mapper 接口調(diào)用時(shí)有哪些要求?
A. Mapper 接口方法名和 mapper.xml 中定義的每個(gè) sql 的 id 相同
B. Mapper 接口方法的輸入?yún)?shù)類(lèi)型和 mapper.xml 中定義的每個(gè) sql 的 parameterType 的類(lèi)型相同
C. Mapper 接口方法的輸出參數(shù)類(lèi)型和 mapper.xml 中定義的每個(gè) sql 的 resultType 的類(lèi)型相同
D. Mapper.xml 文件中的 namespace 即是 mapper 接口的類(lèi)路徑
(平常用會(huì)用,但是面試時(shí),會(huì)想不起來(lái),這個(gè)常考)
5、簡(jiǎn)述一下Mybatis 的編程步驟
A.創(chuàng)建 SqlSessionFactory
B.通過(guò) SqlSessionFactory 創(chuàng)建 SqlSession
C.通過(guò) sqlsession 執(zhí)行數(shù)據(jù)庫(kù)操作
D.調(diào)用 session.commit()提交事務(wù)
E.調(diào)用 session.close()關(guān)閉會(huì)話(huà)
6、MyBatis中接口綁定有幾種實(shí)現(xiàn)方式,是怎么實(shí)現(xiàn)的?
A.通過(guò)注解綁定,在接口的方法上面加上 @Select@Update等注解里面包含Sql語(yǔ)句來(lái)綁定(Sql語(yǔ)句比較簡(jiǎn)單的時(shí)候,推薦注解綁定)
B.通過(guò)xml里面寫(xiě)SQL來(lái)綁定, 指定xml映射文件里面的namespace必須為接口的全路徑名(SQL語(yǔ)句比較復(fù)雜的時(shí)候,推薦xml綁定)
以上就是“總結(jié)比較全面的mybatis常見(jiàn)面試題”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)