1、什么是延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
坏处 :
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降
(1)使用 assocation 实现延迟加载
这里我们使用account查询对应user用户表
AccountDao.xml配置
<!--建立对应关系-->
<resultMap id="accountMap" type="account">
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!--它是用来指定从表的引用实体属性的
select : 填写我们要调用的 select 映射的 id
column : 填写我们要传递给 select 映射的参数
-->
<association property="user" javaType="user"
select="com.shenqiang.dao.UserDao.findById" column="uid">
</association>
在SqlMapConfig.xml文件中开启延迟加载
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
最后我们在AccountTest中执行测试方法:
@Test
public void testFindAll() {
//6.执行操作
List<Account> accounts = accountDao.findAll();
for(Account au : accounts) {
System.out.println(au);
System.out.println(au.getUser());
}
}
最终运行结果如下:
(2)使用collection进行延迟加载
collection延迟加载和association加载类似我们只需要将association替换就行
UserDao.xml配置
<resultMap id="userMap" type="user">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="address" property="userAddress"/>
<result column="sex" property="userSex"/>
<result column="birthday" property="userBirthday"/>
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型
select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
column 是用于指定使用哪个字段的值作为条件查询
-->
<collection property="accounts" ofType="account"
select="com.shenqiang.dao.AccountDao.findByUid" column="id">
</collection>
</resultMap>
具体查询效果如下