MyBatis(8)延迟加载

延迟加载概念

数据库的延迟加载是指当真正需要数据的时候,才执行数据的加载操作。这样可以避免数据库一些无谓的性能开销。

需求

数据库见《MyBatis(7) MyBatis高级映射》

查询订单信息,关联查询用户信息。其中,用户信息需要延迟加载。

设计

设置延迟加载

MyBatis默认的延迟加载是关闭的。需要在mybatis的配置文件中打开延迟加载。

<settings>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false" />
</settings>

SQL语句

首先查询订单信息,在订单信息的基础上查询用户信息。

SELECT
    test . purchase . *,
    (SELECT name FROM test.user WHERE test.purchase.uid = test.user.id) username,
    (SELECT sex FROM test.user WHERE test.purchase.uid = test.user.id) sex
FROM
    test.purchase;

POJO

订单POJO以及用户POJO

public class UserPojo {
    private int id;
    private String name;
    private String pass;
    private Date birthday;
    private int sex;
    private String address;

    //getter & setter
}

public class OrderPojo {
    private int id;
    private int uid;
    private String number;
    private Date createtime;
    private String note;
    private UserPojo user;

    //getter & setter
}

映射文件

  1. 用户映射文件
<mapper namespace="indi.latch.mybatis.dao.UserDao">
    <select id="selectUserByID" parameterType="int" resultType="indi.latch.mybatis.pojo.UserPojo">
        SELECT * FROM test.user
        <where>
            id = #{id}
        </where>
    </select>
</mapper>
  1. 订单映射文件
<resultMap id="OrderUserLazyLoadingMap" type="indi.latch.mybatis.pojo.OrderPojo">
    <id column="id" property="id"></id>
    <result column="uid" property="uid"></result>
    <result column="number" property="number"></result>
    <result column="note" property="note"></result>

    <association property="user" javaType="indi.latch.mybatis.pojo.UserPojo" select="indi.latch.mybatis.dao.UserDao.selectUserByID" column="uid">
    </association>
</resultMap>
<select id="selectOrderUserLazyLoading" resultMap="OrderUserLazyLoadingMap">
    SELECT
      purchase.id, purchase.uid, purchase.number, purchase.note
    FROM
      test.purchase;
</select>

接口

  1. 用户接口
public interface UserDao {
    public UserPojo selectUserByID (int id);
}
  1. 订单接口
public interface OrderDao {
    public List<OrderPojo> selectOrderUserLazyLoading () throws Exception;
}

测试

@Test
public void selectOrderUsersLazyLoading () throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    OrderDao orderDao = sqlSession.getMapper(OrderDao.class);
    List<OrderPojo> orders = orderDao.selectOrderUserLazyLoading();

    //此时加载对应的用户信息
    for (OrderPojo order : orders) {
        UserPojo user = order.getUser();
        System.out.println(user.toString());
    }

    sqlSession.close();
}

代码

  1. git@code.csdn.net:xl890727/mybatisdemo.git
  2. https://code.csdn.net/xl890727/mybatisdemo.git
    中的lazyloading分支
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值