• Mybatis多表查询 一对一关系
  • Mybatis多表查询 一对多关系
  • Mybatis多表查询 多对多关系
  • 前述
    • 基础知识是mysql的多表查询,要熟练。
    • 多表查询就是一次查询涉及多个表;inner join left join right
    • 结果有一对一关系,一对多关系,多对多关系
    • 我们在封装数据时,定义好的类无法直接封装(类字段,集合字段等),需要通过配置封装

实操

  • 一对一关系,1个order 对应 1个user , 封装user 类中order
  1. <resultMap id="orderMap" type="order">
  2. <!--手动指定字段和实体属性的关系
  3. column:数据表的字段名称
  4. property:Java 类(实体)中的字段名称-->
  5. <id column="id" property="id"></id><!--id 主健标识-->
  6. <result column="ordertime" property="ordertime"></result>
  7. <result column="total" property="total"/>
  8. <result column="uid" property="user.id"/>
  9. <result column="username" property="user.username"/>
  10. <result column="password" property="user.password"/>
  11. <result column="birthday" property="user.birthday"/>
  12. </resultMap>
  13. <select id="findAll" resultMap="orderMap">
  14. select * from orders o,user u where o.uid=u.id
  15. </select>


- 一对多关系,1个user 对应 多个 order, 封装 user 类中的 List<order>
   - select * ,o.id oid from user u left join orders o on u.id = o.uid
   - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22442214/1635261146543-583e5293-845b-49cd-bcfe-b7cdf146960d.png#clientId=u70650cf7-4f69-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=52&id=u407318c6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=103&originWidth=584&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9354&status=done&style=none&taskId=u508d4845-8855-4fe2-bb20-cb2af822771&title=&width=292)

- 多对多关系,1个user 可能有 多个 role, 1 个role可能有多个 user  封装 user 类中的 List<role>
   - select u.*,r.*,r.id rid from user u  left join sys_user_role ur  on u.id = ur.userid  left join sys_role r on ur.roleid = r.id
   - ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22442214/1635261228261-0ee9d40a-18c4-4be9-923a-a9a27085098b.png#clientId=u70650cf7-4f69-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=87&id=uec1938c2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=174&originWidth=667&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14983&status=done&style=none&taskId=u9f65d11f-c4ab-487d-a8ec-8d15cbb9d10&title=&width=333.5)
```java
<?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">
<mapper namespace="com.jquan.mapper.UserMapper">

    <resultMap id="userMap" type="user"> <!--首先是user  u表left join o表-->
       <id column="uid" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="birthday" property="birthday"/>

        <!-- 1对多的关系: 配置集合信息
            property:集合名称,和User类中的orderList字段名称对应
            ofType: 当前集合中的数据类型
        -->
        <collection property="orderList" ofType="order">
            <!--封装order数据-->
            <id column="oid" property="id"/>
            <result column="ordertime" property="ordertime"/>
            <result column="total" property="total"/>
        </collection>

    </resultMap>

    <select id="findAll" resultMap="userMap">
        select * ,o.id oid from user u left join orders o on u.id = o.uid
    </select>


    <resultMap id="userRoleMap" type="user">
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="birthday" property="birthday"/>
        <collection property="roleList" ofType="role">
            <id column="rid" property="id"/>
            <result column="rolename" property="roleName"/>
            <result column="roleDesc" property="roleDesc"/>
        </collection>

    </resultMap>
    <select id="findUserAndRoleAll" resultMap="userRoleMap">
        select u.*,r.*,r.id rid from user u  left join sys_user_role ur  on u.id = ur.userid  left join sys_role r on ur.roleid = r.id
    </select>

</mapper>