视频地址:http://edu.51cto.com/sd/be679
在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,resultType不具有延迟加载的功能。
所谓的延迟加载就是:你需要的时候再去查,比如:你先查询订单表的全部记录,有需要的时候在去查订单详情表的记录,你有需要的时候再去拿,总比你一次性取出来来的好。可以提高数据库的性能。延迟加载需要配置大概分为以下几步。
1.在全局配置中开启延迟加载
<settings> <!-- 开启全局性设置懒加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 开启按需加载 --> <setting name="aggressiveLazyLoading" value="false"/> </settings>
2.在resultMap定义延迟加载
<resultMap type="com.etc.entity.Orders" id="lazyResultMap">
<!-- 配置要映射的订单信息 -->
<id column="oid" property="oid" />
<result column="uid" property="uid" />
<result column="phone" property="phone" />
<result column="address" property="address" />
<!--
select:指定延迟加载的要执行的statement的id
column:关联信息的列名
-->
<association property="orderDetail" javaType="com.etc.entity.OrderDetail"
select="findById" column="oid"></association>
</resultMap>
3.延迟加载的select语句
<select id="findAll" resultMap="lazyResultMap"> select * from orders </select> <!--根据ID查询详情表--> <select id="findById" parameterType="int" resultType="com.etc.entity.OrderDetail"> select * from orderdetail where oid=#{oid} </select>
4.测试延迟加载
@Test public void lazy() throws IOException{ //mybatis的配置文件 String resource="mybatis-config.xml"; //得到配置文件流 InputStream inputStream= Resources.getResourceAsStream(resource); //创建会话工厂,需要传入Mybatis的配置文件信息 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到SqlSession SqlSession session=sessionFactory.openSession(); //第一个参数:映射文件中的statement的id:命名空间+id //第二个参数:就是指定和映射文件中匹配的参数 UsersMapper usersMapper= session.getMapper(UsersMapper.class); //1.只调用到findAll方法时候 List<Orders>orders=usersMapper.findAll(); for (Orders orders2 : orders) { System.out.println(orders2); } //2.查找全部后通过orders去取订单详情信息的时候 List<OrderDetail> orderDetails=orders.get(0).getOrderDetail(); for (OrderDetail orderDetail : orderDetails) { System.out.println(orderDetail); } } }
分析结果理解延迟加载:
1.只调用到findAll方法的时候运行结果(只发起了一次的查询语句)
2.查找全部后通过orders去取订单详情信息的时候(发起了两次查询语句)
这里注意看,第一次测试的时候没有去取orderDetail数据的时候,只查询了一次。
第二次测试的时候有去取orderDetail数据的时候,就查询了两次。
这里说明你有需要的时候才去查询,没有需要的时候就不查询,所以这个就是延迟加载
(测试的时候分两次测试,如果不分开的话,第二次查询会走缓存,下面介绍一级缓存和二级缓存)