欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java經(jīng)典面試題匯總:Mybatis

 更新時(shí)間:2021年07月21日 11:16:01   作者:讓程序飛  
本篇總結(jié)的是Mybatis框架相關(guān)的面試題,后續(xù)會(huì)持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實(shí)習(xí)生或者已經(jīng)工作的同行,如果發(fā)現(xiàn)錯(cuò)誤還望大家多多包涵,不吝賜教,謝謝

1. MyBatis 中 #{}和 ${}的區(qū)別是什么?

#{}是預(yù)編譯處理,${}是字符替換。 在使用 #{}時(shí),MyBatis 會(huì)將 SQL 中的 #{}替換成“?”, 配合 PreparedStatement 的 set 方法賦值,這樣可以有效的防止 SQL 注入,保證程序的運(yùn)行安全。

2. MyBatis 有幾種分頁(yè)方式?

邏輯分頁(yè): 使用 MyBatis 自帶的 RowBounds 進(jìn)行分頁(yè),它是一次性查詢(xún)很多數(shù)據(jù),然后在數(shù)據(jù)中再進(jìn)行檢索。

物理分頁(yè): 自己手寫(xiě) SQL 分頁(yè)或使用分頁(yè)插件 PageHelper,去數(shù)據(jù)庫(kù)查詢(xún)指定條數(shù)的分頁(yè)數(shù)據(jù)的形式。

3. MyBatis 邏輯分頁(yè)和物理分頁(yè)的區(qū)別是什么?

邏輯分頁(yè)是一次性查詢(xún)很多數(shù)據(jù),然后再在結(jié)果中檢索分頁(yè)的數(shù)據(jù)。這樣做弊端是需要消耗大量的內(nèi)存、有內(nèi)存溢出的風(fēng)險(xiǎn)、對(duì)數(shù)據(jù)庫(kù)壓力較大。

物理分頁(yè)是從數(shù)據(jù)庫(kù)查詢(xún)指定條數(shù)的數(shù)據(jù),彌補(bǔ)了一次性全部查出的所有數(shù)據(jù)的種種缺點(diǎn),比如需要大量的內(nèi)存,對(duì)數(shù)據(jù)庫(kù)查詢(xún)壓力較大等問(wèn)題。

4. MyBatis 是否支持延遲加載?延遲加載的原理是什么?

MyBatis 支持延遲加載,設(shè)置 lazyLoadingEnabled=true 即可。 延遲加載的原理的是調(diào)用的時(shí)候觸發(fā)加載,而不是在初始化的時(shí)候就加載信息。 比如調(diào)用 a. getB(). getName(),這個(gè)時(shí)候發(fā)現(xiàn) a. getB() 的值為 null,此時(shí)會(huì)單獨(dú)觸發(fā)事先保存好的關(guān)聯(lián) B 對(duì)象的 SQL, 先查詢(xún)出來(lái) B,然后再調(diào)用 a. setB(b),而這時(shí)候再調(diào)用 a. getB(). getName() 就有值了,這就是延遲加載的基本原理

5. 說(shuō)一下 MyBatis 的一級(jí)緩存和二級(jí)緩存?

一級(jí)緩存:基于 PerpetualCache 的 HashMap 本地緩存,它的聲明周期是和 SQLSession 一致的,有多個(gè) SQLSession 或者分布式的環(huán)境中數(shù)據(jù)庫(kù)操作,可能會(huì)出現(xiàn)臟數(shù)據(jù)。當(dāng) Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認(rèn)一級(jí)緩存是開(kāi)啟的。

二級(jí)緩存:也是基于 PerpetualCache 的 HashMap 本地緩存,不同在于其存儲(chǔ)作用域?yàn)?Mapper 級(jí)別的,如果多個(gè)SQLSession之間需要共享緩存,則需要使用到二級(jí)緩存,并且二級(jí)緩存可自定義存儲(chǔ)源,如 Ehcache。默認(rèn)不打開(kāi)二級(jí)緩存,要開(kāi)啟二級(jí)緩存,使用二級(jí)緩存屬性類(lèi)需要實(shí)現(xiàn) Serializable 序列化接口(可用來(lái)保存對(duì)象的狀態(tài))。 開(kāi)啟二級(jí)緩存數(shù)據(jù)查詢(xún)流程:二級(jí)緩存 -> 一級(jí)緩存 -> 數(shù)據(jù)庫(kù)。 緩存更新機(jī)制:當(dāng)某一個(gè)作用域(一級(jí)緩存 Session/二級(jí)緩存 Mapper)進(jìn)行了C/U/D 操作后,默認(rèn)該作用域下所有 select 中的緩存將被 clear。

6. MyBatis 有哪些執(zhí)行器(Executor)?

MyBatis 有三種基本的Executor執(zhí)行器:

  • SimpleExecutor:每執(zhí)行一次 update 或 select 就開(kāi)啟一個(gè) Statement 對(duì)象,用完立刻關(guān)閉 Statement 對(duì)象;
  • ReuseExecutor:執(zhí)行 update 或 select,以 SQL 作為 key 查找 Statement 對(duì)象,存在就使用,不存在就創(chuàng)建,用完后不關(guān)閉 Statement 對(duì)象,而是放置于 Map 內(nèi)供下一次使用。簡(jiǎn)言之,就是重復(fù)使用 Statement 對(duì)象;
  • BatchExecutor:執(zhí)行 update(沒(méi)有 select,jdbc 批處理不支持 select),將所有 SQL 都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個(gè) Statement 對(duì)象,每個(gè) Statement 對(duì)象都是 addBatch()完畢后,等待逐一執(zhí)行 executeBatch()批處理,與 jdbc 批處理相同

7. MyBatis 分頁(yè)插件的實(shí)現(xiàn)原理是什么?

分頁(yè)插件的基本原理是使用 MyBatis 提供的插件接口,實(shí)現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的 SQL,然后重寫(xiě) SQL,根據(jù) dialect 方言,添加對(duì)應(yīng)的物理分頁(yè)語(yǔ)句和物理分頁(yè)參數(shù)。

8. MyBatis如何返回主鍵?

核心在于 useGeneratedKeys和keyProperty屬性

<mapper namespace="org.chench.test.mybatis.mapper">
    <!-- 插入數(shù)據(jù):返回記錄主鍵id值 -->
    <insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" >
        insert into test(name,descr,url,create_time,update_time) 
        values(#{name},#{descr},#{url},now(),now())
    </insert>
</mapper>

9. Xml映射文件中,除了常見(jiàn)的select|insert|update|delete標(biāo)簽之外,還有哪些標(biāo)簽?

還有很多其他的標(biāo)簽例如 sql|cach等...,加上動(dòng)態(tài)sql的9個(gè)標(biāo)簽,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標(biāo)簽,通過(guò)標(biāo)簽引入sql片段,為不支持自增的主鍵生成策略標(biāo)簽。

10. MyBatis 和 Hibernate 的區(qū)別有哪些?

  • 靈活性:MyBatis 更加靈活,自己可以寫(xiě) SQL 語(yǔ)句,使用起來(lái)比較方便。
  • 可移植性:MyBatis 有很多自己寫(xiě)的 SQL,因?yàn)槊總€(gè)數(shù)據(jù)庫(kù)的 SQL 可以不相同,所以可移植性比較差。
  • 學(xué)習(xí)和使用門(mén)檻:MyBatis 入門(mén)比較簡(jiǎn)單,使用門(mén)檻也更低。
  • 二級(jí)緩存:hibernate 擁有更好的二級(jí)緩存,它的二級(jí)緩存可以自行更換為第三方的二級(jí)緩存。

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望你能給多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包

    IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包

    這篇文章主要介紹了IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java計(jì)算兩點(diǎn)間的距離方法總結(jié)

    java計(jì)算兩點(diǎn)間的距離方法總結(jié)

    小編給大家總結(jié)了在java中計(jì)算兩點(diǎn)之家距離的方法以及相關(guān)實(shí)例代碼分享,有需要的讀者參考下。
    2018-02-02
  • java中的自增問(wèn)題介紹

    java中的自增問(wèn)題介紹

    下面小編就為大家?guī)?lái)一篇java中的自增問(wèn)題介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家。給大家一個(gè)參考。
    2016-03-03
  • GC算法實(shí)現(xiàn)垃圾優(yōu)先算法

    GC算法實(shí)現(xiàn)垃圾優(yōu)先算法

    為什么會(huì)存在那么多的垃圾回收算法呢?我想這個(gè)問(wèn)題的答案可能是沒(méi)有任何一種內(nèi)存回收算法是完美的,所以在針對(duì)不同的情景需求下,不同的內(nèi)存回收算法有其獨(dú)特的優(yōu)勢(shì),所以最后就延續(xù)了多種回收算法
    2022-01-01
  • Java中的幾種讀取properties配置文件的方式

    Java中的幾種讀取properties配置文件的方式

    這篇文章主要介紹了Java中的幾種讀取properties配置文件的方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 深入理解Java編程中異常處理的優(yōu)劣

    深入理解Java編程中異常處理的優(yōu)劣

    本篇文章是對(duì)Java編程中異常處理的優(yōu)劣進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理)

    關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理)

    這篇文章主要介紹了關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-03-03
  • 淺談java7增強(qiáng)的try語(yǔ)句關(guān)閉資源

    淺談java7增強(qiáng)的try語(yǔ)句關(guān)閉資源

    下面小編就為大家?guī)?lái)一篇淺談java7增強(qiáng)的try語(yǔ)句關(guān)閉資源。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java中操作Redis的詳細(xì)方法

    Java中操作Redis的詳細(xì)方法

    基于Jedis實(shí)現(xiàn)對(duì)redis中字符串的操作,文中通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),包括連接池JedisPool應(yīng)用的實(shí)例代碼,對(duì)Java操作Redis的相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • Eolink上傳文件到Java后臺(tái)進(jìn)行處理的示例代碼

    Eolink上傳文件到Java后臺(tái)進(jìn)行處理的示例代碼

    這篇文章主要介紹了Eolink上傳文件到Java后臺(tái)進(jìn)行處理,這里是上傳的excel表格數(shù)據(jù)并轉(zhuǎn)換為java集合對(duì)象、然后進(jìn)行業(yè)務(wù)邏輯處理判斷最后保存到數(shù)據(jù)庫(kù)?,需要的朋友可以參考下
    2022-12-12

最新評(píng)論