一对多个多举例:一个球员效力过多个俱乐部,具有多重国籍,现需要获取所有球员的全部信息(基本信息,曾效力俱乐部信息,拥有的国籍信息)
1 表信息
lyn_user_info –球员基本信息表
lyn_user_group –球员俱乐部关系表
lyn_group_info –俱乐部信息表
lyn_user_nationality –球员国籍关系表
2 类定义
UserInfo –球员全部信息
GroupInfo –俱乐部信息
Nationality –国籍信息
public class UserInfo {
private String userId;
private String userName;
private Set<GroupInfo> groups;
private Set<Nationality> nations;
//getters setters
}
class GroupInfo {
private String groupId;
private String groupName;
//getters setters
//hashCode equals
}
class Nationality {
private String nationId;
private String nationName;
//getters setters
//hashCode equals
}
注意:UserInfo 中俱乐部集合和国籍集合采用Set,同时GroupInfo和Nationality类要覆写equals方法和hashCode方法,否则关联查询映射后的集合中会存在重复值;
3 sqlmap映射
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="mapper">
<resultMap class="com.lyn.demo.ibatis.GroupInfo" id="groupInfoMap">
<result property="groupId" column="groupId"/>
<result property="groupName" column="groupName"/>
</resultMap>
<resultMap class="com.lyn.demo.ibatis.Nationality" id="nationInfoMap">
<result property="nationId" column="nationId"/>
<result property="nationName" column="nationName"/>
</resultMap>
<resultMap id="userInfoMap" class="com.lyn.demo.ibatis.UserInfo" groupBy="userId">
<result property="userId" column="userId"/>
<result property="userName" column="userName"/>
<result property="groups" resultMap="mapper.groupInfoMap"/>
<result property="nations" resultMap="mapper.nationInfoMap"/>
</resultMap>
<select id="queryUserInfo" resultMap="userInfoMap">
select u.user_id userId,
u.user_name userName,
g.group_id groupId,
g.group_name groupName,
un.nation_id nationId,
un.nation_name nationName
from lyn_user_info u
left join lyn_user_group ug
on u.user_id = ug.user_id
left join lyn_group_info g
on ug.group_id = g.group_id
left join lyn_user_nationality un
on u.user_id = un.user_id
</select>
</sqlMap>
4 验证结果
public class Client {
public final static SqlMapClient client = SqlClient.getInstace().getClient();
public static void main(String[] args) {
try {
List<UserInfo> list =client.queryForList("mapper.queryUserInfo",null);
for (UserInfo us : list) {
us.print();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
=====begin======
base info:
1,RONALDO
group info:
03,MUFC
01,RMCF
nation info
001,葡萄牙
003,英国
002,西班牙
=====end======