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

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

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

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

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

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

1. 索引

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

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

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

2. 主鍵與外鍵

  • 主鍵:標(biāo)識表中每一行記錄的唯一性。
  • 外鍵:用來建立表與表之間的關(guān)系。

3. 范式

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

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

二、表與實體的映射關(guān)系

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

1. 基本映射

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

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

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

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

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

@TableField("email_address")
private String emailAddress;

2. 自定義主鍵生成策略

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

IdType.AUTO

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

IdType.ASSIGN_ID

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

IdType.INPUT

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

示例:

在實體類中通過注解設(shè)置:

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

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

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

三、XML 中配置復(fù)雜映射

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

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

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

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

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

MP 默認(rèn)遵循數(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;          // 對應(yīng)數(shù)據(jù)庫字段 id
    private String username;  // 對應(yīng)數(shù)據(jù)庫字段 username
    private Integer age;      // 對應(yīng)數(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. 嵌套對象映射

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

a. 表和實體類

假設(shè)有以下表結(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. 集合類型映射

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

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

a. 基本示例

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

article_tag

article_idtag
1Spring
1MyBatis
2Java

② 實體類定義

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

③ 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();

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

[
  {
    "id": 1,
    "title": "學(xué)習(xí) MyBatis",
    "tags": ["Spring", "MyBatis"]
  },
  {
    "id": 2,
    "title": "Java 基礎(chǔ)",
    "tags": ["Java"]
  }
]

b. 對象類型集合

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

① 表和實體類

假設(shè)有以下表結(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)點:簡潔、輕量化。
  • 缺點:不適合復(fù)雜查詢。

2. 使用 XML 文件自定義 SQL

對于復(fù)雜 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ā)效率提升。
  • 對于復(fù)雜場景,XML 自定義 SQL 是不可或缺的利器。
  • 主鍵生成、字段映射等基礎(chǔ)功能覆蓋面廣,足夠應(yīng)對大多數(shù)項目需求。

建議:

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

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

相關(guān)文章

  • mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

    mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

    mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼

    Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼

    這篇文章主要介紹了Springboot 實現(xiàn)跨域訪問 無需使用jsonp的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Java批量寫入文件和下載圖片的示例代碼

    Java批量寫入文件和下載圖片的示例代碼

    這篇文章主要介紹了Java批量寫入文件和下載圖片的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • 基于IDEA 的遠(yuǎn)程調(diào)試 Weblogic的操作過程

    基于IDEA 的遠(yuǎn)程調(diào)試 Weblogic的操作過程

    這篇文章主要介紹了基于IDEA 的遠(yuǎn)程調(diào)試 Weblogic的操作過程,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • 詳解Java如何判斷ResultSet結(jié)果集是否為空

    詳解Java如何判斷ResultSet結(jié)果集是否為空

    ResultSet 表示 select 語句的查詢結(jié)果集。這篇文章主要為大家詳細(xì)介紹了Java如何判斷ResultSet結(jié)果集是否為空,感興趣的可以了解一下
    2023-02-02
  • SpringCloud通用請求字段攔截處理方法

    SpringCloud通用請求字段攔截處理方法

    這篇文章主要介紹了SpringCloud通用請求字段攔截處理,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 關(guān)于TreeMap自定義排序規(guī)則的兩種方式

    關(guān)于TreeMap自定義排序規(guī)則的兩種方式

    這篇文章主要介紹了關(guān)于TreeMap自定義排序規(guī)則的兩種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • mybatis自定義類型處理器TypehHandler示例詳解

    mybatis自定義類型處理器TypehHandler示例詳解

    我們在寫mapper映射器的配置文件時,不經(jīng)意間已經(jīng)用到類型轉(zhuǎn)換,不過是mybatis幫我們完成的,下面這篇文章主要給大家介紹了關(guān)于mybatis自定義類型處理器TypehHandler的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • Java 淺談 高并發(fā) 處理方案詳解

    Java 淺談 高并發(fā) 處理方案詳解

    這篇文章主要介紹了淺談Java高并發(fā)解決方案以及高負(fù)載優(yōu)化方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中的AQS入門攻略

    Java中的AQS入門攻略

    AQS(AbstractQueuedSynchronizer)是JUC包中用于構(gòu)建鎖和同步器的核心框架,它通過volatile的state變量和FIFO隊列實現(xiàn)線程同步,簡化了同步工具的開發(fā),并支持獨占與共享兩種模式,本文介紹Java中的AQS是什么,感興趣的朋友跟隨小編一起看看吧
    2025-10-10

最新評論

海伦市| 河东区| 东阿县| 比如县| 崇明县| 潜江市| 建平县| 汶川县| 武安市| 工布江达县| 吴堡县| 佳木斯市| 库尔勒市| 虞城县| 麻阳| 黎平县| 芷江| 新密市| 新竹县| 怀远县| 卫辉市| 铜陵市| 高邮市| 海城市| 衢州市| 盘山县| 白山市| 阜南县| 乌海市| 泽普县| 淮安市| 涞源县| 合作市| 焉耆| 宣城市| 新干县| 安新县| 民丰县| 武宣县| 海丰县| 纳雍县|