延迟加载就是当真正需要数据的时候,才真正执行数据加载操作。

一对一(OrdersMapper.xml)

<mapper namespace="com.company.mapper.OrdersMapper">
    <select id="queryOrdersUser" resultMap="ordersUserResultMap">
        select * from orders as a
        left join userinfo as b
        on a.user_id=b.userid
    </select>

    <resultMap id="ordersUserResultMap" type="com.company.pojo.Orders">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createTime"/>
        <result column="remark" property="remark"/>
        <association property="user" javaType="com.company.pojo.User">
            <id column="userid" property="id"/>
            <result column="username" property="name"/>
            <result column="usersex" property="sex"/>
            <result column="userage" property="age"/>
            <result column="useraddress" property="address"/>
        </association>
    </resultMap>
</mapper>

一对多(UserMapper.xml)

<mapper namespace="com.company.mapper.UserMapper">
    <select id="queryUserOrders" resultMap="userOrdersResultMap">
        select * from userinfo as a
        left join orders as b
        on a.userid=b.user_id
    </select>

    <resultMap id="userOrdersResultMap" type="com.company.pojo.User">
        <id column="userid" property="id"/>
        <result column="username" property="name"/>
        <result column="usersex" property="sex"/>
        <result column="userage" property="age"/>
        <result column="useraddress" property="address"/>
        <collection property="ordersList" ofType="com.company.pojo.Orders">
            <id column="id" property="id"/>
            <result column="user_id" property="userId"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createTime"/>
            <result column="remark" property="remark"/>
        </collection>
    </resultMap>
</mapper>

开启延迟加载

SqlMapConfig.xml (configuration标签内)

    <settings>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--关闭立即加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--设定toString等方法延迟加载-->
        <setting name="lazyLoadTriggerMethods" value="true"/>
    </settings>

一对一(OrdersMapper.xml)

拆分sql

select * from orders

select * from userinfo where userid=#{id}

处理之后的OrdersMapper.xml

<mapper namespace="com.company.mapper.OrdersMapper">
    <select id="queryOrdersUser" resultMap="ordersUserResultMap">
       select * from orders
    </select>

    <resultMap id="ordersUserResultMap" type="com.company.pojo.Orders">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createTime"/>
        <result column="remark" property="remark"/>
        <!--
            column:表示第一个sql执行之后的结果中,作为第二个sql语句的参数列
            select:拆分的第二个sql
        -->
        <association property="user" javaType="com.company.pojo.User" column="user_id"
                     select="com.company.mapper.UserMapper.queryUserById">
        </association>
    </resultMap>
</mapper>

测试

    @Test
    public void queryOrdersUser(){
        OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
        List<Orders> ordersList = ordersMapper.queryOrdersUser();
        for (Orders orders : ordersList) {
            System.out.println(orders.getUser().getName());
        }
        sqlSession.close();
    }

一对多(UserMapper.xml)

拆分sql

select * from userinfo

select * from orders where user_id=#{id}

处理之后的UserMapper.xml

    <select id="queryUserOrders" resultMap="userOrdersResultMap">
        select * from userinfo
    </select>

    <resultMap id="userOrdersResultMap" type="com.company.pojo.User">
        <id column="userid" property="id"/>
        <result column="username" property="name"/>
        <result column="usersex" property="sex"/>
        <result column="userage" property="age"/>
        <result column="useraddress" property="address"/>
        <!--
            column:表示第一个sql执行之后的结果中,作为第二个sql语句的参数列
            select:拆分的第二个sql的id标识
        -->
        <collection property="ordersList" ofType="com.company.pojo.Orders" column="userid" select="queryOrdersByUserId">
        </collection>
    </resultMap>

    <select id="queryOrdersByUserId" parameterType="int" resultMap="ordersResultMap">
        select * from orders where user_id=#{id}
    </select>
    <resultMap id="ordersResultMap" type="com.company.pojo.Orders">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createTime"/>
        <result column="remark" property="remark"/>
    </resultMap>

测试

    @Test
    public void queryUserOrders(){
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.queryUserOrders();
        //userList.forEach(System.out::println);
        for (User user : userList) {
            List<Orders> ordersList = user.getOrdersList();
            ordersList.forEach(System.out::println);
        }
        sqlSession.close();
    }

 

 posted on 2019-08-13 21:24  会飞的金鱼  阅读(126)  评论(0)    收藏  举报