概述
下面我们讲延迟加载 也叫 懒加载。
延迟加载:resultMap 的数据以 树状结构 为主,当我们用到分支数据的时候再查下,反之则,不查询,这样可以节省数据库资源。
那么我在上一个demo的基础做一点小改进:
1、首先在 mybatis-config.xml 中添加设置:
<configuration>
<settings><!-- -->
<!-- 懒加载设置为 true -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 积极加载设置为false -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2、修改 Mapper 映射文件 OrderDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zll.mybatis.dao.OrderDaoLazy">
<resultMap type="com.zll.mybatis.bean.Orders" id="findOrderDetailMap">
<id column="id" property="id" />
<result column="createTime" property="createTime" />
<result column="userId" property="userId" />
<association property="user" javaType="com.zll.mybatis.bean.User"
column="id" select="findUser" />
<collection property="orderItems" ofType="com.zll.mybatis.bean.OrderItem"
column="id" select="findOrdersItem" />
</resultMap>
<select id="findOrderDetailLazy" resultMap="findOrderDetailMap">
select * from orders
</select>
<select id="findUser" parameterType="int" resultType="com.zll.mybatis.bean.User">
select *
from user where id = #{id}
</select>
<select id="findOrdersItem" parameterType="int" resultType="com.zll.mybatis.bean.OrderItem">
select * from orderItem where orderId = #{id}
</select>
</mapper>
注意:由于是懒加载是分开查询,所以我们的每个select 映射也需要分开写。
这里需要注意的就是 association 和 collection 标签中的 column 和select属性
select: 填写 我们要调用的 select 映射的 id
column : 填写 我们要传递给 select 映射的 参数。
测试代码:
/**
* Unit test for simple App.
*/
public class AppTest extends TestCase {
public void selectOrder() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
OrderDaoLazy mapper = session.getMapper(OrderDaoLazy.class);
List<Orders> orders = mapper.findOrderDetailLazy();
for(int i=0; i<orders.size(); i++){
System.out.println(orders.get(i).toString());
}
session.close();
}
}
注意:由于我们的Order类中的 toString方法 读取了User 和 OrderItem对象,出发了懒加载,所以你会看到控制台打印了3次 select 语句,当我们调用数据时才会查询数据库。(如果想进步测试,可以将 Order 类中的toString,方法去掉,然后分别调用getUser 和 getOrderItems 方法,通过断点方式去查看)
最后
以上就是平常长颈鹿为你收集整理的MyBatis 延迟加载 (懒加载)的全部内容,希望文章能够帮你解决MyBatis 延迟加载 (懒加载)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复