自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

親,收下這款Mybatis面試手冊(cè)吧

開(kāi)發(fā) 架構(gòu)
咱們先來(lái)熟悉一下Mybatis的概念,你可能心里會(huì)有點(diǎn)反感,哎啊我天天用這個(gè)框架,你別給我扯犢子了,直接開(kāi)門見(jiàn)山吧,這里我就啰嗦幾句,而且這幾句也是面試愛(ài)問(wèn)的一個(gè)點(diǎn)

[[440020]]

前言

其實(shí)本篇文章是不太適合小白看的,畢竟如果你不太懂Mybatis的話,直接來(lái)看這些面試題是不合適的,所以可能看著比較吃力,但是呢,即使你是小白也無(wú)妨,我也會(huì)盡量的讓你讀懂,如果暫時(shí)讀不懂呢,不知道說(shuō)的某個(gè)問(wèn)題的重點(diǎn)是哪里呢。也沒(méi)關(guān)系,收藏+關(guān)注,再也不迷路!

老規(guī)矩,咱們先來(lái)熟悉一下Mybatis的概念,你可能心里會(huì)有點(diǎn)反感,哎啊我天天用這個(gè)框架,你別給我扯犢子了,直接開(kāi)門見(jiàn)山吧,這里我就啰嗦幾句,而且這幾句也是面試愛(ài)問(wèn)的一個(gè)點(diǎn)

Mybatis是什么?

1、優(yōu)秀的持久層框架,對(duì)JDBC的操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,使開(kāi)發(fā)者只需要在關(guān)注SQL本身,不需要花精力去處理各種JDBC的東西(我想大家在初期學(xué)習(xí)的時(shí)候都被JDBC的各種步驟而懵過(guò))

2、基于SQL,很靈活,SQL寫(xiě)在XML文件中,還提供了多種XML標(biāo)簽,支持動(dòng)態(tài)的編寫(xiě)SQL

3、和各種數(shù)據(jù)庫(kù)兼容,和Spring兼容

4、缺點(diǎn):大概就是需要對(duì)SQL有一定的基礎(chǔ),并且數(shù)據(jù)庫(kù)之間的移植性較差

Mybatis的架構(gòu)?

框架介紹

1、 mybatis配置:SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運(yùn)行環(huán)境等信息。mapper.xml文件即sql映射文件,文件中配置了操作數(shù)據(jù)庫(kù)的sql語(yǔ)句。此文件需要在SqlMapConfig.xml中加載。

2、 通過(guò)mybatis環(huán)境等配置信息構(gòu)造SqlSessionFactory即會(huì)話工廠

3、 由會(huì)話工廠創(chuàng)建sqlSession即會(huì)話,操作數(shù)據(jù)庫(kù)需要通過(guò)sqlSession進(jìn)行。

4、 mybatis底層自定義了Executor執(zhí)行器接口操作數(shù)據(jù)庫(kù),Executor接口有兩個(gè)實(shí)現(xiàn),一個(gè)是基本執(zhí)行器、一個(gè)是緩存執(zhí)行器。

5、 Mapped Statement也是mybatis一個(gè)底層封裝對(duì)象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個(gè)sql對(duì)應(yīng)一個(gè)Mapped Statement對(duì)象,sql的id即是Mapped statement的id。

6、 Mapped Statement對(duì)sql執(zhí)行輸入?yún)?shù)進(jìn)行定義,包括HashMap、基本類型、pojo,Executor通過(guò)Mapped Statement在執(zhí)行sql前將輸入的java對(duì)象映射至sql中,輸入?yún)?shù)映射就是jdbc編程中對(duì)preparedStatement設(shè)置參數(shù)。

7、 Mapped Statement對(duì)sql執(zhí)行輸出結(jié)果進(jìn)行定義,包括HashMap、基本類型、pojo,Executor通過(guò)Mapped Statement在執(zhí)行sql后將輸出結(jié)果映射至java對(duì)象中,輸出結(jié)果映射過(guò)程相當(dāng)于jdbc編程中對(duì)結(jié)果的解析處理過(guò)程。

OK啦,稍微讀完上面那些,即使是小白也大致知道個(gè)意思了,就是一個(gè)幫助開(kāi)發(fā)者去操作數(shù)據(jù)庫(kù)的框架,走,話不多少,我們來(lái)一波面試風(fēng)暴

風(fēng)暴來(lái)臨

一個(gè)腦袋锃亮的中年男人拿著一個(gè)帶著些許劃痕的Mac走到了我的面前,張口就問(wèn),吃飯了嗎

我面帶微笑回答吃了(這可真是中國(guó)人的傳統(tǒng)客氣話哈

锃亮的面試官說(shuō),我們開(kāi)門見(jiàn)山吧,也不廢話了

你準(zhǔn)備好了嗎?

說(shuō)一下XML中的標(biāo)簽

在XML文件中有9個(gè)頂級(jí)標(biāo)簽,下面簡(jiǎn)單的介紹下各個(gè)標(biāo)簽的作用,至于標(biāo)簽的具體使用和其中的參數(shù)的含義,我會(huì)另起一篇文章來(lái)解釋

  1. cache:對(duì)給定命名空間的緩存配置。 
  2.  
  3. cache-ref:對(duì)其他命名空間緩存配置的引用。 
  4.  
  5. delete:映射相應(yīng)的刪除語(yǔ)句。 
  6.  
  7. insert:映射相應(yīng)的插入語(yǔ)句。 
  8.  
  9. select:映射相應(yīng)的查詢語(yǔ)句。 
  10.  
  11. update:映射相應(yīng)的更新語(yǔ)句。 
  12.  
  13. sql:可被其他語(yǔ)句引用的可重用語(yǔ)句塊。 

parameterMap:已被廢棄!老式風(fēng)格的參數(shù)映射。更好的辦法是使用內(nèi)聯(lián)參數(shù),此元素可能在將來(lái)被移除。

resultMap:是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象。

Mybatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對(duì)象并返回的?都有哪些映射形式?

第一種是使用標(biāo)簽,逐一定義列名和對(duì)象屬性名之間的映射關(guān)系。

第二種是使用sql列的別名功能,將列別名書(shū)寫(xiě)為對(duì)象屬性名,比如USER_NAME AS NAME,Mybatis會(huì)忽略列名的大小寫(xiě),直接找到和值對(duì)應(yīng)的對(duì)象屬性名

有了列名與屬性名的映射關(guān)系后,Mybatis通過(guò)反射創(chuàng)建對(duì)象,同時(shí)使用反射給對(duì)象的屬性逐一賦值并返回,那些找不到映射關(guān)系的屬性,是無(wú)法完成賦值的。

Mybatis中的動(dòng)態(tài)SQL,說(shuō)下怎么用吧

不用說(shuō)了,直接上各個(gè)標(biāo)簽吧給各位看官

關(guān)于具體用法,我會(huì)另起一篇文章給大家詳細(xì)說(shuō)說(shuō),舉舉例子,放在一個(gè)里面太多了,放不下,大家的閱讀耐心也是有限的

  1. foreach:用來(lái)循環(huán)容器的標(biāo)簽。 
  2. concat:模糊查詢。 
  3. choose (when, otherwise)標(biāo)簽:choose標(biāo)簽是按順序判斷其內(nèi)部when標(biāo)簽中的test條件出否成立,如果有一個(gè)成立,則 choose 結(jié)束。當(dāng) choose 中所有 when 的條件都不滿則時(shí),則執(zhí)行 otherwise 中的sql。類似于Java 的 switch 語(yǔ)句,choose 為 switch,when 為 case,otherwise 則為 default。 
  4. if:判斷結(jié)論是否成立。 
  5. where:SQL語(yǔ)句的where條件。 
  6. set:使用set標(biāo)簽可以將動(dòng)態(tài)的配置SET關(guān)鍵字,和剔除追加到條件末尾的任何不相關(guān)的逗號(hào)。 
  7. trim:trim是更靈活的去處多余關(guān)鍵字的標(biāo)簽,他可以實(shí)踐whereset的效果。 

Mybatis分頁(yè)實(shí)現(xiàn)

mybatis框架分頁(yè)實(shí)現(xiàn),有幾種方式,最簡(jiǎn)單的就是利用原生的sql關(guān)鍵字limit來(lái)實(shí)現(xiàn),還有一種就是利用interceptor來(lái)拼接sql,實(shí)現(xiàn)和limit一樣的功能,再一個(gè)就是利用PageHelper來(lái)實(shí)現(xiàn)

第一種limit關(guān)鍵字不用多說(shuō)了吧,第二種攔截器其實(shí)就是攔截相應(yīng)的會(huì)話進(jìn)行攔截,實(shí)現(xiàn)動(dòng)態(tài)添加limit,而第三種就是內(nèi)部幫助我們實(shí)現(xiàn)了攔截器的功能,不用自己來(lái)實(shí)現(xiàn)了,可以認(rèn)為底層都是通過(guò)limit關(guān)鍵字來(lái)獲取分頁(yè)數(shù)據(jù)的

#{}和${}的區(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ǔ)句。

使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性(語(yǔ)句的拼接),如果使用在order by 中就需要使用 ${}。

最大區(qū)別在于:#{} 傳入值時(shí),sql解析參數(shù)是帶引號(hào)的,而${}傳入值時(shí),sql解析參數(shù)是不帶引號(hào)的。

通常一個(gè)Xml映射文件,都會(huì)寫(xiě)一個(gè)Dao接口與之對(duì)應(yīng),這個(gè)Dao接口的工作原理是什么?Dao接口里的方法,參數(shù)不同時(shí),方法能重載嗎?

Dao接口,就是人們常說(shuō)的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法內(nèi)的參數(shù),就是傳遞給sql的參數(shù)。

Mapper接口是沒(méi)有實(shí)現(xiàn)類的,當(dāng)調(diào)用接口方法時(shí),接口全限名+方法名拼接字符串作為key值,可唯一定位MappedStatement,Dao接口里的方法,是不能重載的,因?yàn)槭侨廾?方法名的保存和尋找策略。

Dao接口的工作原理是JDK動(dòng)態(tài)代理,Mybatis運(yùn)行時(shí)會(huì)使用JDK動(dòng)態(tài)代理為Dao接口生成代理proxy對(duì)象,代理對(duì)象proxy會(huì)攔截接口方法,轉(zhuǎn)而執(zhí)行MappedStatement所代表的sql,然后將sql執(zhí)行結(jié)果返回。

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復(fù)?

不同的Xml映射文件,如果配置了namespace,那么id可以重復(fù);如果沒(méi)有配置namespace,那么id不能重復(fù);畢竟namespace不是必須的,只是最佳實(shí)踐而已。

原因就是namespace+id是作為Map

Mybatis是否可以映射Enum枚舉類?

Mybatis可以映射枚舉類,不單可以映射枚舉類,Mybatis可以映射任何對(duì)象到表的一列上。映射方式為自定義一個(gè)TypeHandler,實(shí)現(xiàn)TypeHandler的setParameter()和getResult()接口方法。

TypeHandler有兩個(gè)作用,一是完成從javaType至jdbcType的轉(zhuǎn)換,二是完成jdbcType至javaType的轉(zhuǎn)換,體現(xiàn)為setParameter()和getResult()兩個(gè)方法,分別代表設(shè)置sql問(wèn)號(hào)占位符參數(shù)和獲取列查詢結(jié)果。

Mybatis映射文件中,如果A標(biāo)簽通過(guò)include引用了B標(biāo)簽的內(nèi)容,請(qǐng)問(wèn),B標(biāo)簽?zāi)芊穸x在A標(biāo)簽的后面,還是說(shuō)必須定義在A標(biāo)簽的前面?

雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標(biāo)簽依然可以定義在任何地方,Mybatis都可以正確識(shí)別。

原理是,Mybatis解析A標(biāo)簽,發(fā)現(xiàn)A標(biāo)簽引用了B標(biāo)簽,但是B標(biāo)簽尚未解析到,尚不存在,此時(shí),Mybatis會(huì)將A標(biāo)簽標(biāo)記為未解析狀態(tài),然后繼續(xù)解析余下的標(biāo)簽,包含B標(biāo)簽,待所有標(biāo)簽解析完畢,Mybatis會(huì)重新解析那些被標(biāo)記為未解析的標(biāo)簽,此時(shí)再解析A標(biāo)簽時(shí),B標(biāo)簽已經(jīng)存在,A標(biāo)簽也就可以正常解析完成了。

為什么說(shuō)Mybatis是半自動(dòng)ORM映射工具?它與全自動(dòng)的區(qū)別在哪里?

Hibernate屬于全自動(dòng)ORM映射工具,使用Hibernate查詢關(guān)聯(lián)對(duì)象或者關(guān)聯(lián)集合對(duì)象時(shí),可以根據(jù)對(duì)象關(guān)系模型直接獲取,所以它是全自動(dòng)的。

而Mybatis在查詢關(guān)聯(lián)對(duì)象或關(guān)聯(lián)集合對(duì)象時(shí),需要手動(dòng)編寫(xiě)sql來(lái)完成,所以,稱之為半自動(dòng)ORM映射工具

Mybatis是否支持延遲加載?如果支持,它的實(shí)現(xiàn)原理是什么?

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

原理:使用CGLIB創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,當(dāng)調(diào)用目標(biāo)方法時(shí),進(jìn)入攔截器方法,比如調(diào)用A.getB().getName(),攔截器invoke()方法發(fā)現(xiàn)A.getB()是null值,那么就會(huì)單獨(dú)發(fā)送事先保存好的查詢關(guān)聯(lián)B對(duì)象的sql,把B查詢上來(lái),然后調(diào)用A.setB(b),于是a的對(duì)象b屬性就有值了,接著完成A.getB().getName()方法的調(diào)用。這就是延遲加載的基本原理。

Mybatis都有哪些Executor執(zhí)行器?它們之間的區(qū)別是什么?

Mybatis有三種基本的Executor執(zhí)行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

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

BatchExecutor:執(zhí)行update(沒(méi)有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個(gè)Statement對(duì)象,每個(gè)Statement對(duì)象都是addBatch()完畢后,等待逐一執(zhí)行executeBatch()批處理。與JDBC批處理相同。

在Mybatis配置文件中,可以指定默認(rèn)的ExecutorType執(zhí)行器類型,也可以手動(dòng)給DefaultSqlSessionFactory的創(chuàng)建SqlSession的方法傳遞ExecutorType類型參數(shù)。

作用范圍:Executor的這些特點(diǎn),都嚴(yán)格限制在SqlSession生命周期范圍內(nèi)。

說(shuō)一下Mybatis的一級(jí)、二級(jí)緩存的理解

一級(jí)緩存:一個(gè)sqlsession級(jí)別的,意思就是sqlsession只能訪問(wèn)自己的一級(jí)緩存的數(shù)據(jù),默認(rèn)Map結(jié)構(gòu)存儲(chǔ)。

一級(jí)緩存查詢存在于每一個(gè)的sqlsession類的實(shí)例對(duì)象中,當(dāng)?shù)谝淮尾樵兡骋粋€(gè)數(shù)據(jù)時(shí)候,sqlsession類的實(shí)例對(duì)象會(huì)將該數(shù)據(jù)存入到一級(jí)緩存,其存儲(chǔ)作用域?yàn)? Session,當(dāng) Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認(rèn)打開(kāi)一級(jí)緩存。

首先用戶第一次查詢sql時(shí)候,sql的查詢結(jié)果就會(huì)被寫(xiě)入sqlsession一級(jí)緩存中的,這樣用戶第二次查詢時(shí),直接從一級(jí)緩存取出數(shù)據(jù),而不是數(shù)據(jù)庫(kù)。如果用戶出現(xiàn)commit操作時(shí),比如增刪改查,這時(shí)sqlsession中一級(jí)緩存區(qū)域就會(huì)全部清空。清空之后再次去一級(jí)緩存查找不到,就會(huì)走數(shù)據(jù)庫(kù)進(jìn)行查找,然后再次存到緩存中。注意:緩存使用的數(shù)據(jù)結(jié)構(gòu)也是map的。

二級(jí)緩存:二級(jí)緩存的范圍就是mapper級(jí)別,也就是mapper以命名空間為單位創(chuàng)建緩存數(shù)據(jù)結(jié)構(gòu),默認(rèn)Map結(jié)構(gòu)。

二級(jí)緩存和 一級(jí)緩存一樣的是,二級(jí)緩存的多個(gè)sqlsession去操作同一個(gè)mapper映射的sql語(yǔ)句,然后多個(gè)sqlsession可以共用二級(jí)緩存這樣的一個(gè)思想,它是跨sqlsession的;可以自定義存儲(chǔ)源,如Ehcache,默認(rèn)不打開(kāi)二級(jí)緩存,要開(kāi)啟二級(jí)緩存,使用二級(jí)緩存屬性類需要實(shí)現(xiàn)Serializable序列化接口(可用來(lái)保存對(duì)象的狀態(tài)),可在它的映射文件中配置

總結(jié)下:mybatis的的一級(jí)緩存是SqlSession級(jí)別的緩存,一級(jí)緩存緩存的是對(duì)象,當(dāng)SqlSession提交、關(guān)閉以及其他的更新數(shù)據(jù)庫(kù)的操作發(fā)生后,一級(jí)緩存就會(huì)清空。二級(jí)緩存是SqlSessionFactory級(jí)別的緩存,同一個(gè)SqlSessionFactory產(chǎn)生的SqlSession都共享一個(gè)二級(jí)緩存,二級(jí)緩存中存儲(chǔ)的是數(shù)據(jù),當(dāng)命中二級(jí)緩存時(shí),通過(guò)存儲(chǔ)的數(shù)據(jù)構(gòu)造對(duì)象返回。查詢數(shù)據(jù)的時(shí)候,查詢的流程是二級(jí)緩存>一級(jí)緩存>數(shù)據(jù)庫(kù)。

結(jié)束語(yǔ)

到了這里,也說(shuō)了不少問(wèn)題了,這些問(wèn)題應(yīng)該是面試中最常問(wèn)到的關(guān)于Mybatis的問(wèn)題了,也希望作為看官的你能夠?yàn)榇耸斋@到一點(diǎn)一滴的知識(shí)點(diǎn)。

可能你對(duì)于其中的某一個(gè)問(wèn)題不了解,可能你對(duì)于其中的問(wèn)題不熟悉,但是通過(guò)我這篇文章你學(xué)到了一些,這篇文章的目的就已經(jīng)達(dá)到了。

本文轉(zhuǎn)載自微信公眾號(hào)「Java賊船」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java賊船公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Java賊船
相關(guān)推薦

2022-01-06 08:34:32

數(shù)據(jù)庫(kù)Spark查詢

2012-05-16 19:16:10

iPhone 5

2020-12-31 11:21:57

開(kāi)發(fā)技能代碼

2017-09-10 07:07:32

神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)集可視化

2024-03-26 10:30:37

Mybatis擴(kuò)展庫(kù)API

2021-12-09 12:22:28

MyBatis流程面試

2022-03-21 09:05:18

volatileCPUJava

2009-09-01 13:01:58

思科CCSP認(rèn)證思科CCSP認(rèn)證介紹

2009-09-01 12:45:02

思科CCVP認(rèn)證介紹思科CCVP認(rèn)證

2013-12-30 13:34:18

VMwarevSphere 5.5

2021-08-06 13:30:37

JS手寫(xiě)題前端

2023-07-13 08:19:30

HaspMapRedis元素

2020-12-02 06:12:27

TCPIP面試

2022-08-31 15:48:26

插件開(kāi)發(fā)

2024-01-15 06:42:00

高并發(fā)熱點(diǎn)賬戶數(shù)據(jù)庫(kù)

2020-10-26 13:50:24

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)

2021-06-18 12:39:12

數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)設(shè)計(jì)師收集數(shù)據(jù)

2017-09-18 09:35:14

2023-09-12 14:56:13

MyBatis緩存機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)