延迟加载
- 延迟加载:真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)。
优点:先从单表查询,需要时再从关联表去关联查询,大大提高了数据库的性能,因为查询单表要比关联查询多张表的速度快的多。
- 立即加载:不管用不用,只要一调用方法,马上发起查询。
如何实现延迟加载
- 我们在进行多表的操作时,在配置文件中通过resultMap实现一对多、
多对一和一对一关系的操作,主要是通过association、collection
具备延迟加载功能。
一对一方式延迟加载
- 第一步:在SqlMapConfig.xml(配置文件)中配置延迟加载的全局开关,可取Mybatis官网参考配置
<!-- 开启Mybatis支持延迟加载-->
<settings>
<setting name="lazyLoadingEnabled" value="true"></setting>
<setting name="aggressiveLazyLoading" value="false"></setting><!--在3.4.1版本及其之后不用再写aggressiveLazyLoading 因为其默认值为false-->
</settings>
- 第二步:在resultMap中设置association .
<!--定义封装account和user的resultMap-->
<resultMap id="accountUserMap" type="Account">
<!--前三只能保证account的数据封装-->
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--select指定的内容,查询用户的唯一标识(namespace+id)
column属性指定的内容:用户根据id查询时,所需要的参数的值(account表的外键)-->
<association property="user" column="uid" select="com.itheima.dao.IUserDao.findById"></association>
</resultMap>
测试:
延迟加载成功!
一对多方式延迟加载
<!--配置user对象中的的accounts集合的映射-->
<collection property="accounts" ofType="com.itheima.domain.Account" select="com.itheima.dao.IAccountDao.findAccountByUid" column="id">
</collection>