【MyBatis】MyBatis 理論 40 問(二)

MyBatis 理論 40 問》包含以下 2 篇文章:

  • MyBatis 理論 40 問(一)
  • MyBatis 理論 40 問(二)

MyBatis 理論 40 問(二)

  • 21.如何獲取生成的主鍵?
  • 22.當實體類中的屬性名和表中的字段名不一樣 ,怎么辦?
  • 23.Mapper 編寫有哪幾種方式?
  • 24.什么是 MyBatis 的接口綁定?有哪些實現方式?
  • 25.使用 MyBatis 的 mapper 接口調用時有哪些要求?
  • 26.這個 Dao 接口的工作原理是什么?Dao 接口里的方法,參數不同時,方法能重載嗎?
  • 27.MyBatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重復?
  • 28.簡述 MyBatis 的 Xml 映射文件和 MyBatis 內部數據結構之間的映射關系?
  • 29.MyBatis 是如何將 SQL 執行結果封裝為目標對象并返回的?都有哪些映射形式?
  • 30.Xml 映射文件中,除了常見的 select | insert | updae | delete 標簽之外,還有哪些標簽?
  • 31.MyBatis 映射文件中,如果 A 標簽通過 include 引用了 B 標簽的內容,請問,B 標簽能否定義在 A 標簽的后面,還是說必須定義在 A 標簽的前面?
  • 32.MyBatis 能執行一對多,一對一的聯系查詢嗎,有哪些實現方法?
  • 33.MyBatis 是否可以映射 Enum 枚舉類?
  • 34.MyBatis 動態 SQL 是做什么的?都有哪些動態 SQL?能簡述一下動態 SQL 的執行原理嗎?
  • 35.MyBatis 是如何進行分頁的?分頁插件的原理是什么?
  • 36.簡述 MyBatis 的插件運行原理,以及如何編寫一個插件?
  • 37.MyBatis 的一級、二級緩存

21.如何獲取生成的主鍵?

新增標簽中添加:keyProperty=“ID” 即可。

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >insert into user(user_name, user_password, create_time)values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>

22.當實體類中的屬性名和表中的字段名不一樣 ,怎么辦?

(1)通過在查詢的 SQL 語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">select order_id id, order_no orderno, order_price price form orderswhere order_id=#{id};
</select>

(2) 通過 <resultMap> 來映射字段名和實體類屬性名的一一對應的關系。

<select id="getOrder" parameterType="int" resultMap="orderResultMap">select * from orders where order_id=#{id}
</select><resultMap type="com.jourwon.pojo.Order" id="orderResultMap"><!-- 用id屬性來映射主鍵字段 --><id property="id" column="order_id"><!-- 用result屬性來映射非主鍵字段,property為實體類屬性名,column為數據庫表中的屬性 --><result property="orderno" column="order_no" /><result property="price" column="order_price" />
</reslutMap>

23.Mapper 編寫有哪幾種方式?

(1)接口實現類繼承 SqlSessionDaoSupport:使用此種方法需要編寫 mapper 接口,mapper 接口實現類、mapper.xml 文件。

  • sqlMapConfig.xml 中配置 mapper.xml 的位置。
<mappers><mapper resource="mapper.xml 文件的地址" /><mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 定義 mapper 接口。
  • 實現類集成 SqlSessionDaoSupportmapper 方法中可以用 this.getSqlSession() 進行數據增刪改查。
  • spring 配置。
<bean id=" " class="mapper 接口的實現"><property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

(2)使用 org.mybatis.spring.mapper.MapperFactoryBean

  • sqlMapConfig.xml 中配置 mapper.xml 的位置,如果 mapper.xmlmapper 接口的名稱相同且在同一個目錄,這里可以不用配置。
  • 定義 mapper 接口。
<mappers><mapper resource="mapper.xml 文件的地址" /><mapper resource="mapper.xml 文件的地址" />
</mappers>
  • mapper.xml 中的 namespacemapper 接口的地址。
  • mapper 接口中的方法名和 mapper.xml 中的定義的 statementid 保持一致。
  • Spring 中定義。
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="mapper 接口地址" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

(3)使用 mapper 掃描器。

  • mapper.xml 文件編寫。
    • mapper.xml 中的 namespacemapper 接口的地址;
    • mapper 接口中的方法名和 mapper.xml 中的定義的 statementid 保持一致;
    • 如果將 mapper.xmlmapper 接口的名稱保持一致則不用在 sqlMapConfig.xml 中進行配置。
  • 定義 mapper 接口。注意 mapper.xml 的文件名和 mapper 的接口名稱保持一致,且放在同一個目錄。
  • 配置 mapper 掃描器。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="mapper 接口包地址"></property><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 使用掃描器后從 spring 容器中獲取 mapper 的實現對象。

24.什么是 MyBatis 的接口綁定?有哪些實現方式?

接口綁定,就是在 MyBatis 中任意定義接口,然后把接口里面的方法和 SQL 語句綁定,我們直接調用接口方法就可以,這樣比起原來的 SqlSession 提供的方法我們可以有更加靈活的選擇和設置。

接口綁定有兩種實現方式:

  • 通過注解綁定,就是在接口的方法上面加上 @Select@Update 等注解,里面包含 SQL 語句來綁定;
  • 通過 xml 里面寫 SQL 來綁定, 在這種情況下,要指定 xml 映射文件里面的 namespace 必須為接口的全路徑名。當 SQL 語句比較簡單時候,用注解綁定, 當 SQL 語句比較復雜時候,用 xml 綁定,一般用 xml 綁定的比較多。

25.使用 MyBatis 的 mapper 接口調用時有哪些要求?

  • Mapper 接口方法名和 mapper.xml 中定義的每個 sql 的 id 相同。
  • Mapper 接口方法的輸入參數類型和 mapper.xml 中定義的每個 sql 的 parameterType 的類型相同。
  • Mapper 接口方法的輸出參數類型和 mapper.xml 中定義的每個 sql 的 resultType 的類型相同。
  • Mapper.xml 文件中的 namespace 即是 Mapper 接口的類路徑。

26.這個 Dao 接口的工作原理是什么?Dao 接口里的方法,參數不同時,方法能重載嗎?

  • Dao 接口的工作原理是 JDK 動態代理,MyBatis 運行時會使用 JDK 動態代理為 Dao 接口生成代理 proxy 對象,代理對象 proxy 會攔截接口方法,轉而執行 MappedStatement 所代表的 SQL,然后將 SQL 執行結果返回。
  • Dao 接口里的方法是不能重載的,因為是 全限名+方法名 的保存和尋找策略。

27.MyBatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重復?

  • 不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重復;如果沒有配置 namespace,那么 id 不能重復;畢竟 namespace 不是必須的,只是最佳實踐而已。
  • 原因就是 namespace + id 是作為 M a p < S t r i n g , M a p p e d S t a t e m e n t > Map<String, MappedStatement> Map<String,MappedStatement> 的 Key 使用的,如果沒有 namespace,就剩下 id,那么,id 重復會導致數據互相覆蓋。有了 namespace,自然 id 就可以重復,namespace 不同,namespace + id 自然也就不同。

28.簡述 MyBatis 的 Xml 映射文件和 MyBatis 內部數據結構之間的映射關系?

MyBatis 將所有 Xml 配置信息都封裝到 All-In-One 重量級對象 Configuration 內部。在 Xml 映射文件中,<parameterMap> 標簽會被解析為 ParameterMap 對象,其每個子元素會被解析為 ParameterMapping 對象。 <resultMap> 標簽會被解析為 ResultMap 對象,其每個子元素會被解析為 ResultMapping 對象。每一個 <select><insert><update><delete> 標簽均會被解析為 MappedStatement 對象,標簽內的 SQL 會被解析為 BoundSql 對象。

29.MyBatis 是如何將 SQL 執行結果封裝為目標對象并返回的?都有哪些映射形式?

  • 第一種是使用 <resultMap> 標簽,逐一定義列名和對象屬性名之間的映射關系。
  • 第二種是使用 SQL 列的別名功能,將列別名書寫為對象屬性名,比如 T_NAME AS NAME,對象屬性名一般是 name,小寫,但是列名不區分大小寫,MyBatis 會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成 T_NAME AS NaMe,MyBatis 一樣可以正常工作。

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

30.Xml 映射文件中,除了常見的 select | insert | updae | delete 標簽之外,還有哪些標簽?

還有很多其他的標簽, <resultMap><parameterMap><sql><include><selectKey>,加上動態 SQL 的 9 9 9 個標簽:trimwheresetforeachifchoosewhenotherwisebind 等。其中 <sql> 為 SQL 片段標簽,通過 <include> 標簽引入 SQL 片段, <selectKey> 為不支持自增的主鍵生成策略標簽。

31.MyBatis 映射文件中,如果 A 標簽通過 include 引用了 B 標簽的內容,請問,B 標簽能否定義在 A 標簽的后面,還是說必須定義在 A 標簽的前面?

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

原理是,MyBatis 解析 A 標簽,發現 A 標簽引用了 B 標簽,但是 B 標簽尚未解析到,尚不存在,此時,MyBatis 會將 A 標簽標記為未解析狀態,然后繼續解析余下的標簽,包含 B 標簽,待所有標簽解析完畢,MyBatis 會重新解析那些被標記為未解析的標簽,此時再解析 A 標簽時,B 標簽已經存在,A 標簽也就可以正常解析完成了。

32.MyBatis 能執行一對多,一對一的聯系查詢嗎,有哪些實現方法?

能,不僅可以 一對多、一對一,還可以 多對多、多對一。實現方式如下:

  • 單獨發送一個 SQL 去查詢關聯對象,賦給主對象,然后返回主對象。
  • 使用嵌套查詢,類似 JOIN 查詢,一部分是 A 對象的屬性值,另一部分是關聯對象 B 的屬性值,好處是只要發送一個屬性值,就可以把主對象和關聯對象查出來。
  • 子查詢

33.MyBatis 是否可以映射 Enum 枚舉類?

MyBatis 可以映射枚舉類,不僅可以映射枚舉類,MyBatis 可以映射任何對象到表的一列上。映射方式為自定義一個 TypeHandler,實現 TypeHandlersetParameter()getResult() 接口方法。

TypeHandler 有兩個作用,一是完成從 javaTypejdbcType 的轉換,二是完成 jdbcTypejavaType 的轉換,體現為 setParameter()getResult() 兩個方法,分別代表設置 sql 問號占位符參數和獲取列查詢結果。

34.MyBatis 動態 SQL 是做什么的?都有哪些動態 SQL?能簡述一下動態 SQL 的執行原理嗎?

MyBatis 動態 SQL 可以讓我們在 Xml 映射文件內,以標簽的形式編寫動態 SQL,完成邏輯判斷和動態拼接 SQL 的功能,MyBatis 提供了 9 9 9 種動態 SQL 標簽:trimwheresetforeachifchoosewhenotherwisebind

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

35.MyBatis 是如何進行分頁的?分頁插件的原理是什么?

MyBatis 使用 RowBounds 對象進行分頁,它是針對 ResultSet 結果集執行的內存分頁,而非物理分頁,可以在 SQL 內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。

分頁插件的基本原理是使用 MyBatis 提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的 SQL,然后重寫 SQL,根據 dialect 方言,添加對應的物理分頁語句和物理分頁參數。

舉例:

select * from student

攔截 SQL 后重寫為:

select t.* from (select * from student) t limit 0, 10

36.簡述 MyBatis 的插件運行原理,以及如何編寫一個插件?

MyBatis 僅可以編寫針對 ParameterHandlerResultSetHandlerStatementHandlerExecutor 4 4 4 種接口的插件,MyBatis 使用 JDK 的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這 4 4 4 種接口對象的方法時,就會進入攔截方法,具體就是 InvocationHandlerinvoke() 方法,當然,只會攔截那些你指定需要攔截的方法。

實現 MyBatis 的 Interceptor 接口并復寫 intercept() 方法,然后在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。

37.MyBatis 的一級、二級緩存

  • 一級緩存:基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當 Session flushclose 之后,該 Session 中的所有 Cache 就將清空,默認打開一級緩存。
  • 二級緩存與一級緩存其機制相同,默認也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域為 MapperNamespace),并且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現 Serializable 序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 <cache/>
  • 對于緩存數據更新機制,當某一個作用域(一級緩存 Session / 二級緩存 Namespace)進行了 C / U / D 操作后,默認該作用域下所有 select 中的緩存將被 clear

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42734.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

influxQL基本語法及常用的聚合函數

InfluxQL&#xff08;Influx Query Language&#xff09;是與InfluxDB緊密集成的一種SQL風格的語言&#xff0c;專為處理時間序列數據而設計。其基本語法結構清晰&#xff0c;方便開發者理解和實現。以下是對InfluxQL基本語法及常用聚合函數的簡單介紹&#xff1a; 目錄 一、…

Docker Dockerfile:構建與優化

Docker Dockerfile&#xff1a;構建與優化 簡介 Docker 是一種廣泛使用的容器化技術&#xff0c;它允許開發人員將應用程序及其依賴環境打包到一個可移植的容器中。Dockerfile 是 Docker 中用于自動化容器鏡像構建的腳本文件。本文將詳細介紹 Dockerfile 的基本結構、指令使用…

【Python】已解決:(MongoDB安裝報錯)‘mongo’ 不是內部或外部命令,也不是可運行的程序

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例及解決方案五、注意事項 已解決&#xff1a;&#xff08;MongoDB安裝報錯&#xff09;‘mongo’ 不是內部或外部命令,也不是可運行的程序 一、分析問題背景 在安裝和配置MongoDB時&#xff0c;有…

怎樣在 PostgreSQL 中優化對 UUID 數據類型的索引和查詢?

文章目錄 一、UUID 數據類型概述二、UUID 索引和查詢的性能問題三、優化方案&#xff08;一&#xff09;選擇合適的索引類型&#xff08;二&#xff09;壓縮 UUID&#xff08;三&#xff09;拆分 UUID&#xff08;四&#xff09;使用覆蓋索引&#xff08;五&#xff09;優化查詢…

一二三應用開發平臺應用開發示例(6)——代碼生成、權限配置、運行效果查看

生成代碼 完成配置工作&#xff0c;接下來就是見證奇跡的時刻~ 返回到實體列表&#xff0c;選中“文件夾”記錄&#xff0c;點擊“生成代碼”按鈕&#xff0c;提示成功后&#xff0c;在項目的output目錄下輸出了平臺基于配置模板產生的各層代碼&#xff0c;在原有后端的基礎上…

Pyserial設置緩沖區大小失敗

文章目錄 問題描述原因分析解決方案 問題描述 使用set_buffer_size()設置緩沖區大小后&#xff0c;buffer size仍為默認的4096 import time import serial ser serial.Serial(baudrate9600, timeout0.5) ser.port COM1 ser.set_buffer_size(rx_size8192) ser.open() while …

windows上部署python3.11

hello&#xff0c;大家好&#xff0c;我是一名測試開發工程師&#xff0c;至今已在自動化測試領域深耕9個年頭&#xff0c;現已將本人實戰多年的多終端自動化測試框架【wyTest】開源啦&#xff0c;在接下來的一個月里&#xff0c;我將免費指導大家使用wyTest&#xff0c;請大家…

歐拉函數.

性質1&#xff1a;質數n的歐拉函數為n-1. 性質2&#xff1a;如果p&#xff0c;q都是質數&#xff0c;那么? ( p ? q ) ? ( p ) ? ? ( q ) ( p ? 1 ) ? ( q ? 1 ) 證明&#xff1a;p&#xff0c;2p....q*p都不與q*p互質&#xff0c;q同理&#xff0c;所以總的不互質個…

JavaEE初階-網絡編程

文章目錄 前言一、UDP與TCP1.1 有連接與無連接1.2 全雙工1.3 可靠傳輸與不可靠傳輸1.4 面向子節流與面向數據報 二、UDP回顯服務器及客戶端編寫三、UDP字典服務器四、TCP回顯服務器及客戶端編寫五、數據序列化的方式5.1 基于行文本的方式傳輸5.2 基于XML的格式5.3 基于json5.4 …

STM32芯片系列與產品后綴解讀

一. 產品系列 STM32單片機是一系列基于ARM Cortex-M內核的32位微控制器&#xff0c;廣泛應用于嵌入式系統中。 STM32系列由STMicroelectronics&#xff08;意法半導體&#xff09;開發和生產&#xff0c;并憑借其靈活的設計、豐富的外設和強大的生態系統&#xff0c;成為嵌入式…

咬文嚼字:詞元是當今生成式人工智能失敗的一個重要原因

生成式人工智能模型處理文本的方式與人類不同。了解它們基于"標記"的內部環境可能有助于解釋它們的一些奇怪行為和頑固的局限性。從 Gemma 這樣的小型設備上模型到 OpenAI 業界領先的 GPT-4o 模型&#xff0c;大多數模型都建立在一種稱為轉換器的架構上。由于轉換器在…

Ubuntu24.04清理常見跟蹤軟件tracker

盡量一天一更&#xff0c;不刷視頻&#xff0c;好好生活 打開系統監視器&#xff0c;發現開機有個tracker-miner-fs-fs3的跟蹤程序&#xff0c;而且上傳了10kb的數據。 搜索知&#xff0c;該程序會搜集應用和文件的信息。 刪除tracker 顯示帶tracker的apt程序 sudo apt lis…

ThreadLocal的內存泄漏

什么是內存泄漏 程序在申請內存后&#xff0c;無法釋放已申請的內存空間在定義變量時&#xff0c;需要一段內存空間來存儲數據信息&#xff0c;而這段內存如果一直不被釋放&#xff0c;那么就會導致內存被占用光&#xff0c;而被占用的這個對象&#xff0c;一直不能被回收掉&am…

書生·浦語2.5開源,推理能力再創新標桿

導讀 2024 年 7 月 3 日&#xff0c;上海人工智能實驗室與商湯科技聯合香港中文大學和復旦大學正式發布新一代大語言模型書?浦語2.5&#xff08;InternLM2.5&#xff09;。相比上一代模型&#xff0c;InternLM2.5 有三項突出亮點&#xff1a; 推理能力大幅提升&#xff0c;在…

VUE與React的生命周期對比

前言 在前端開發中&#xff0c;Vue和React是兩個非常流行的JavaScript框架&#xff0c;它們各自有著獨特的生命周期機制。了解并熟練掌握這些生命周期&#xff0c;對于開發高效、可維護的前端應用至關重要。本文將詳細對比Vue和React的生命周期&#xff0c;幫助開發者更好地理…

Python | Leetcode Python題解之第222題完全二叉樹的節點個數

題目&#xff1a; 題解&#xff1a; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def countNodes(self,…

好玩的珠璣妙算-加作弊帶概率空間+日志存儲240705mindMaster

Python代碼 import random import time import datetimeNUM_DIGITS 10 #NUM_NON_ZERO_DIGITS 9failFlag 0class Mastermind:def __init__(self, code_length, max_attempts, secret01code, game_id): # def __init__(self, code_length, max_attempts):self.code_length…

【Elasticsearch】Elasticsearch倒排索引詳解

文章目錄 &#x1f4d1;引言一、倒排索引簡介二、倒排索引的基本結構三、Elasticsearch中的倒排索引3.1 索引和文檔3.2 創建倒排索引3.3 倒排索引的存儲結構3.4 詞典和倒排列表的優化 四、倒排索引的查詢過程4.1 過程4.2 示例 五、倒排索引的優缺點5.1 優點5.2 缺點 六、倒排索…

【Excel】求和帶文字的數據

目錄標題 1. 給出樣例2. CtrlE3. CtrlH → A替換為 → 全部替換 1. 給出樣例 2. CtrlE 3. CtrlH → A替換為 → 全部替換

算法期末函數題

R6-1 可重復選擇的組合數問題 【考核知識點】可重復選擇的組合計數 【問題描述】 有n個不同元素&#xff08;1<n<20&#xff09;&#xff0c;每個元素可以選多次&#xff0c;一共需要選出k個元素出來&#xff08;1<k<20&#xff09;&#xff0c;問有多少種選取的…