在演示一对一的时候,我们是查询账户并将其对应的用户信息查出来,一个账户只能对应一个用户的信息。在本文中,我们将演示一对多的查询,查询的逻辑是查询用户的时候,将用户所对应的所有账户信息查询出来:

1.修改User实体类

在User实体类中加上对Account对象的集合引用,并提供get、set方法:

// 一对多关系映射:主表实体应该包含从表实体的集合引用
private List<Account> accounts;

public List<Account> getAccounts() {
    return accounts;
}

public void setAccounts(List<Account> accounts) {
    this.accounts = accounts;
}

2.修改User的映射配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace的是DAO的全限定类名-->
<mapper namespace="com.eastnotes.dao.IUserDao">

    <!--映射配置文件开启二级缓存-->
    <cache/>

    <!--定义User的UserMap-->
    <resultMap id="userAccountMap" type="user">
        <!--封装user数据-->
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
        <result property="birthday" column="birthday"></result>

        <!--配置user对象中accounts集合映射-->
        <collection property="accounts"  ofType="account">
            <id property="id" column="id"></id>
            <result property="uid" column="uid"></result>
            <result property="money" column="money"></result>
        </collection>
    </resultMap>

    <!--配置查询所有-->
    <select id="findAll" resultMap="userAccountMap" useCache="true">
        select * from user u left join account a on u.id = a.uid
    </select>
</mapper>

注意,这里配置一对多关系的时候使用的是collection标签,property代表我们在User实体类中定义的关联集合属性名,ofType代表的是该集合内元素的类型

3.测试

/**
 * 查询所有账户,同时查询所对应的用户信息
 */
@Test
public void testFindAllAccount(){
    List<User> users = userDao.findAll();
    for(User u : users){
        System.out.println(u);
        System.out.println(u.getAccounts());
    }
}

输出结果为:

User{id=46, username='老王', birthday=Wed Mar 07 17:37:26 CST 2018, sex='男', address='北京'}
[Account{id=46, uid=46, money=1000.0}]
User{id=45, username='传智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex='男', address='北京金燕龙'}
[Account{id=45, uid=45, money=1000.0}]
User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
[Account{id=41, uid=null, money=null}]
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龙'}
[Account{id=42, uid=null, money=null}]
User{id=43, username='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex='女', address='北京金燕龙'}
[Account{id=43, uid=null, money=null}]
User{id=48, username='小马宝莉', birthday=Thu Mar 08 11:44:00 CST 2018, sex='女', address='北京修正'}
[Account{id=48, uid=null, money=null}]
User{id=51, username='xiangdong', birthday=Fri Nov 01 15:30:23 CST 2019, sex='男', address='北京市·朝阳区'}
[Account{id=51, uid=null, money=null}]
User{id=52, username='xiangdong', birthday=Sat Nov 02 21:30:44 CST 2019, sex='男', address='北京市·朝阳区'}
[Account{id=52, uid=null, money=null}]

可已看出来用户id为46、45的用户都含有账户信息。