iBatis demo:一对多个多映射

本文通过一个实例展示了如何在iBatis中处理一对多的关系映射。详细介绍了涉及的表信息、类定义、sqlmap映射配置,并提供了验证结果,以帮助理解如何获取球员的全部信息,包括基本信息、效力过的俱乐部及拥有的国籍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对多个多举例:一个球员效力过多个俱乐部,具有多重国籍,现需要获取所有球员的全部信息(基本信息,曾效力俱乐部信息,拥有的国籍信息)

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======

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值