MyBatis之ResultMap的association和collection標簽詳解

来源:https://www.cnblogs.com/wang1221/archive/2022/10/10/16774529.html
-Advertisement-
Play Games

一、前言 MyBatis 創建時的一個思想是:資料庫不可能永遠是你所想或所需的那個樣子。 我們希望每個資料庫都具備良好的第三範式或 BCNF 範式,可惜它們並不都是那樣。 如果能有一種資料庫映射模式,完美適配所有的應用程式,那就太好了,但可惜也沒有。 而 ResultMap 就是 MyBatis 對 ...


一、前言

MyBatis 創建時的一個思想是:資料庫不可能永遠是你所想或所需的那個樣子。 我們希望每個資料庫都具備良好的第三範式或 BCNF 範式,可惜它們並不都是那樣。 如果能有一種資料庫映射模式,完美適配所有的應用程式,那就太好了,但可惜也沒有。 而 ResultMap 就是 MyBatis 對這個問題的答案。

二、ResultMap 的屬性列表

屬性 描述
id 當前命名空間中的一個唯一標識,用於標識一個結果映射。
type 類的完全限定名, 或者一個類型別名(關於內置的類型別名,可以參考上面的表格)。
autoMapping 如果設置這個屬性,MyBatis 將會為本結果映射開啟或者關閉自動映射。 這個屬性會覆蓋全局的屬性 autoMappingBehavior。預設值:未設置(unset)。
extends 可以繼承其他resultMap的一些寫好的屬性

三、resultMap標簽介紹

  • constructor - 用於在實例化類時,註入結果到構造方法中
    • idArg - ID 參數;標記出作為 ID 的結果可以幫助提高整體性能
    • arg - 將被註入到構造方法的一個普通結果
  • id – 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體性能
  • result – 註入到欄位或 JavaBean 屬性的普通結果
  • association – 一個複雜類型的關聯;許多結果將包裝成這種類型
    嵌套結果映射 – 關聯可以是 resultMap 元素,或是對其它結果映射的引用
  • collection – 一個複雜類型的集合
    嵌套結果映射 – 集合可以是 resultMap 元素,或是對其它結果映射的引用
  • discriminator – 使用結果值來決定使用哪個 resultMap
    • case – 基於某些值的結果映射
      嵌套結果映射 – case 也是一個結果映射,因此具有相同的結構和元素;或者引用其它的結果映射

四、id & result標簽參數詳解

屬性 描述
property 映射到列結果的欄位或屬性。如果 JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的欄位(field)。 無論是哪一種情形,你都可以使用常見的點式分隔形式進行複雜屬性導航。 人話為:就是你的Java實體類
column 資料庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數一樣。
javaType 一個 Java 類的全限定名,或一個類型別名(關於內置的類型別名,可以參考上面的表格)。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那麼你應該明確地指定 javaType 來保證行為與期望的相一致。
jdbcType JDBC 類型,所支持的 JDBC 類型參見這個表格之後的“支持的 JDBC 類型”。 只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個類型。
typeHandler 我們在前面討論過預設的類型處理器。使用這個屬性,你可以覆蓋預設的類型處理器。 這個屬性值是一個類型處理器實現類的全限定名,或者是類型別名。

- 常用例子展示

<resultMap  id="UsersMap" type="com.wang.test.demo.entity.User">
    <id property="id" column="id" jdbcType="INTEGER"/>
    <result property="username" column="username" jdbcType="VARCHAR"/>
    <result property="password" column="password" jdbcType="VARCHAR"/>
    <result property="role" column="role" jdbcType="VARCHAR"/>
    <result property="addTime" column="add_time" jdbcType="TIMESTAMP"/>
</resultMap>

五、association標簽常用參數詳解

屬性 描述
property 映射到列結果的欄位或屬性。如果用來匹配的 JavaBean 存在給定名字的屬性,那麼它將會被使用。否則 MyBatis 將會尋找給定名稱的欄位。 無論是哪一種情形,你都可以使用通常的點式分隔形式進行複雜屬性導航。 人話為:你要一對一的實體類中的另一個實體類的名稱
javaType 一個 Java 類的完全限定名,或一個類型別名。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那麼你應該明確地指定 javaType 來保證行為與期望的相一致。

例子演示

  • 實體類演示
@Data
//書籍
public class Book {
    private String id;
    private String name;
    private String author;
    private Double price;
    private Integer del;
    private Date publishdate;
    private String info;
    //把出版社對象當作屬性
    private Publisher pub;//------重點在這裡一本書對應一個出版社,這是一個出版社對象
}
@Data
//出版社
public class Publisher {
    private String id;
    private String name;
    private String phone;
    private String address;
}

- xml演示

<resultMap id="rMap_book" type="com.wang.test.demo.entity.Book">
	<!-- 主鍵  property為實體類屬性 column為資料庫欄位 jdbcType為實體類對應的jdbc類型-->
    <id property="id" column="b_id" jdbcType="VARCHAR"></id>
    <!-- 普通屬性  property為實體類屬性 column為資料庫欄位  jdbcType為實體類對應的jdbc類型-->
    <result property="name" column="b_name" jdbcType="VARCHAR"></result>
    <result property="author" column="author" jdbcType="VARCHAR"></result>
    <result property="price" column="price" jdbcType="VARCHAR"></result>
    <result property="del" column="del" jdbcType="NUMERIC"></result>
    <result property="publisherid" column="publisher_id" jdbcType="VARCHAR"></result>
    <result property="publishdate" column="publish_date" jdbcType="TIMESTAMP"></result>
    <!--一對一映射association property 為實體類book中的屬性名字 javaType為實體類屬性的類型 -->
    <association property="pub" javaType="com.wang.test.demo.entity.Publisher">
        <id property="id" column="p_id" jdbcType="VARCHAR"></id>
        <result property="name" column="name" jdbcType="VARCHAR"></result>
        <result property="phone" column="phone" jdbcType="VARCHAR"></result>
        <result property="address" column="address" jdbcType="VARCHAR"></result>
    </association>
</resultMap>

六、collection標簽常用參數詳解

屬性 描述
property 映射到列結果的欄位或屬性。如果用來匹配的 JavaBean 存在給定名字的屬性,那麼它將會被使用。否則 MyBatis 將會尋找給定名稱的欄位。 無論是哪一種情形,你都可以使用通常的點式分隔形式進行複雜屬性導航。 人話為:你要一對一的實體類中的另一個實體類的名稱
javaType 這裡和一對一的表示不太一樣,這裡一般是一對多的集合類型,如:list
ofType 指定的這個一對多的集合的所存放的實體類的類型

例子演示

- 實體類演示

@Data
//班級類
public class Class {

    private String id;
    private String name;
    private List<Student> students;//----重點在這裡,一個班級對應多個學生

}
@Data
public class Student {

    private int id;
    private String name;
    private int age;
}

- xml演示

<resultMap id="rMap_class" type="com.wang.test.demo.entity.Class">
    <id property="id" column="id" jdbcType="VARCHAR"></id>
    <result property="name" column="name" jdbcType="VARCHAR"></result>
    <!--一對多映射用這個  ofTyp是一對多的集合的所存放的實體類  javaType實體類的屬性類型-->
    <collection property="students" ofType="com.wang.test.demo.entity.Student" javaType="list">
        <id property="id" column="id" jdbcType="INTEGER"></id>
        <result property="name" column="name" jdbcType="VARCHAR"></result>
        <result property="age" column="age" jdbcType="INTEGER"></result>
    </collection>
</resultMap>

七、jdbc Type與java Type對照表

JDBC Type Java Type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
BOOLEAN boolean
TINYINT byte
SMALLINT short
INTEGER INTEGER
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
ARRAY Array
DISTINCT mapping of underlying type
STRUCT Struct
REF Ref
DATALINK java.net.URL
附:表格來源

八、總結

這樣就對ResultMap具體參數進行詳細的解釋,還有對association和collection標簽的解釋和具體演示,希望能夠幫到你,一起學習,如果用到收藏一下唄!!!!

歡迎大家關註小編的微信公眾號,謝謝大家!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、索引簡介 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件並選取那些符合查詢條件的記錄。 1.1 概念 索引最常用的比喻就是書籍的目錄,查詢索引就像查詢一本書的目錄。本質上目錄是將書中一小部分內容信息(比如題目)和內容的位置信息(頁碼)共同構成, ...
  • 我們的目標是秒殺淘寶或京東等的訂單,這裡面有幾個關鍵點,首先需要登錄淘寶或京東,其次你需要準備好訂單,最後要在指定時間快速提交訂單。 這裡就要用到一個爬蟲利器Selenium,Selenium是一個用於Web應用程式測試的工具,Selenium可以直接運行在瀏覽器中,通過後臺控制操作瀏覽器,完成購買 ...
  • 說說你對@Configuration的理解? 定義 @Configuration這個註解是一個類註解,加在類上,標識該類是一個配置類,讓這個類的功能等同於一個bean xml配置文件。 @Configuration public class SpringConfig { } 上面代碼類似於下麵的xm ...
  • Docker 部署 Kibana 本篇主要介紹 使用 Docker 部署 kibana 用於操作 Elasticsearch 使用. 1. 前置準備 1.1 Elasticsearch 準備 可以先準備一個 Elasticsearch 服務 後續用於使用Kibana 去連接它操作,本篇就不展開了 1 ...
  • 文章的添加 博客園打開需要拷貝的文章,右鍵檢查--》選擇cnblogs_post_body這一個div,然後複製outer HTML到admin後臺文章表裡面 最後需要在文章詳情頁的文章內容那一行添加一個|safe 點贊點踩製作 前端樣式: 不會寫,直接拷貝博客園的點贊點踩html和css樣式 {# ...
  • 泛型除了KTV,還有一個讓人比較疑惑的玩意,而且它就是用來表達疑惑的:? 雖然通過泛型已經達到我們想要的效果了,例如: List<String> list = new ArrayList<String>(); 這樣就可以放心地存取String類型的數據。 但是(抱歉,凡事總有個但是),應用的場景總是 ...
  • 現在的關係型資料庫例如PostgreSQL/MySQL, 都已經對 JSON 類型提供相當豐富的功能, 項目中對於不需要檢索但是又需要結構化的存儲, 會在資料庫中產生很多 JSON 類型的欄位, 與 Jackson 做對象的序列化和反序列化配合非常方便. 如果 JSON 在 Java 代碼中是定義為... ...
  • 目錄 什麼是應用服務雪崩 雪崩效應產生的幾種場景 緩存雪崩的解決方案 雪崩的整體解決方案 熔斷設計 隔離設計 超時機制設計 如何提前發現雪崩 什麼是應用服務雪崩 雪崩問題 分散式系統都存在這樣一個問題,由於網路的不穩定性,決定了任何一個服務的可用性都不是 100% 的。當網路不穩定的時候,作為服務的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...