Mybatis之高階對映【一對多對映】
阿新 • • 發佈:2019-02-07
一對多對映(兩種方式)
三張表關聯查詢。當然resultType也能實現,需要將所查詢的資訊定義到一個pojo(詳情見一對一對映中的resultType),這裡講的是resultMap。
需求:查詢人員、部門資訊並關聯查詢其父級部門資訊。
隨意定義資料庫的三張表:
人員表:
部門表:
父級部門表:
方式一:association (一對一對映)+collection(一對多對映)
a.建立人員表的pojo:
package com.example.data;
import java.util.List;
public class User {
private String id;
private String deptId;
private String name;
private String sex;
private String age;
private String remark;
/**
* User表中有一個dept_id欄位,要在User類中定義一個dept屬性,
* 用於維護dept和user之間的一對一關係
*/
private Dept dept;
//使用一個List<Pdept>集合屬性表示父級部門中的子部門
private List<Pdept> pdepts;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId;
}
public String getName () {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public List<Pdept> getPdepts() {
return pdepts;
}
public void setPdepts(List<Pdept> pdepts) {
this.pdepts = pdepts;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", deptId='" + deptId + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", remark='" + remark + '\'' +
", dept=" + dept +
", pdepts=" + pdepts +
'}';
}
}
b.建立部門表的pojo:
package com.example.data;
public class Dept {
private String id;
private String deptName;
private String parentId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
@Override
public String toString() {
return "Dept{" +
"id='" + id + '\'' +
", deptName='" + deptName + '\'' +
", parentId='" + parentId + '\'' +
'}';
}
}
b.建立父級部門表的pojo:
package com.example.data;
public class Pdept {
private String id;
private String pdeptName;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPdeptName() {
return pdeptName;
}
public void setPdeptName(String pdeptName) {
this.pdeptName = pdeptName;
}
@Override
public String toString() {
return "Pdept{" +
"id='" + id + '\'' +
", pdeptName='" + pdeptName + '\'' +
'}';
}
}
b.編寫Mapper.xml:
<select id="selectOneToMany" resultMap="selectRstMapTwo">
<![CDATA[
select * from bank_user,bank_dept,bank_pdept where bank_user.dept_id=bank_dept.id
and bank_dept.parent_id=bank_pdept.id
]]>
</select>
<!--定義resultmap
column:資料庫中對應的列名(名字必須完全一樣)
property:實體類pojo中的屬性名(名字必須完全一樣)-->
<resultMap type="com.example.data.User" id="selectRstMapTwo">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<!--association:一對一關聯對映-->
<association property="dept" javaType="com.example.data.Dept">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
</association>
<!-- collection:一對多關聯對映
property表示集合型別屬性名稱,也就是User實體類中定義的部門List名字
ofType表示集合中的物件的型別-->
<collection property="pdepts" ofType="com.example.data.Pdept">
<id column="id" property="id"/>
<result column="pdept_name" property="pdeptName"/>
</collection>
</resultMap>
c.編寫Mapper.java:
//一對多查詢:查詢人員、部門資訊並關聯查詢其父級部門資訊
public List<User> selectOneToMany()throws Exception;
輸出結果日誌:
<select id="selectOneToMany" resultMap="selectRstMapTwo">
<![CDATA[
select * from bank_user,bank_dept,bank_pdept where bank_user.dept_id=bank_dept.id
and bank_dept.parent_id=bank_pdept.id
]]>
</select>
<!--定義resultmap
column:資料庫中對應的列名(名字必須完全一樣)
property:實體類pojo中的屬性名(名字必須完全一樣)
extends:繼承一個resultMap,把其中的所有配置都繼承(這裡繼承的是上一篇一對一對映的resultMap)
使用extends,只編寫collection元素即可。
-->
<resultMap type="com.example.data.User" id="selectRstMapTwo" extends="selectRstMap">
<!-- collection:一對多關聯對映
property表示集合型別屬性名稱,也就是User實體類中定義的部門List名字
ofType表示集合中的物件的型別-->
<collection property="pdepts" ofType="com.example.data.Pdept">
<id column="id" property="id"/>
<result column="pdept_name" property="pdeptName"/>
</collection>
</resultMap>