一、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-tw/n/231719.html