欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis-Plus?ORM數(shù)據(jù)庫和實體類映射方式

 更新時間:2025年01月20日 10:59:19   作者:Yan.love  
本文詳細介紹了MyBatis-Plus(MP)在數(shù)據(jù)庫和Java對象映射方面的功能,包括基本映射、主鍵生成策略、復雜映射(如嵌套對象和集合類型)以及自定義SQL的使用,MP通過豐富的注解和XML配置,簡化了數(shù)據(jù)庫操作,提高了開發(fā)效率

在開發(fā)中,數(shù)據(jù)庫和 Java 對象的映射(ORM)是一個繞不開的話題,而 MyBatis-Plus(MP)作為一款優(yōu)秀的 ORM 工具,幫我們簡化了繁瑣的數(shù)據(jù)庫操作。本文將從數(shù)據(jù)庫基礎、表與實體映射、復雜對象映射、自定義 SQL 等角度,深入探討 MP 的數(shù)據(jù)庫映射功能。

一、數(shù)據(jù)庫設計基本知識

在開始 ORM 映射之前,理解數(shù)據(jù)庫設計的基本原則至關重要:

1. 索引

索引可以提高查詢效率,例如主鍵索引、唯一索引、復合索引等。

在創(chuàng)建實體時,可以用注解標注需要索引的字段:

@TableField("username")
@TableIndex(type = IndexType.UNIQUE)
private String username;

2. 主鍵與外鍵

  • 主鍵:標識表中每一行記錄的唯一性。
  • 外鍵:用來建立表與表之間的關系。

3. 范式

數(shù)據(jù)庫范式(如第一范式、第三范式)是設計良好表結(jié)構(gòu)的重要參考。

Tip: 保持表結(jié)構(gòu)簡單,但不妨礙業(yè)務擴展。

二、表與實體的映射關系

MP 提供了豐富的注解,幫助開發(fā)者高效完成數(shù)據(jù)庫表與 Java 對象的映射。

1. 基本映射

MP 默認將表名與實體名直接映射,但我們可以通過注解自定義:

表名映射:使用 @TableName 注解將實體類與數(shù)據(jù)庫表關聯(lián):

@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @TableField("username")
    private String name;
}

字段名映射:數(shù)據(jù)庫字段名通常為下劃線風格,Java 屬性名為駝峰風格。當字段名與屬性名不一致時,MP 默認自動處理這種映射,也可以通過 @TableField 自定義:

@TableField("email_address")
private String emailAddress;

2. 自定義主鍵生成策略

主鍵生成是 ORM 映射中重要的一環(huán),當往數(shù)據(jù)庫添加字段的時候,此id會根據(jù)指定的主鍵生成策略來進行生成對應的值。MP 支持多種主鍵生成策略:

IdType.AUTO

  • 適用于主鍵為自增類型(如 MySQL 的 AUTO_INCREMENT
  • 在插入數(shù)據(jù)時,不需要為主鍵賦值,由數(shù)據(jù)庫根據(jù)自增策略生成。
  • 此策略僅在數(shù)據(jù)庫支持自增主鍵的情況下有效,需要在數(shù)據(jù)庫中保證主鍵是自增的。

IdType.ASSIGN_ID

  • MyBatis-Plus 默認的主鍵生成策略,使用 雪花算法 生成全局唯一 ID。
  • 在插入數(shù)據(jù)時,MP 自動生成主鍵值,并在 SQL 中直接插入該值。
  • 數(shù)據(jù)庫表的主鍵類型為 BIGINT,需要全局唯一標識符。

IdType.INPUT

  • 手動輸入主鍵值
  • 需要在插入數(shù)據(jù)前手動設置主鍵值,否則插入操作將失敗。
  • 適用于特定業(yè)務場景(如主鍵由外部系統(tǒng)生成)。

示例:

在實體類中通過注解設置:

@TableId(value = "id", type = IdType.AUTO)
private Long id;

全局設置主鍵策略(application.yaml 配置文件中)

mybatis-plus:
  global-config:
    db-config:
      id-type: ASSIGN_ID  # 全局默認使用雪花算法
      # 可選值:
      # AUTO: 數(shù)據(jù)庫自增
      # NONE: 無狀態(tài)
      # INPUT: 手動輸入
      # ASSIGN_ID: 雪花算法
      # ASSIGN_UUID: UUID

三、XML 中配置復雜映射

1. 基本數(shù)據(jù)類型映射

對于普通表字段到實體屬性的映射,MP 提供了簡單直觀的方式。

通過 resultMap 解決復雜結(jié)果集的映射問題。

指定了id之后,如果查詢數(shù)據(jù)中包含了多個id的值,會自動合并,映射為一個對象集合

a. 基本映射規(guī)則

MP 默認遵循數(shù)據(jù)庫字段名和實體類屬性名之間的映射規(guī)則

  • 數(shù)據(jù)庫字段名:下劃線命名。
  • Java 屬性名:駝峰命名。

示例表結(jié)構(gòu)(user 表):

CREATE TABLE user (
    id BIGINT PRIMARY KEY,
    username VARCHAR(50),
    age INT
);

實體類定義:

@Data
public class User {
    private Long id;          // 對應數(shù)據(jù)庫字段 id
    private String username;  // 對應數(shù)據(jù)庫字段 username
    private Integer age;      // 對應數(shù)據(jù)庫字段 age
}

b. 自定義字段映射

通過 column 屬性來指定表字段

<resultMap id="userMap" type="User">
    <id property="id" column="id"/>
    <result property="username" column="user_name"/>
    <result property="age" column="age"/>
</resultMap>

2. 嵌套對象映射

嵌套對象映射用于處理對象屬性本身是另一個復雜對象的場景,例如主表與子表關聯(lián)。

a. 表和實體類

假設有以下表結(jié)構(gòu)

user表:

CREATE TABLE user (
     id BIGINT PRIMARY KEY,
     name VARCHAR(50)
 ); 

address表:

    CREATE TABLE address (
      id BIGINT PRIMARY KEY,
      user_id BIGINT,
      city VARCHAR(50),
      FOREIGN KEY (user_id) REFERENCES user(id)
    );

實體類定義:

@Data
public class User {
    private Long id;
    private String name;
    private Address address; // 嵌套對象
}

@Data
public class Address {
    private Long id;
    private Long userId;
    private String city;
}

b. XML 映射

在 XML 文件中通過 <association> 定義嵌套對象映射:

<resultMap id="userWithAddressMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="address" javaType="Address">
        <id property="id" column="address_id"/>
        <result property="city" column="city"/>
    </association>
</resultMap>

<select id="selectUserWithAddress" resultMap="userWithAddressMap">
    SELECT u.id, u.name, a.id AS address_id, a.city
    FROM user u
    LEFT JOIN address a ON u.id = a.user_id
</select>

3. 集合類型映射

當查詢結(jié)果中存在一個字段包含 多個值(例如多個標簽 tag),并且在實體類中將該字段指定為 集合類型(如 List<String>),MyBatis-Plus 會根據(jù)配置自動將這些值合并并映射為集合。

這種場景常見于 一對多多對多 的查詢中,主要通過 <collection> 元素 實現(xiàn)。

a. 基本示例

① 假設有以下數(shù)據(jù):

article_tag

article_idtag
1Spring
1MyBatis
2Java

② 實體類定義

public class Article {
    private Long id;               // 文章 ID
    private String title;          // 文章標題
    private List<String> tags;     // 標簽集合
}

③ Mapper 配置(XML 映射文件)

使用 <collection> 將多行數(shù)據(jù)的 tag 字段自動映射為一個集合:

<resultMap id="ArticleResultMap" type="com.example.Article">
    <id property="id" column="article_id" />
    <result property="title" column="title" />
    <collection property="tags" ofType="java.lang.String">
        <result column="tag" />
    </collection>
</resultMap>

<select id="selectArticlesWithTags" resultMap="ArticleResultMap">
    SELECT 
        a.id AS article_id, 
        a.title, 
        t.tag 
    FROM 
        article a
    LEFT JOIN 
        article_tag t 
    ON 
        a.id = t.article_id
</select>

④ 查詢結(jié)果

List<Article> articles = articleMapper.selectArticlesWithTags();

假設查詢結(jié)果為:

[
  {
    "id": 1,
    "title": "學習 MyBatis",
    "tags": ["Spring", "MyBatis"]
  },
  {
    "id": 2,
    "title": "Java 基礎",
    "tags": ["Java"]
  }
]

b. 對象類型集合

以用戶為例和訂單表為例:

① 表和實體類

假設有以下表結(jié)構(gòu)

user表:

CREATE TABLE user (
    id BIGINT PRIMARY KEY,
    name VARCHAR(50)
);

order表:

CREATE TABLE order (
    id BIGINT PRIMARY KEY,
    user_id BIGINT,
    order_number VARCHAR(50),
    FOREIGN KEY (user_id) REFERENCES user(id)
);

實體類定義:

@Data
public class User {
    private Long id;
    private String name;
    private List<Order> orders; // 集合類型
}

@Data
public class Order {
    private Long id;
    private Long userId;
    private String orderNumber;
}

XML 映射

在 XML 文件中通過 <collection> 定義集合映射:

<resultMap id="userWithOrdersMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="orderNumber" column="order_number"/>
    </collection>
</resultMap>

<select id="selectUserWithOrders" resultMap="userWithOrdersMap">
    SELECT u.id, u.name, o.id AS order_id, o.order_number
    FROM user u
    LEFT JOIN order o ON u.id = o.user_id
</select>

【注意事項】

  • <collection> 的 ofType 屬性指定集合中元素的類型。
  • 確保 SQL 查詢中包含子表數(shù)據(jù),否則集合為空。

四、自定義 SQL

MP 提供了兩種自定義 SQL 的方式:XML 文件注解方式

1. 使用注解自定義 SQL

Mapper 接口中直接使用注解書寫簡單 SQL:

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findByName(@Param("name") String name);
}
  • 優(yōu)點:簡潔、輕量化。
  • 缺點:不適合復雜查詢。

2. 使用 XML 文件自定義 SQL

對于復雜 SQL,建議使用 XML 文件。MP 通過 Mapper 文件與 XML 配置綁定:

UserMapper.java

@Mapper
public interface UserMapper extends BaseMapper<User> {
    User selectUserWithOrders(Long userId);
}

UserMapper.xml

<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id"/>
        <result property="orderNumber" column="order_number"/>
    </collection>
</resultMap>

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserWithOrders" resultType="User">
        SELECT u.*, o.*
        FROM user u
        LEFT JOIN order o ON u.id = o.user_id
        WHERE u.id = #{userId}
    </select>
</mapper>

五、寫在最后

總結(jié):

  • MP 將實體類與數(shù)據(jù)庫表映射打通,使得開發(fā)效率提升。
  • 對于復雜場景,XML 自定義 SQL 是不可或缺的利器。
  • 主鍵生成、字段映射等基礎功能覆蓋面廣,足夠應對大多數(shù)項目需求。

建議:

  • 優(yōu)先使用 MP 提供的內(nèi)置方法,減少代碼冗余。
  • 復雜業(yè)務邏輯時,靈活使用自定義 SQL(尤其是 XML 文件)。
  • 對于關聯(lián)查詢,合理使用 resultMap嵌套映射

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 超級詳細的Java安裝教程(Mac版)

    超級詳細的Java安裝教程(Mac版)

    Java是一種廣泛使用的編程語言,可用于開發(fā)各種類型的應用程序,這篇文章主要給大家介紹了關于Mac系統(tǒng)下Java安裝的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Kotlin 語言中調(diào)用 JavaScript 方法實例詳解

    Kotlin 語言中調(diào)用 JavaScript 方法實例詳解

    這篇文章主要介紹了Kotlin 語言中調(diào)用 JavaScript 方法實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • Spring依賴注入中的@Resource與@Autowired詳解

    Spring依賴注入中的@Resource與@Autowired詳解

    這篇文章主要介紹了Spring依賴注入中的@Resource與@Autowired詳解,提到Spring依賴注入,大家最先想到應該是@Resource和@Autowired,對于Spring為什么要支持兩個這么類似的注解卻未提到,屬于知其然而不知其所以然,本文就來做詳細講解,需要的朋友可以參考下
    2023-09-09
  • java返回的List進行add操作報錯

    java返回的List進行add操作報錯

    本文主要介紹了java返回的List進行add操作報錯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java畢業(yè)設計實戰(zhàn)之校園一卡通系統(tǒng)的實現(xiàn)

    Java畢業(yè)設計實戰(zhàn)之校園一卡通系統(tǒng)的實現(xiàn)

    這是一個使用了java+Springboot+Maven+mybatis+Vue+mysql+wd開發(fā)的校園一卡通系統(tǒng),是一個畢業(yè)設計的實戰(zhàn)練習,具有校園一卡通系統(tǒng)該有的所有功能,感興趣的朋友快來看看吧
    2022-01-01
  • 基于ComponentScan注解的掃描范圍及源碼解析

    基于ComponentScan注解的掃描范圍及源碼解析

    這篇文章主要介紹了基于ComponentScan注解的掃描范圍及源碼解析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 一種新的日期處理方式之JavaScript Temporal API

    一種新的日期處理方式之JavaScript Temporal API

    JavaScript Temporal API是一種為Web開發(fā)人員提供了一種新的處理日期和時間數(shù)據(jù)類型的方式。它的目的是使操作日期和時間更加簡單和可靠,而且不用擔心歷史時區(qū)問題或全球化協(xié)調(diào)時間(UTC)之類的問題,感興趣的同學可以參考閱讀
    2023-05-05
  • Springboot MDC+logback實現(xiàn)日志追蹤的方法

    Springboot MDC+logback實現(xiàn)日志追蹤的方法

    MDC(Mapped Diagnostic Contexts)映射診斷上下文,該特征是logback提供的一種方便在多線程條件下的記錄日志的功能,這篇文章主要介紹了Springboot MDC+logback實現(xiàn)日志追蹤的方法,需要的朋友可以參考下
    2024-04-04
  • SpringMVC上傳文件的三種實現(xiàn)方式

    SpringMVC上傳文件的三種實現(xiàn)方式

    本篇文章主要介紹了SpringMVC上傳文件的三種實現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • SpringMvc/SpringBoot HTTP通信加解密的實現(xiàn)

    SpringMvc/SpringBoot HTTP通信加解密的實現(xiàn)

    這篇文章主要介紹了SpringMvc/SpringBoot HTTP通信加解密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論