1. LazyLoad 的做用:java
在数据与对象进行 mapping 操做时,只有在真正使用到 该对象时,才进行 mapping 操做,以减小数据库查询开销,从而提高系统性能。
sql
可是Lazy Load也有缺点,在 按需加载时会屡次链接数据库,同时会增长数据库的压力。因此在实际使用时,会衡量是否使用 延迟加载。
数据库
2. 实现:mybatis
1)在 sqlMapConfig.xml 文件中配置 Lazy Load 的开关。
app
<settings> <!-- 开启全局性设置懒加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 开启按需加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
2)在 sqlMapper.xml 映射文件中中配置sql映射,这里是一对一查询<association>,也可用在 <collection>中
性能
<!-- 订单及用户信息, Lazy Load --> <resultMap id="orderAndUser" type="mybatis_b.model.Order"> <!-- id 这里表示结果集的惟一主键,虽然出现重复的orderDetail,可是属于同一个orderId --> <id property="orderId" column="orderId"/> <result property="user_id" column="user_id"/> <result property="orderNumber" column="orderNumber"/> <!-- 延迟加载,经过 findUserById 来查询User 信息, column="user_id" 是上面查询出来的userid,做为parameterType传入到 findUserById 方法 --> <association property="user" javaType="mybatis_b.model.User" select="findUserById" column="user_id"> <!-- 这里能够使用延迟加载来查询User信息,经过 findUserById <id property="userId" column="userId"/> <result property="username" column="username"/> <result property="sex" column="sex"/> <result property="birthday" column="birthday"/> <result property="address" column="address"/> <result property="detail" column="detail"/> <result property="score" column="score"/> --> </association> </resultMap> <!-- user 查询 --> <select id="findUserById" parameterType="int" resultType="user"> select * from users where userId = #{user_id} </select> <select id="findOrderAndUser_lazyLoad" resultMap="orderAndUser"> select * from orders </select>
3)定义 mapper 接口,并调用接口方法
spa
//延迟加载 @Test public void testFindOrderAndUser_lazyLoad() throws Exception { //获取SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //指定 mapper 接口的类型,MyBatis经过动态代理的方式实现mapper接口 OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> list = orderMapper.findOrderAndUser_lazyLoad(); System.out.println(list.size()); //Iterator<Order> iterator = list.iterator(); //while (iterator.hasNext()) { //Order order = (Order) iterator.next(); //System.out.println(order.getUser()); //} }
执行结果:代理
若是去掉上面代码注释的部分,那么就调用了getUser()的方法,mybatis 会自动调用 findUserById() 去获取 User信息。结果以下:
code
若是关闭了 Lazy Load,那么结果是这样的:xml