ResultMap的使用
在Mybatis中,可以使用resultMap(結果集映射)作為sql的回傳型別
一般用來解決如下問題:
- 資料庫表欄位名和物體類屬性名不一致的問題;
- 多對一問題:
- 例如:多個學生對應同一個老師,查詢每個學生資訊(包含老師物件屬性)
- 一對多問題:
- 例如:一個老師教學多個學生,查詢某個老師資訊及其屬下學生(包含學生串列)
1、欄位名和屬性名不一致問題
資料庫表欄位名和物體類屬性名不一致的問題處理
id name pwd //資料庫欄位名
id name password //物體類屬性名
Mapper中SQL陳述句撰寫如下:
<!--結果集映射-->
<resultMap id="UserMap" type="User">
<!--column為資料庫中的欄位名,property為物體中的屬性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultType="UserMap">
select * from mybatis.user where id=#{id};
</select>
2、多對一處理
獲得所有學生及其對應老師(多個學生對應一個老師)
Student類
@Data //get,set
@NoArgsConstructor //無參構造
@AllArgsConstructor //有參構造
public class Student{
int id;
String name;
Teacher teacher;
}
Teacher類
@Data //get,set
@NoArgsConstructor //無參構造
@AllArgsConstructor //有參構造
public class Teacher{
int id;
String name;
public Teacher() {
}
public Teacher(int id, String name) {
this.id = id;
this.name = name;
}
}
按照結果集嵌套處理
聯表查詢
<select id="getStudents" resultMap="StudentMap">
select s.id sid, s.name sname, t.name tname
from student s
join teacher t
on s.tid = t.id
</select>
<resultMap id="StudentMap" type="Student">
<!--這里的column是與查詢結果的欄位名對應,欄位重命名了則對應命名后的欄位-->
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<!--復雜的屬性需要單獨處理 物件:association 集合:collection-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
按照查詢嵌套處理
相當于子查詢:
<select id="getStudent2" resultMap="StudentMap2">
select * from student;
</select>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{tid};
</select>
<!--這里將學生和對應老師分開查詢,將查詢結果組合-->
<resultMap id="StudentMap2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
查詢結果:
Student{id=1, name='zhangsan', teacher=Teacher{id=1, name='spong'}}
Student{id=2, name='lisi', teacher=Teacher{id=1, name='spong'}}
3、一對多處理
按指定ID查詢老師及其所管理的學生(一個老師對應多個學生)
Student類
@Data //get,set
@NoArgsConstructor //無參構造
@AllArgsConstructor //有參構造
public class Student {
int id;
String name;
int tid;
public Student() {
}
public Student(int id, String name, int tid) {
this.id = id;
this.name = name;
this.tid = tid;
}
}
Teacher類
@Data //get,set
@NoArgsConstructor //無參構造
@AllArgsConstructor //有參構造
public class Teacher {
int id;
String name;
List<Student> students;
}
按照結果嵌套處理
<select id="getTeacherById" resultMap="TeacherById">
select t.id id, t.name tname, s.id sid,s.name sname,s.tid tid
from teacher t
join student s
on t.id = s.tid;
</select>
<resultMap id="TeacherById" type="Teacher">
<result property="id" column="id"/>
<result property="name" column="tname"/>
<!--獲取List<Student>中的泛型使用 ofType-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
查詢結果:
[Teacher{id=1, name='spong', students=[Student{id=1, name='zhangsan', tid=1}, Student{id=2, name='lisi', tid=1}]}]
小結:
- 關聯:association【多對一】
- 集合:collection【一對多】
- javaType & ofType
- javaType 用來指定物體類中屬性的型別
- ofType 用來指定映射到List或者集合中pojo型別,即泛型的型別
如有錯誤,歡迎大佬指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/89883.html
標籤:Java
上一篇:Java編譯解釋之cmd
