Mybatis的延迟加载

本文介绍了MyBatis中懒加载机制的原理及其配置方法,包括如何通过设置全局配置参数来启用懒加载,以及如何在具体的SQL映射文件中配置一对一时的延迟加载。此外,还提供了测试代码示例。

1.延迟加载的作用

在数据与对象进行mapping操作时,只有真正使用到给对象时,才进行mapping操作,以减少数据库查询开销,从而提升系统升级

但是懒加载也有缺点,  在按需加载时会多次连接数据库,同时会增加数据库的压力。所以在实际使用时,要衡量是否使用延迟加载

2.实现:     

(1) 在SqlMapConfig.xml 文件中配置懒加载开关

<!-- 全局配置参数 -->
<settings>
<!-- 开启延迟加载  -->
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />

<!-- 打开二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>

2)在SqlMapping.xml文件中配置sql映射,这里配置的是一对一查询<association> 注:也可以在<collection>

<!-- 订单及用户的resultMap,实现延迟加载 -->
<resultMap type="orders" id="ordersResultMap">
<!-- 配置订单信息的映射 -->
<id column="id" property="id" />
<result column="user_id" property="user_id" />
<result column="order_number" property="order_number" />
<!-- 配置延迟加载 用户信息
select:延迟加载 时调用 的statement,如果跨命名空间,需要加上namespace 
column:将哪一列的值作为参数 传到延迟加载 的statement -->
<association property="user" javaType="cn.itcast.mybatis.po.User"
select="findUserById" column="user_id">
</association>
</resultMap>


<!-- 订单信息查询,使用延迟加载  -->
<select id="findOrdersList" resultMap="ordersResultMap">
select * from orders
</select>

<!--根据用户来查询用户名信息-->
<select id="findUserById" resultType="int">
select username from user where id=#{id}
</select>

3)定义mapper 接口,并调用接口方法

// 测试延迟加载
@Test
public void testfindOrdersList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapperCustom ordersMapperCustom = sqlSession
.getMapper(OrdersMapperCustom.class);
List<Orders> list = ordersMapperCustom.findOrdersList();
for (Orders orders : list) {
int order_id = orders.getId();// 取订单id
User user = orders.getUser();// 查询用户信息
}


}

4)测试结果

查询订单信息,日志发现只能有一条sql(查询订单信息)

DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1911476135.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@71eecfa7]
DEBUG [main] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@71eecfa7]
DEBUG [main] - ==>  Preparing: select * from orders 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 2

当调用getUser()方法,日志中打出查询用户信息的sql

DEBUG [main] - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@71eecfa7]
DEBUG [main] - ==>  Preparing: select * from user where id=? 
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1
User [id=2, username=火蓝, sex=null, birthday=Tue Apr 12 00:00:00 CST 2016, address=null, detail=null, score=null]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值