• 2.4.3通过mybatis实现一对一嵌套查询详解(多表)


    需求:查询一个订单,与此同时查询该订单所属于的用户(一个订单对应一个用户)

    代码详解

    查询SQL语句:

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

    orderMapper接口:在OrderMapper接口中增加 findAllWithUserNested()方法,

        /**
         * 一对一嵌套查询:查询所有订单,并查出每个订单的用户信息(一对一信息)
         */
        public List<Orders> findAllWithUserNested();

    OrderMapper.xml映射 :

    <resultMap id="OrderMapperNested" type="com.lagou.domain.Orders">
            <id property="id" column="id"></id>
            <result property="ordertime" column="ordertime"></result>
            <result property="total" column="total"></result>
            <result property="uid" column="uid"></result>
    
            <!--通过第一条SQL的订单查询结果,取其中的uid,执行第二条SQL语句,到User表中去查询该uid对应的用户信息-->
            <!--问题:1.怎么去执行第二条SQL;2.执行第二条SQL时,如何把uid作为参数进行传递-->
            <!--
                select:告诉程序去执行第二条SQL,内容就是SQL的存放位置,用namespace.id表示(需要执行的SQL存放位置,(com.lagou.mapper.UserMapper).(findById))
                column:需要传递的参数名称,也就是第一条SQL中查出来的结果中的uid,对应要传给第二条SQL,通过uid去查询该订单对应的用户信息
            -->
            <association property="user" javaType="com.lagou.domain.User" select="com.lagou.mapper.UserMapper.findById" column="uid">
    
            </association>
        </resultMap>
    
        <!--一对一嵌套查询:查询所有订单,并查出每个订单的用户信息(一对一信息)-->
        <select id="findAllWithUserNested" resultMap="OrderMapperNested">
            SELECT * FROM orders
        </select>

    UserMapper接口

        /**
         * 一对一嵌套查询第二条SQL执行:根据第一条的SQL,取uid参数,在user表中查询该订单对应的用户信息
         */
        public User findById(int id);

    UserMapper.xml映射

       <!--一对一嵌套查询第二条SQL执行:根据第一条的SQL,取uid参数,在user表中查询该订单对应的用户信息-->
        <!--此处因为根据id查询的结果是一个User对象,所以可以用resultType自动封装,而不用resultMap手动封装,内容也就是User实体的全路径-->
        <select id="findById" resultType="com.lagou.domain.User" parameterType="int">
            <!--#{}中表示传递过来的参数,在这里也就是uid。parameterType表示的传递参数的类型,基本数据类型可以用映射名表示,其他类型用全路径名(/**/不能注释,会报错)-->
            SELECT * FROM user WHERE id = #{uid}
        </select>

    测试代码

      /**
         * 一对一嵌套查询:查询所有订单,并查出每个订单的用户信息(一对一信息)
         */
        @Test
        public void test4() throws IOException {
            InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = build.openSession();
    
            OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
            List<Orders> orders = mapper.findAllWithUserNested();
            for (Orders order : orders) {
                System.out.println(order);
            }
        }

    知识点总结

     

     

  • 相关阅读:
    ORACLE创建、修改、删除序列
    mysql添加索引
    Mysql事物与Metadata lock 问题
    oracle 查询最近执行过的 SQL语句
    ORACLE 常用SQL查询
    ssh-keygen的用法
    sql之left join、right join、inner join的区别
    Linux下使用 ipset 封大量IP及ipset参数说明
    今天学习的小命令
    Linux下查看分区内目录及文件占用空间容量
  • 原文地址:https://www.cnblogs.com/aloneme/p/14332677.html
Copyright © 2020-2023  润新知