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]