暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MyBatis07:MyBatis嵌套查询

Java修炼记 2021-04-13
4524
 点击上方

 蓝字 关注我吧

预计时间

     阅读本文大概需要10分钟


什么是嵌套查询

嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一起

举个栗子


一对一嵌套查询

1. 介绍
需求:查询一个订单,与此同时查询出该订单所属的用户

一对一查询语句
-- 先查询订单 
SELECT * FROM orders; 

-- 再根据订单uid外键,查询用户 
SELECT * FROM `user` WHERE id = #{订单的uid};


2.代码实现
1OrderMapper接口
     /*
        一对一嵌套查询:
        查询所有订单,与此同时还要查询出每个订单所属的用户信息
     */


    public List<Orders> findAllWithUser2();


2OrderMapper.xml映射
    <resultMap id="orderMap2" type="com.zwt.domain.Orders">
        <id property="id" column="id"/>
        <result property="ordertime" column="ordertime"/>
        <result property="total" column="total"/>
        <result property="uid" column="uid"/>

        <!--
            根据订单中uid外键,查询用户表
            property:属性名
            javaType:属性类型
            select:子查询语句的statementId
            column: 子查询参数 所对应的列名 
         -->

        <association property="user" javaType="com.zwt.domain.User"
                     select="com.zwt.mapper.UserMapper.findById" 
                     column="uid" />

    </resultMap>

    <!--一对一嵌套查询-->
    <select id="findAllWithUser2" resultMap="orderMap2">
        SELECT * FROM orders
    </select>


3UserMapper接口
    /*
         根据id查询用户
     */

    public User findById(Integer id);


4UserMapper.xml映射
    <!--
       根据id查询用户
    -->

    <select id="findById" resultType="com.zwt.domain.User" 
            parameterType="int">

        SELECT * FROM user WHERE id = #{id}
    </select>


5)测试代码
    /*
        一对一嵌套查询:查询所有订单及关联的用户信息
    */

    @Test
    public void test4() throws IOException {

        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);

        List<Orders> allWithUser2 = mapper.findAllWithUser2();

        for (Orders orders : allWithUser2) {
            System.out.println(orders);
        }

        sqlSession.close();
    }


一对多嵌套查询

1. 介绍
需求:查询所有用户,与此同时查询出该用户具有的订单

一对多查询语句
-- 先查询用户 
SELECT * FROM `user`


-- 再根据用户id主键,查询订单列表 
SELECT * FROM orders where uid = #{用户id};


2.代码实现
aUserMapper接口
    /*
        一对多嵌套查询:
        查询所有的用户,同时还要查询出每个用户所关联的订单信息
     */

    public List<User> findAllWithOrder2();


bUserMapper.xml映射
 <!-- 一对多嵌套查询:
      查询所有的用户,同时还要查询出每个用户所关联的订单信息 -->


    <resultMap id="userOrderMap" type="com.zwt.domain.User">
        <id property="id" column="id"/>
        <result property="username" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>

        <!--根据用户id,查询订单表-->
        <collection property="ordersList" ofType="com.zwt.domain.Orders" 
             column="id" select="com.zwt.mapper.OrderMapper.findByUid" >

        </collection>

    </resultMap>

    <select id="findAllWithOrder2" resultMap="userOrderMap">
        SELECT * FROM USER
    </select>


cOrderMapper接口
    /*
        根据uid查询对应订单
     */

    public List<Orders> findByUid(Integer uid);


dOrderMapper.xml映射
    <select id="findByUid" parameterType="int" 
       resultType="com.zwt.domain.Orders">

        SELECT * FROM orders WHERE uid = #{uid}
    </select>


e)测试代码
    /*
       一对多嵌套查询:查询所有用户及关联的订单信息
   */

    @Test
    public void test5() throws IOException {

        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        List<User> allWithOrder2 = mapper.findAllWithOrder2();

        for (User user : allWithOrder2) {
            System.out.println(user);
        }

        sqlSession.close();
    }


多对多嵌套查询

1. 介绍
需求:查询用户 同时查询出该用户的所有角色

多对多查询语句
-- 先查询用户 
SELECT * FROM `user`

-- 再根据用户id主键,查询角色列表 
SELECT * FROM role r 
INNER JOIN user_role ur ON r.`id` = ur.`rid`
WHERE ur.`uid` = #{用户id};


2.代码实现
aUserMapper接口
    /*
        多对多嵌套查询:查询所有的用户,同时还要查询出每个用户所关联的角色信息
     */

    public List<User> findAllWithRole2();


bUserMapper.xml映射
    <resultMap id="userRoleMap2" type="com.zwt.domain.User">
        <id property="id" column="id"/>
        <result property="username" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>

        <!--根据用户id,查询角色列表-->
        <collection property="roleList" ofType="com.lagou.domain.Role" 
             column="id" select="com.zwt.mapper.RoleMapper.findByUid">

        </collection>

    </resultMap>

    <!--
        多对多嵌套查询:
        查询所有的用户,同时还要查询出每个用户所关联的角色信息
    -->

    <select id="findAllWithRole2" resultMap="userRoleMap2">
        SELECT * FROM USER
    </select>


cRoleMapper接口
    /*
        根据用户id查询对应角色
     */

    public List<Role>  findByUid(Integer uid);


dRoleMapper.xml映射
    <select id="findByUid" resultType="com.zwt.domain.Role" 
            parameterType="int">

        SELECT * FROM sys_role r 
        INNER JOIN sys_user_role ur ON ur.roleid = r.id
        WHERE ur.userid = #{uid}
    </select>


e)测试代码
   /*
      多对多嵌套查询:查询所有用户及关联的角色信息
    */

    @Test
    public void test6() throws IOException {

        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        List<User> allWithRole2 = mapper.findAllWithRole2();

        for (User user : allWithRole2) {
            System.out.println(user);
        }

        sqlSession.close();

    }


小结



长按二维码

识别关注

共同成长





文章转载自Java修炼记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论