当我们去写多表关联查询的sql,通常会映射出一个非常复杂的结果,如果我们使用Mybatis框架,那么就得使用resultMap去编写映射,这让我们非常头疼,经过我的总结得出了比较简单的步骤。
拿一个真实项目开发中的案例:
1.先去编写映射数据库查询结果集的java bean如下
package
com.xdja.atecs.pojo;
public class
ContactEntry {
private
Integer
contactType
;
private
String
contactValue
;
public
Integer getContactType() {
return
contactType
;
}
public void
setContactType(Integer contactType) {
this
.
contactType
= contactType;
}
public
String getContactValue() {
return
contactValue
;
}
public void
setContactValue(String contactValue) {
this
.
contactValue
= contactValue;
}
}
看到这个不要觉得太简单,下面才是我们真正要映射的结果集:
package
com.xdja.atecs.pojo;
import
com.xdja.atecs.util.Utils;
import
java.util.List;
public class
MemberExtend {
private
String
userId
;
private
List<Integer>
deptIds
;
private
String
userName
;
private
Integer
operateStatus
;
private long
operateSerial
;
private
List<Integer>
identitysIds
;
private
List<ContactEntry>
contactEntries
;
public
String getUserId() {
return
userId
;
}
public void
setUserId(String userId) {
this
.
userId
= userId;
}
public
List<Integer> getDeptIds() {
return
deptIds
;
}
public void
setDeptIds(List<Integer> deptIds) {
this
.
deptIds
= deptIds;
}
public
String getUserName() {
return
userName
;
}
public void
setUserName(String userName) {
this
.
userName
= userName;
}
public
Integer getOperateStatus() {
return
operateStatus
;
}
public void
setOperateStatus(Integer operateStatus) {
this
.
operateStatus
= operateStatus;
}
public long
getOperateSerial() {
return
operateSerial
;
}
public void
setOperateSerial(
long
operateSerial) {
this
.
operateSerial
= operateSerial;
}
public
List<Integer> getIdentitysIds() {
return
identitysIds
;
}
public void
setIdentitysIds(List<Integer> identitysIds) {
this
.
identitysIds
= identitysIds;
}
public
List<ContactEntry> getContactEntries() {
return
contactEntries
;
}
public void
setContactEntries(List<ContactEntry> contactEntries) {
this
.
contactEntries
= contactEntries;
}
}
2.下面说明resultMap一看就懂:
<
resultMap
id
="memberExtend"
type
="com.xdja.atecs.pojo.MemberExtend"
>
<!--
column对应数据库的字段,property对应java bean的变量名称-->
<
result
column
="userId"
property
="userId"
/>
<!--对应
MemberExtend 的userId变量-->
<
result
column
="userName"
property
="userName"
/>
<!--对应
MemberExtend 的userName变量-->
<
result
column
="operateStatus"
property
="operateStatus"
/>
<!--对应
MemberExtend 的operateStatus变量-->
<
result
column
="operateSerial"
property
="operateSerial"
/>
<!--对应
MemberExtend 的operateSerial变量-->
<!--对应
MemberExtend 的deptIds变量,collection标签相当于集合,ofType相当于集合泛型的具体类型,表示集合里每个元素的类型-->
<
collection
property
="deptIds"
ofType
="java.lang.Integer"
>
<
result
property
="deptId"
column
="deptId"
/>
</
collection
>
<!--对应
MemberExtend 的identitysIds变量-->
<
collection
property
="identitysIds"
ofType
="java.lang.Integer"
>
<
result
property
="identitysId"
column
="identitysId"
/>
</
collection
>
<
!--对应
MemberExtend 的contactEntries变量,一个java bean类型集合,还是相同的道理-->
<
collection
property
="contactEntries"
ofType
="com.xdja.atecs.pojo.ContactEntry"
>
<
result
property
="contactType"
column
="contactType"
/>
<
result
property
="contactValue"
column
="contactValue"
/>
</
collection
>
</
resultMap
>
虽然说得很清楚,但还可能有疑问如果
MemberExtend结果集包装的不是List而是单个的java bean该如何映射。和collection标签大同小异,
使用
association
标签,用法几乎相同
。