最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java面試題沖刺第十天--MyBatis2

 更新時(shí)間:2021年07月14日 15:31:03   作者:_陳哈哈  
這篇文章主要為大家分享了最有價(jià)值的三道MyBatis框架面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下

面試題1:說(shuō)說(shuō)你對(duì)Mybatis的理解?

Mybatis是一個(gè)持久層的框架,是apache下的頂級(jí)項(xiàng)目。

在這里插入圖片描述

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ì)象并返回。

MyBatis 支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生信息,將接口和 Java 的 POJO映射成數(shù)據(jù)庫(kù)中的記錄。

追問(wèn)1:說(shuō)一下MyBatis的工作原理和流程吧。

1.讀取 MyBatis 配置文件mybatis-config.xml為 MyBatis 的全局配置文件,配置了 MyBatis 的運(yùn)行環(huán)境等信息,例如數(shù)據(jù)庫(kù)連接信息。

2.加載映射文件:映射文件即 SQL 映射文件,該文件中配置了操作數(shù)據(jù)庫(kù)的 SQL 語(yǔ)句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。

在這里插入圖片描述

3.構(gòu)造會(huì)話工廠:通過(guò) MyBatis 的環(huán)境等配置信息構(gòu)建會(huì)話工廠 SqlSessionFactory

4.創(chuàng)建會(huì)話對(duì)象:由會(huì)話工廠創(chuàng)建 SqlSession 對(duì)象,該對(duì)象中包含了執(zhí)行 SQL 語(yǔ)句的所有方法。

5.Executor 執(zhí)行器:MyBatis 底層定義了一個(gè) Executor 接口來(lái)操作數(shù)據(jù)庫(kù),它將根據(jù) SqlSession 傳遞的參數(shù)動(dòng)態(tài)地生成需要執(zhí)行的 SQL 語(yǔ)句,同時(shí)負(fù)責(zé)查詢(xún)緩存的維護(hù)。

6.MappedStatement 對(duì)象:在 Executor 接口的執(zhí)行方法中有一個(gè) MappedStatement 類(lèi)型的參數(shù),該參數(shù)是對(duì)映射信息的封裝,用于存儲(chǔ)要映射的 SQL 語(yǔ)句的 id、參數(shù)等信息。

7.輸入?yún)?shù)映射:輸入?yún)?shù)類(lèi)型可以是 Map、List 等集合類(lèi)型,也可以是基本數(shù)據(jù)類(lèi)型和 POJO 類(lèi)型。輸入?yún)?shù)映射過(guò)程類(lèi)似于 JDBC 對(duì) preparedStatement 對(duì)象設(shè)置參數(shù)的過(guò)程。

8.輸出結(jié)果映射:輸出結(jié)果類(lèi)型可以是 Map、 List 等集合類(lèi)型,也可以是基本數(shù)據(jù)類(lèi)型和 POJO 類(lèi)型。輸出結(jié)果映射過(guò)程類(lèi)似于 JDBC 對(duì)結(jié)果集的解析過(guò)程。

追問(wèn)2:列舉幾個(gè)MyBatis的核心組件,說(shuō)說(shuō)分別干啥用?

組件名稱(chēng) 功能
SqlSession MyBatis工作的主要頂層API,用于和數(shù)據(jù)庫(kù)交互的會(huì)話,完成必要數(shù)據(jù)庫(kù)增刪改查功能
Executor MyBatis執(zhí)行器,是MyBatis 調(diào)度的核心,負(fù)責(zé)SQL語(yǔ)句的生成和查詢(xún)緩存的維護(hù)
StatementHandler 封裝了JDBC Statement操作,負(fù)責(zé)對(duì)JDBC statement 的操作,如設(shè)置參數(shù)、將Statement結(jié)果集轉(zhuǎn)換成List集合。
ParameterHandler 負(fù)責(zé)對(duì)用戶(hù)傳遞的參數(shù)轉(zhuǎn)換成JDBC Statement 所需要的參數(shù),
ResultSetHandler 負(fù)責(zé)將JDBC返回的ResultSet結(jié)果集對(duì)象轉(zhuǎn)換成List類(lèi)型的集合;
TypeHandler 負(fù)責(zé)java數(shù)據(jù)類(lèi)型和jdbc數(shù)據(jù)類(lèi)型之間的映射和轉(zhuǎn)換
MappedStatement 維護(hù)一條<select|update|delete|insert>節(jié)點(diǎn)的封裝,
SqlSource 負(fù)責(zé)根據(jù)用戶(hù)傳遞的parameterObject,動(dòng)態(tài)生成SQL語(yǔ)句,將信息封裝到BoundSql對(duì)象中,并返回
BoundSql 表示動(dòng)態(tài)生成的SQL語(yǔ)句以及相應(yīng)的參數(shù)信息
Configuration MyBatis所有的配置信息都維持在Configuration對(duì)象之中。

面試題2:(問(wèn)幾個(gè)實(shí)際使用的問(wèn)題)Mybatis動(dòng)態(tài)sql是做什么的?都有哪些動(dòng)態(tài)sql?

動(dòng)態(tài)sql是指在進(jìn)行sql操作的時(shí)候,傳入的參數(shù)對(duì)象或者參數(shù)值,根據(jù)匹配的條件,有可能需要?jiǎng)討B(tài)的去判斷是否為空、循環(huán)、拼接等情況,用于輔助開(kāi)發(fā)者更方便的進(jìn)行半自動(dòng)化的SQL開(kāi)發(fā);

Mybatis動(dòng)態(tài)sql可以讓我們?cè)赬ml映射文件內(nèi),以標(biāo)簽的形式編寫(xiě)動(dòng)態(tài)sql,完成邏輯判斷和動(dòng)態(tài)拼接sql的功能。

Mybatis提供了9種動(dòng)態(tài)sql標(biāo)簽:trimwhere、set、foreach、if、choosewhen、otherwise、bind。

其執(zhí)行原理為,使用OGNL從sql參數(shù)對(duì)象中計(jì)算表達(dá)式的值,根據(jù)表達(dá)式的值動(dòng)態(tài)拼接sql,以此來(lái)完成動(dòng)態(tài)sql的功能。

追問(wèn)1:Xml映射文件中,除了常見(jiàn)的select|insert|updae|delete標(biāo)簽之外,你還常用哪些標(biāo)簽?

用于Mybatis的Mapper文件中,有很多常見(jiàn)標(biāo)簽如:<resultMap>、<parameterMap>、<sql><include>、<namespace>等等,需要的話可以挨個(gè)解釋一下其作用。

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

我們首先要根據(jù)代碼中實(shí)體類(lèi)和數(shù)據(jù)表中的列名是否一一對(duì)應(yīng),如果對(duì)應(yīng)上就可以直接返回。但多字段無(wú)法對(duì)應(yīng)的情況怎么返回?

第一種:使用sql列的別名功能,將列的別名書(shū)寫(xiě)為對(duì)象屬性名,強(qiáng)行與實(shí)體類(lèi)保持一致,但不方便維護(hù)。

第二種:使用resultMap標(biāo)簽,逐一定義數(shù)據(jù)庫(kù)列名和對(duì)象屬性名之間的映射關(guān)系,處理起來(lái)就比較清晰。

<resultMap type="com.xxxx.entity.Task" id="task">
	<id column="taskId" property="id"/>
	<result column="taskName" property="task_name"/>
	<result column="frequency" property="frequency"/>
	<result column="updateTime" property="updateTime"/>
	<result column="description" property="description"/>
	<result column="modifier" property="modifier"/>
	<result column="remark" property="remark"/>
</resultMap>

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

追問(wèn)3:MyBatis中接口綁定你都用過(guò)哪幾種方式?

我們一般通過(guò)注解綁定或在Mapper中進(jìn)行綁定:

1.注解綁定:在接口的方法上面加上 @Select、@Update等注解里面包含Sql語(yǔ)句來(lái)綁定,Sql語(yǔ)句比較簡(jiǎn)單的時(shí)候,推薦注解綁定。

2.Mapper標(biāo)簽綁定:通過(guò)xml里面寫(xiě)SQL來(lái)綁定, 指定xml映射文件里面的namespace必須為接口類(lèi)的全路徑名select標(biāo)簽中的id來(lái)定義接口名稱(chēng),須一一對(duì)應(yīng)。

<mapper namespace="com.xxxxx.dao.TaskDao">
	<!-- 查詢(xún)?nèi)蝿?wù)信息 -->
	<select id="getAllTaskDao" parameterType="int" resultMap="task" >
		SELECT taskId,taskName,frequency,updateTime,description,modifier,remark from task_info 
	</select>
</mapper>

追問(wèn)4:我們知道insert 方法總是返回一個(gè)int值 ,這個(gè)值代表的是插入的行數(shù)。那我如何獲取自動(dòng)生成的主鍵(id)值?

如果采用自增長(zhǎng)策略,自動(dòng)生成的鍵值在 insert 方法執(zhí)行完后可以被設(shè)置到傳入的參數(shù)對(duì)象中。

<insert id=”insertUser” usegeneratedkeys=”true” keyproperty=”id”>
     insert into users_info (id,name) values (null,#{name})
</insert>

追問(wèn)5:有兩個(gè)XML文件和這個(gè)Dao建立關(guān)系,如何避免沖突?

不管有幾個(gè)XML和Dao建立關(guān)系,只要保證namespace+id唯一即可。

面試題3:用過(guò)Mybatis的一級(jí)、二級(jí)緩存么?用過(guò)的話說(shuō)一下原理。

先說(shuō)緩存,合理使用緩存是優(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í)緩存

一級(jí)緩存是SqlSession級(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í)緩存的工作原理:

  • 與Redis同理,用戶(hù)發(fā)起查詢(xún)請(qǐng)求,查找某條數(shù)據(jù),sqlSession先去緩存中查找,是否有該數(shù)據(jù),如果有,直接返回;如果沒(méi)有,從數(shù)據(jù)庫(kù)中查詢(xún),并將查詢(xún)到的數(shù)據(jù)放入一級(jí)緩存區(qū)域,供下次查找使用。
  • 但sqlSession執(zhí)行commit,即增刪改操作時(shí)會(huì)清空緩存。這么做的目的是避免臟讀。

二級(jí)緩存

為什么要有二級(jí)緩存?

二級(jí)緩存是mapper級(jí)別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper的sql語(yǔ)句,多個(gè)SqlSession可以共用二級(jí)緩存,二級(jí)緩存是跨SqlSession的。二級(jí)緩存的作用范圍更大。

在實(shí)際開(kāi)發(fā)中,MyBatis通常和Spring進(jìn)行整合開(kāi)發(fā)。Spring將事務(wù)放到Service中管理,對(duì)于每一個(gè)service中的sqlsession是不同的,這是通過(guò)mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer創(chuàng)建sqlsession自動(dòng)注入到service中的。 每次查詢(xún)之后都要進(jìn)行關(guān)閉sqlSession,關(guān)閉之后數(shù)據(jù)即被清空。所以spring整合之后,如果沒(méi)有事務(wù),一級(jí)緩存是沒(méi)有意義的。

二級(jí)緩存的配置方式

MyBatis對(duì)二級(jí)緩存的支持粒度很細(xì),它會(huì)指定某一條查詢(xún)語(yǔ)句是否使用二級(jí)緩存。

3個(gè)必要配置:

MyBatis支持二級(jí)緩存的總開(kāi)關(guān),全局配置變量cacheEnabled=true

在mybatis-config.xml添加

<settings>  
    <setting name="cacheEnabled" value="true"/><!-- 二級(jí)緩存 -->
</settings> 

該select語(yǔ)句所在的Mapper,配置<cache><cached-ref>節(jié)點(diǎn)

<mapper namespace="com.xxxx.dao.TaskDao">
    <cache/>
    <insert id="addxxx" parameterType="xxx" >
        insert into xxx (name, price) values (#{name}, #{price})    
    </insert>
    <select id="listXXX" resultType="xxx">
        select * from  xxx     
    </select>
</mapper>

該select語(yǔ)句的參數(shù) useCache=true

<select id="selectXXXX" resultMap="task" parameterType="java.util.Map" useCache="true">

追問(wèn)1:一級(jí)緩存和二級(jí)緩存的使用順序

MyBatis查詢(xún)數(shù)據(jù)的順序是:

二級(jí)緩存 👉 一級(jí)緩存 👉 數(shù)據(jù)庫(kù)

總結(jié)

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

相關(guān)文章

最新評(píng)論

陵水| 海安县| 临西县| 彩票| 玉田县| 西安市| 陆丰市| 惠安县| 桑植县| 鄂托克前旗| 吉隆县| 古田县| 东乡| 新丰县| 呼伦贝尔市| 太保市| 淮阳县| 仁怀市| 长治县| 星子县| 湘潭市| 佳木斯市| 寿光市| 田东县| 新疆| 阜新市| 五莲县| 铁岭市| 开鲁县| 拉孜县| 京山县| 开化县| 兰西县| 南郑县| 万荣县| 永年县| 张掖市| 平塘县| 通江县| 鞍山市| 石泉县|