Mybatis的延迟加载

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]

你可能感兴趣的:(Mybatis的延迟加载)