Mybatis框架(五)-- 多表查询

Mybatis框架(一)-- 快速入门
Mybatis框架(二)-- 原理解析
Mybatis框架(三)-- 详细配置参数
Mybatis框架(四)-- 其他配置
Mybatis框架(五)-- 多表查询
Mybatis框架(六)-- 延迟加载
Mybatis框架(七)-- 缓存
Mybatis框架(八)-- 注解开发

Mybatis中的多表查询

  • 表之间的关系有几种:
    一对多
    多对一
    一对一
    多对多

  • 举例:

      用户和订单就是一对多
      订单和用户就是多对一
      	一个用户可以下多个订单
      	多个订单属于同一个用户
    
      人和身份证号就是一对一
      	一个人只能有一个身份证号
      	一个身份证号只能属于一个人
    
      老师和学生之间就是多对多
      	一个学生可以被多个老师教过
      	一个老师可以交多个学生
    

    特例:
    如果拿出每一个订单,他都只能属于一个用户。
    所以Mybatis就把多对一看成了一对一。

解决方法:

  1. 定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。
  2. 使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。(重点介绍)

一对一

一对一在关系表中表现为从表含有主表的外键,在Java类中表现为从表含有主表的引用。用于封装的关键标签为association

下例为,将查询信息封装到AccountUser类中的配置方式。AccountUser中含有一个User类的引用。

<mapper namespace="com.yy.dao.IAccountDao">
    <resultMap id="accountUserMap" type="accountUser">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        
        <association property="user"  javaType="User"> 配置accountUser中User对象的数据封装
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="address" column="address"></result>
            <result property="sex" column="sex"></result>
            <result property="birthday" column="birthday"></result>
        </association>
    </resultMap>
   	<select id="getOne2One"  resultMap="accountUserMap">
           SELECT  u.* ,a.id aid,a.uid,a.MONEY FROM  user u,account a WHERE u.id = a.UID
    </select>
</mapper>

association简化:

<mapper namespace="com.yy.dao.IAccountDao">
    <resultMap id="accountUserMap" type="accountUser">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        
        <association property="user"  在accountUser类中成员变量user
        javaType="User" 				user,类型为User
        column="uid"  此处column是外键,指示Mybatis把uid作为外键与user的主键关联
        select="com.yy.dao.IUserDao.findByID">
        </association>
         
    </resultMap>

   <select id="getOne2One"  resultMap="accountUserMap">
           SELECT  * from  account
    </select>
</mapper>

一对多

一对多在关系表中表现为多个从表都含有主表的外键,在Java类中表现为主表含有多个从表的引用集合的引用。用于封装的关键标签为collection

下例为,将查询信息封装到user类中的配置方式。user中含有一个AccountUser类的List的引用。

<mapper namespace="com.yy.dao.IUserDao">
       <resultMap id="UserAccountMap" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <result column="sex" property="sex"></result>
        <result column="birthday" property="birthday"></result>
        <collection property="accounts" ofType="AccountUser">
            <id column="aid" property="id"></id>
            <result column="money" property="money"></result>
        </collection>
       </resultMap>
       <select id="findAll" resultMap="UserAccountMap">
                SELECT u.*,a.id as aid,a.MONEY  
                FROM user u left OUTER JOIN account a 
                on u.id = a.uid
       </select>
</mapper>

查询一个User的多个Account时,表中会有重复,但Mybatis会为我们自动封装
在这里插入图片描述

在这里插入图片描述

多对多

多对多在关系表中使用中间表来表示,中间表同时包含两个表的主键,在Java类中表现为各自包含对方一个集合引用。

实质时两个一对多关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值