Java面試題(Mybatis)

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

'#{}'是預(yù)編譯處理宣决,KaTeX parse error: Expected 'EOF', got '#' at position 21: …串替換雕憔; Mybatis在處理#?{}時缤骨,會將sql中的#{}替…{}時族操,就是把${}替換成變量的值停忿;
使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性可婶。

126.mybatis 有幾種分頁方式沿癞?

  • 數(shù)組分頁
  • sql分頁
  • 攔截器分頁
  • RowBounds分頁

127.RowBounds 是一次性查詢?nèi)拷Y(jié)果嗎?為什么矛渴?

128.mybatis 邏輯分頁和物理分頁的區(qū)別是什么椎扬?

物理分頁速度上并不一定快于邏輯分頁惫搏,邏輯分頁速度上也并不一定快于物理分頁。
物理分頁總是優(yōu)于邏輯分頁:沒有必要將屬于數(shù)據(jù)庫端的壓力加諸到應(yīng)用端來蚕涤,就算速度上存在優(yōu)勢,然而其它性能上的優(yōu)點足以彌補這個缺點筐赔。

129.mybatis 是否支持延遲加載?延遲加載的原理是什么揖铜?

Mybatis僅支持association關(guān)聯(lián)對象和collection關(guān)聯(lián)集合對象的延遲加載茴丰,association指的就是一對一,collection指的就是一對多查詢天吓。在Mybatis配置文件中贿肩,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。

它的原理是龄寞,使用CGLIB創(chuàng)建目標(biāo)對象的代理對象汰规,當(dāng)調(diào)用目標(biāo)方法時,進(jìn)入攔截器方法物邑,比如調(diào)用a.getB().getName()溜哮,攔截器invoke()方法發(fā)現(xiàn)a.getB()是null值,那么就會單獨發(fā)送事先保存好的查詢關(guān)聯(lián)B對象的sql色解,把B查詢上來茂嗓,然后調(diào)用a.setB(b),于是a的對象b屬性就有值了冒签,接著完成a.getB().getName()方法的調(diào)用在抛。這就是延遲加載的基本原理。

當(dāng)然了萧恕,不光是Mybatis刚梭,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的票唆。

130.說一下 mybatis 的一級緩存和二級緩存朴读?

一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session走趋,當(dāng) Session flush 或 close 之后衅金,該 Session 中的所有 Cache 就將清空,默認(rèn)打開一級緩存簿煌。

二級緩存與一級緩存其機(jī)制相同氮唯,默認(rèn)也是采用 PerpetualCache,HashMap 存儲姨伟,不同在于其存儲作用域為 Mapper(Namespace)惩琉,并且可自定義存儲源,如 Ehcache夺荒。默認(rèn)不打開二級緩存瞒渠,要開啟二級緩存良蒸,使用二級緩存屬性類需要實現(xiàn)Serializable序列化接口(可用來保存對象的狀態(tài)),可在它的映射文件中配置 ;

對于緩存數(shù)據(jù)更新機(jī)制伍玖,當(dāng)某一個作用域(一級緩存 Session/二級緩存Namespaces)的進(jìn)行了C/U/D 操作后嫩痰,默認(rèn)該作用域下所有 select 中的緩存將被 clear。

131.mybatis 和 hibernate 的區(qū)別有哪些窍箍?

(1)Mybatis和hibernate不同串纺,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句仔燕。

(2)Mybatis直接編寫原生態(tài)sql造垛,可以嚴(yán)格控制sql執(zhí)行性能魔招,靈活度高晰搀,非常適合對關(guān)系數(shù)據(jù)模型要求不高的軟件開發(fā),因為這類軟件需求變化頻繁办斑,一但需求變化要求迅速輸出成果外恕。但是靈活的前提是mybatis無法做到數(shù)據(jù)庫無關(guān)性,如果需要實現(xiàn)支持多種數(shù)據(jù)庫的軟件乡翅,則需要自定義多套sql映射文件鳞疲,工作量大。

(3)Hibernate對象/關(guān)系映射能力強(qiáng)蠕蚜,數(shù)據(jù)庫無關(guān)性好尚洽,對于關(guān)系模型要求高的軟件,如果用hibernate開發(fā)可以節(jié)省很多代碼靶累,提高效率腺毫。

132.mybatis 有哪些執(zhí)行器(Executor)?

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

SimpleExecutor:每執(zhí)行一次update或select挣柬,就開啟一個Statement對象潮酒,用完立刻關(guān)閉Statement對象。
ReuseExecutor:執(zhí)行update或select邪蛔,以sql作為key查找Statement對象急黎,存在就使用,不存在就創(chuàng)建侧到,用完后勃教,不關(guān)閉Statement對象,而是放置于Map內(nèi)匠抗,供下一次使用故源。簡言之,就是重復(fù)使用Statement對象戈咳。
BatchExecutor:執(zhí)行update(沒有select心软,JDBC批處理不支持select)壕吹,將所有sql都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch())删铃,它緩存了多個Statement對象耳贬,每個Statement對象都是addBatch()完畢后,等待逐一執(zhí)行executeBatch()批處理猎唁。與JDBC批處理相同咒劲。

133.mybatis 分頁插件的實現(xiàn)原理是什么?

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

134.mybatis 如何編寫一個自定義插件豁生?

Mybatis自定義插件針對Mybatis四大對象(Executor兔毒、StatementHandler 、ParameterHandler 甸箱、ResultSetHandler )進(jìn)行攔截育叁,具體攔截方式為:
Executor:攔截執(zhí)行器的方法(log記錄)
StatementHandler :攔截Sql語法構(gòu)建的處理
ParameterHandler :攔截參數(shù)的處理
ResultSetHandler :攔截結(jié)果集的處理

Mybatis自定義插件必須實現(xiàn)Interceptor接口:

public interface Interceptor {
    Object intercept(Invocation invocation) throws Throwable;
    Object plugin(Object target);
    void setProperties(Properties properties);
}

intercept方法:攔截器具體處理邏輯方法
plugin方法:根據(jù)簽名signatureMap生成動態(tài)代理對象
setProperties方法:設(shè)置Properties屬性
自定義插件demo:

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
  Object target = invocation.getTarget(); //被代理對象
  Method method = invocation.getMethod(); //代理方法
  Object[] args = invocation.getArgs(); //方法參數(shù)
  // do something ...... 方法攔截前執(zhí)行代碼塊
  Object result = invocation.proceed();
  // do something .......方法攔截后執(zhí)行代碼塊
  return result;
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}

一個@Intercepts可以配置多個@Signature,@Signature中的參數(shù)定義如下:
type:表示攔截的類芍殖,這里是Executor的實現(xiàn)類豪嗽;
method:表示攔截的方法,這里是攔截Executor的update方法豌骏;
args:表示方法參數(shù)龟梦。

目錄:2020最新Java面試題及答案匯總(上)
目錄:2020最新Java面試題及答案匯總(下)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肯适,隨后出現(xiàn)的幾起案子变秦,更是在濱河造成了極大的恐慌,老刑警劉巖框舔,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦玫,死亡現(xiàn)場離奇詭異,居然都是意外死亡刘绣,警方通過查閱死者的電腦和手機(jī)樱溉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纬凤,“玉大人福贞,你說我怎么就攤上這事⊥J浚” “怎么了挖帘?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵完丽,是天一觀的道長。 經(jīng)常有香客問我拇舀,道長逻族,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任骄崩,我火速辦了婚禮聘鳞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘要拂。我一直安慰自己抠璃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布脱惰。 她就那樣靜靜地躺著搏嗡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枪芒。 梳的紋絲不亂的頭發(fā)上彻况,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天谁尸,我揣著相機(jī)與錄音舅踪,去河邊找鬼。 笑死良蛮,一個胖子當(dāng)著我的面吹牛抽碌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播决瞳,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼货徙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皮胡?” 一聲冷哼從身側(cè)響起痴颊,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屡贺,沒想到半個月后蠢棱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡甩栈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年泻仙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片量没。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玉转,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殴蹄,到底是詐尸還是另有隱情究抓,我是刑警寧澤猾担,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站刺下,受9級特大地震影響垒探,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怠李,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一圾叼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捺癞,春花似錦夷蚊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唐础,卻和暖如春箱歧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背一膨。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工呀邢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豹绪。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓价淌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞒津。 傳聞我的和親對象是個殘疾皇子蝉衣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355