Mybatis之高階對映【一對一對映】
阿新 • • 發佈:2018-12-09
1.一對一對映 兩表關聯查詢。有兩種方案:對映檔案中輸出對映使用resultType或者resultMap。 需求:查詢人員資訊並關聯其部門。 資料庫兩張表: 人員表: 部門表:
(1.)使用resultType對映: a.建立部門表的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類userdept,將人員表user和部門表dept中的屬性合併在一起,以便將查詢出來的記錄對映到該pojo上。 (用到了extends )
package com.example.data;
public class UserDept extends Dept{
private String id;
private String name;
private String sex;
private String age;
private String remark;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "UserDept{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", remark='" + remark + '\'' +
'}';
}
}
c.編寫Mapper.xml:
<!--查詢人員資訊並關聯其部門-->
<!--resultType對映的實體類就是構建的user跟dept的組合類-->
<select id="selectMessage" resultType="com.bestvike.example.data.UserDept">
<![CDATA[
select * from bank_user,bank_dept where bank_user.dept_id=bank_dept.id
]]>
</select>
d.編寫Mapper.java:
//查詢人員資訊並關聯其部門
public List<UserDept> selectMessage()throws Exception;
輸出結果日誌: (1.)使用resultMap對映:(兩種方式)
方式一:巢狀結果 resultMap不需要構造新的pojo,只需將查詢出來的記錄的值通過resultMap對映到指定到pojo的屬性上。 a.建立人員表的pojo:
package com.example.data;
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;
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;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", deptId='" + deptId + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", remark='" + remark + '\'' +
", dept=" + dept +
'}';
}
}
b.編寫Mapper.xml:
<select id="selectByResultMap" resultMap="selectRstMap">
<![CDATA[
select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id
]]>
</select>
<!--定義resultmap
id:指定查詢列中的唯一標識,連線select查詢標籤內的resultmap。如果多個列組成唯一標識,配置多個id
type:返回物件型別。(介面中要定義的物件)
id標籤:主鍵標籤。
column:查詢出的列名(給資料庫中的列名定義的別名)
property:對應type所指定的java實體類POJO中的屬性名
-->
<resultMap type="com.bestvike.example.data.User" id="selectRstMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<!--定義association:一對一對映(將另一張表要查詢的資訊對映到物件屬性傳出到一個物件上,
那個物件就擁有要查詢的兩張表的資訊)
property:把一對一對映的查詢資訊封裝到物件屬性上,封裝的物件就是javaType裡定義的pojo
javaType:property屬性的型別
-->
<association property="dept" javaType="com.bestvike.example.data.Dept">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
</association>
</resultMap>
c.編寫Mapper.java:
//resultmap:查詢人員資訊並關聯其部門
public List<User> selectByResultMap();
輸出結果日誌:
方式二:巢狀查詢 與方式一不同點在Mapper.xml:
<select id="selectByResultMap" resultMap="selectRstMap">
<![CDATA[
select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id
]]>
</select>
<!--定義resultmap-->
<resultMap type="com.bestvike.example.data.User" id="selectRstMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<!--association:一對一對映
column:(dept_id)user表中的欄位,用來與dept表關聯
select:定義與select標籤連線的標識,select元素通過id引用此名字
-->
<association property="dept" column="dept_id" select="getDept"/>
</resultMap>
<!--id:連線association裡select定義的名字-->
<select id="getDept" resultType="com.bestvike.example.data.Dept">
SELECT dept_name name FROM bank_dept WHERE id=#{id}
</select>
輸出結果日誌:每個id查詢一次,最終彙總 總結: resultType:pojo中沒有包括查詢出來的所以列名,則需要增加列名對應的屬性(整合所有要查詢的資訊封裝到物件),完成對映。 resultMap:不需要建立新的pojo,但需要在mapper.xml檔案中建立association一對一對映。