亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

面試題1:說說你對Mybatis的理解?

Mybatis是一個持久層的框架,是apache下的頂級項目。

在這里插入圖片描述

Mybatis內部封裝了jdbc,開發(fā)者只需要關注sql語句本身,而不需要花費精力去處理加載驅動、創(chuàng)建連接、創(chuàng)建statement等繁雜的過程。

mybatis通過xml注解的方式將要執(zhí)行的各種statement配置起來,并通過java對象和statement中sql的動態(tài)參數進行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結果映射為java對象并返回。

MyBatis 支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJO映射成數據庫中的記錄。

追問1:說一下MyBatis的工作原理和流程吧。

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

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

在這里插入圖片描述

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

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

5.Executor 執(zhí)行器:MyBatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態(tài)地生成需要執(zhí)行的 SQL 語句,同時負責查詢緩存的維護

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

7.輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本數據類型和 POJO 類型。輸入參數映射過程類似于 JDBC 對 preparedStatement 對象設置參數的過程。

8.輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。

追問2:列舉幾個MyBatis的核心組件,說說分別干啥用?

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

面試題2:(問幾個實際使用的問題)Mybatis動態(tài)sql是做什么的?都有哪些動態(tài)sql?

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

Mybatis動態(tài)sql可以讓我們在Xml映射文件內,以標簽的形式編寫動態(tài)sql,完成邏輯判斷和動態(tài)拼接sql的功能。

Mybatis提供了9種動態(tài)sql標簽:trimwhere、set、foreachif、choose、whenotherwise、bind

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

追問1:Xml映射文件中,除了常見的select|insert|updae|delete標簽之外,你還常用哪些標簽?

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

追問2:Mybatis是如何將sql執(zhí)行結果封裝為目標對象并返回的?都有哪些映射形式?

我們首先要根據代碼中實體類和數據表中的列名是否一一對應,如果對應上就可以直接返回。但多字段無法對應的情況怎么返回?

第一種:使用sql列的別名功能,將列的別名書寫為對象屬性名,強行與實體類保持一致,但不方便維護。

第二種:使用resultMap標簽,逐一定義數據庫列名和對象屬性名之間的映射關系,處理起來就比較清晰。

<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>

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

追問3:MyBatis中接口綁定你都用過哪幾種方式?

我們一般通過注解綁定或在Mapper中進行綁定:

1.注解綁定:在接口的方法上面加上 @Select@Update等注解里面包含Sql語句來綁定,Sql語句比較簡單的時候,推薦注解綁定。

2.Mapper標簽綁定:通過xml里面寫SQL來綁定, 指定xml映射文件里面的namespace必須為接口類的全路徑名select標簽中的id來定義接口名稱,須一一對應。

<mapper namespace="com.xxxxx.dao.TaskDao">
	<!-- 查詢任務信息 -->
	<select id="getAllTaskDao" parameterType="int" resultMap="task" >
		SELECT taskId,taskName,frequency,updateTime,description,modifier,remark from task_info 
	</select>
</mapper>

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

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

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

追問5:有兩個XML文件和這個Dao建立關系,如何避免沖突?

不管有幾個XML和Dao建立關系,只要保證namespace+id唯一即可。

面試題3:用過Mybatis的一級、二級緩存么?用過的話說一下原理。

先說緩存,合理使用緩存是優(yōu)化中最常見的,將從數據庫中查詢出來的數據放入緩存中,下次使用時不必從數據庫查詢,而是直接從緩存中讀取,避免頻繁操作數據庫,減輕數據庫的壓力,同時提高系統性能。

一級緩存

一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造sqlSession對象,在對象中有一個數據結構用于存儲緩存數據。不同的sqlSession之間的緩存數據區(qū)域是互相不影響的。也就是他只能作用在同一個sqlSession中,不同的sqlSession中的緩存是互相不能讀取的。

一級緩存的工作原理:

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

二級緩存

為什么要有二級緩存?

二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。二級緩存的作用范圍更大。

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

二級緩存的配置方式

MyBatis對二級緩存的支持粒度很細,它會指定某一條查詢語句是否使用二級緩存。

3個必要配置:

MyBatis支持二級緩存的總開關,全局配置變量cacheEnabled=true

在mybatis-config.xml添加

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

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

<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語句的參數 useCache=true

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

追問1:一級緩存和二級緩存的使用順序

MyBatis查詢數據的順序是:

二級緩存 👉 一級緩存 👉 數據庫

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Struts2 $,#,%詳解及實例代碼

    Struts2 $,#,%詳解及實例代碼

    這篇文章主要介紹了Struts2 $,#,%詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-12-12
  • Java?設計模式以虹貓藍兔的故事講解簡單工廠模式

    Java?設計模式以虹貓藍兔的故事講解簡單工廠模式

    簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現
    2022-03-03
  • java 如何判斷是否是26個英文字母

    java 如何判斷是否是26個英文字母

    這篇文章主要介紹了java 如何判斷是否是26個英文字母的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 淺談Java8的特性之Optional類

    淺談Java8的特性之Optional類

    這篇文章主要介紹了淺談Java8的特性之Optional類,Optional類是 Java 8 引入的一個很有趣的特性,Optional 類是一個可以為null的容器對象,它主要解決的問題是臭名昭著的空指針異常,需要的朋友可以參考下
    2023-08-08
  • Java 并行數據處理和性能分析

    Java 并行數據處理和性能分析

    這篇文章主要介紹了Java 并行數據處理和性能分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 如何使用hutool做本地緩存的工具類

    如何使用hutool做本地緩存的工具類

    這篇文章主要介紹了如何使用hutool做本地緩存的工具類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringBoot的@Conditional條件注解詳解

    SpringBoot的@Conditional條件注解詳解

    這篇文章主要介紹了SpringBoot的@Conditional條件注解詳解,打開每個自動配置類,都會看到@Conditional或其衍生的條件注解,本節(jié)我們來認識下@Conditional注解,需要的朋友可以參考下
    2023-12-12
  • j2Cache線上異常排查問題解決記錄分析

    j2Cache線上異常排查問題解決記錄分析

    這篇文章主要為大家介紹了關于j2Cache線上異常排查的問題解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • SpringBoot攔截器使用精講

    SpringBoot攔截器使用精講

    攔截器可以根據 URL 對請求進行攔截,主要應用于登陸校驗、權限驗證、亂碼解決、性能監(jiān)控和異常處理等功能上。SpringBoot同樣提供了攔截器功能。 本文將為大家詳細介紹一下
    2021-12-12
  • Java線程優(yōu)先級示例代碼

    Java線程優(yōu)先級示例代碼

    使用過Bit下載軟件的同學應該很清楚,我們有多個下載任務同時執(zhí)行,而其中的某一個或多個是非常重要的,于是給這些任務設定一個高度優(yōu)先,以便任務可以獲取更多的帶寬盡早完成下載
    2013-09-09

最新評論