Mybatis 多表查询之 一对一(多对一)查询

一对一查询(多对一)


需求:查询所有账户信息,关联查询下单用户信息。

1.账户信息实体类(方法一)

//get 和 set 方法省略,toString省略,自己补
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
}

2.编写SQL语句

SELECT account.id,uid,money,username,address
FROM account JOIN USER ON (user.`id`= account.`UID`)

在这里插入图片描述

3.定义 AccountUser 类

为了能够封装上面 SQL 语句的查询结果,定义 AccountCustomer 类中要包含账户信息同时还要包含用户信息,所以我们要在定义 AccountUser 类时可以继承 User 类。

//get 和 set 方法省略,toString省略,自己补
public class AccountUser extends Account{
    private String username;
    private String address;
}

4.定义账户的持久层 Dao 接口

public interface IAccountDao {
    /**
     * 查询所有账户,并且带有名字和地址
     * @return
     */
    List<AccountUser> findAllAccount();
}

5.编写 AccountDao.xml 映射文件中的查询配置信息

注意:返回值类型 returnType的值设置为 AccountUser 类型

    <!--查询所有账户,并且带有名字和地址-->
    <select id="findAllAccount" resultType="AccountUser">
        SELECT account.id,uid,money,username,address FROM account JOIN USER ON (user.`id`= account.`UID`)
    </select>

定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。此方法较为简单,企业中使用普遍。


方法二:使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。通过面向对象的(has a)关系可以得知,我们可以在 Account 类中加入一个 User 类的对象来代表这个账户是哪个用户的。

1.账户信息实体类(增加User对象)(方法二)

//get 和 set 方法省略,toString省略,自己补
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    
	private User user;
}

2.修改定义账户的持久层 Dao 接口

public interface IAccountDao {
    /**
     * 查询所有账户,并且带有名字和地址
     * @return
     */
    List<Account> findAllAccount();
}

3.编写 AccountDao.xml 映射文件中的查询配置信息

    <!--定义Account和User的resultMap-->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一的关系映射,配置封装user的内容-->
        <association property="user" column="uid" javaType="user">
            <result property="id" column="id"></result>
            <result property="username" column="username"></result>
            <result property="birthday" column="birthday"></result>
            <result property="sex" column="sex"></result>
            <result property="address" column="address"></result>
        </association>
    </resultMap>

    <!--配置查询所有-->
    <select id="findAll" resultMap="accountUserMap">
        SELECT account.id AS aid,uid,money,user.* FROM account JOIN USER ON (user.`id`= account.`UID`)
    </select>

SQL的结果:
在这里插入图片描述

4.测试

    @Test  //配置查询所有账户
    public void testFindAll(){
        List<Account> accountList = accountDao.findAll();
        for (Account account : accountList){
            System.out.println(account);
            System.out.println(account.getUser());
        }
    }

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值