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

时间:2021-01-26
本文章向大家介绍2.4.3通过mybatis实现一对一嵌套查询详解(多表),主要包括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);
        }
    }

 

 

原文地址:https://www.cnblogs.com/aloneme/p/14332677.html