Mybatis一對多映射詳解

一、Mybatis一對多映射原理

在Mybatis中,一對多映射指的是一個實體類A中包含一個實體類B的集合,即A與B是一對多的關係。Mybatis通過使用嵌套查詢或嵌套結果來實現一對多映射。

嵌套查詢指的是使用多條SQL語句來查詢實體類A和實體類B,然後在Java代碼中通過循環來實現將實體類B的結果集加入到實體類A中。而嵌套結果則是通過一條SQL語句查詢出實體類A和實體類B的集合,並將實體類B的集合放入實體類A中。

舉例來說,有一個學生表和成績表,學生表和成績表是一對多的關係,一個學生可能對應多個成績。這時候我們就可以使用Mybatis的一對多映射來查詢出每個學生對應的成績,將結果集保存到一個List中,然後將List放入Student對象中。


public class Student {
    private int id;
    private String name;
    private List<Score> scores; // 一對多映射中的集合屬性,表示學生對應的成績列表
    // getter/setter方法省略
}

public class Score {
    private int id;
    private int stuId; //成績所對應的學生id
    private String subject;
    private int score;
    // getter/setter方法省略
}

二、Mybatis一對多映射配置

在Mybatis中,配置一對多映射需要在映射文件中進行配置。具體步驟如下:

1、在映射文件中定義實體類A的resultMap,以及定義實體類A和實體類B的resultMap,注意要給實體類B設置一個association標籤,指定實體類B對應的Java屬性



     
     
     
          
          
          
     

2、編寫SQL語句查詢出實體類A和實體類B的數據,並在SQL語句中使用嵌套查詢或嵌套結果。例如:



     SELECT s.id, s.name, sc.id, sc.stu_id, sc.subject, sc.score 
     FROM student s 
     LEFT JOIN score sc ON s.id = sc.stu_id 
     WHERE s.id=#{id}

3、在接口中定義方法,如下所示:


public interface StudentMapper {
     public Student getStudentWithScores(int id);
}

4、調用方法來查詢結果:


SqlSession session = MybatisUtils.getSession();
try {
     StudentMapper mapper = session.getMapper(StudentMapper.class);
     Student student = mapper.getStudentWithScores(1);
} finally {
     session.close();
}

三、Mybatis映射

Mybatis使用映射文件來定義Java對象與對應數據庫表之間的映射關係。在一對多映射中,需要為實體類A和實體類B分別定義對應的resultMap。

在實體類A的resultMap中,通過使用collection標籤來定義與實體類B的集合屬性對應的resultMap,然後在實體類B的resultMap中,使用association標籤來定義實體類A的屬性與數據庫表的字段之間的映射關係。具體實現可以參考第二部分中的代碼示例。

四、Mybatis一對多映射分步查詢

Mybatis一對多映射分步查詢指的是在不使用嵌套查詢或嵌套結果的情況下分步查詢出實體類A和實體類B的數據,並將實體類B的數據作為集合屬性設置到實體類A中。

具體步驟如下:

1、在接口中定義方法,如下所示:


public interface StudentMapper {
     public Student getStudent(int id);
     public List<Score> getScoresByStuId(int stuId);
}

2、在映射文件中配置以上兩個方法,分別查詢出實體類A和實體類B的數據。例如:



     SELECT id, name FROM student WHERE id = #{id}



     SELECT id, stu_id, subject, score FROM score WHERE stu_id = #{stuId}

3、調用以上兩個方法,並將其中一個方法的結果集設置到另一個方法所返回的實體類中,具體代碼示例可參考以下實現:


public Student getStudent(int id) {
    SqlSession session = MybatisUtils.getSession();
    try {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        Student student = mapper.getStudent(id);
        if (student != null) {
            List<Score> scores = mapper.getScoresByStuId(student.getId());
            student.setScores(scores);
        }
        return student;
    } finally {
        session.close();
    }
}

五、Mybatis一對多映射註解

Mybatis也支持使用註解來完成一對多映射的配置。需要使用@Results和@ResultMap註解來完成實體類與數據庫表之間的映射關係的定義。同時,使用@One和@Many註解來表示一對多映射關係的定義。


public interface StudentMapper {
     @Results(id="studentMap", value={
          @Result(property="id", column="id"),
          @Result(property="name", column="name"),
          @Result(property="scores", column="id", 
               many=@Many(select="com.example.ScoreMapper.getScoresByStuId"))
     })
     public Student getStudentWithScores(int id);
}

public interface ScoreMapper {
     @Select("SELECT id, stu_id, subject, score FROM score WHERE stu_id=#{stuId}")
     public List<Score> getScoresByStuId(int stuId);
}

六、Mybatis多對多映射

多對多映射指的是兩個實體類之間互相包含集合的關係。Mybatis中可以使用嵌套查詢或嵌套結果來實現多對多映射。具體實現思路與一對多映射類似,只是需要分別為兩個實體類定義對應的resultMap。

七、Mybatis一對多映射為空

如果實體類A中的集合屬性對應的實體類B在數據庫表中沒有對應數據,使用Mybatis進行一對多映射時,實體類A的集合屬性值將為空。

八、Mybatis一對多查詢

在Mybatis中,一對多查詢指的是單獨查詢出實體類A對應的數據以及實體類B對應的數據,而不是通過嵌套查詢或嵌套結果來實現。這種方式不涉及到一對多映射關係的定義,在查找的時候也需要進行多次查詢。具體步驟如下:

1、在映射文件中分別定義實體類A和實體類B的resultMap

2、編寫SQL語句,查詢出實體類A和實體類B的數據,並在Mybatis配置文件中定義對應的映射關係。例如:



     SELECT s.id, s.name, sc.id, sc.stu_id, sc.subject, sc.score 
     FROM student s 
     LEFT JOIN score sc ON s.id = sc.stu_id 
     WHERE s.id=#{id}

3、調用Mapper接口的方法來查詢結果。具體代碼示例可參考第二部分中的實現。

九、Mybatis一對多查詢語句

一對多查詢語句指的是查詢出實體類A對應的所有數據,以及實體類B對應的所有數據,並將兩個結果集合併起來。這種方式不需要定義一對多映射關係,但需要對結果集進行特殊處理。具體步驟如下:

1、編寫SQL語句,查詢出實體類A和實體類B的數據。例如:


SELECT s.id, s.name, sc.id, sc.stu_id, sc.subject, sc.score 
 FROM student s 
 LEFT JOIN score sc ON s.id = sc.stu_id

2、在Mybatis的接口中定義方法,並使用@ResultMap註解標註在映射文件中定義的resultMap。例如:


public interface StudentMapper {
     @Select({
         "SELECT s.id, s.name, sc.id, sc.stu_id, sc.subject, sc.score",
         "FROM student s LEFT JOIN score sc ON s.id = sc.stu_id"
     })
     @ResultMap("studentMap")
     public List<Student> getStudentWithScores();
}

3、調用Mapper接口的方法來查詢結果。具體代碼示例可參考第二部分中的實現。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/231719.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 01:07
下一篇 2024-12-11 01:07

相關推薦

  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論