一、什么叫延迟加载、立即加载
1.什么是延迟加载
在真正需要使用数据时才发起查询,不用的时候不进行查询。按需加载(懒加载)
2. 什么是立即加载
不管用不用,只要一调用方法,马上发起查询。
二、Mybatis中的延迟加载
需求:
在一对多中,当我们有一个用户,它有10个角色。
在查询用户时,用户下的角色信息应该是,什么时候使用,什么时候查询的。
在查询角色时,账户的所属用户信息应该是随着账户查询时一起查询出来。
在对应的四种表关系中:
一对多,多对一,一对一,多对多
一 对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
一对一延迟加载:
例:以用户和账户关系为例,查询一个账户时显示当前账户的所属用户
查询方法
1.dao层接口
public interface IAccountDao {
/**
* 查询所有账户,同时还要获取到当前账户的所属用户信息
* @return
*/
List<Account> findAll();
}
2.映射文件:
<resultMap id="accountUserMap" type="account">
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!-- 一对一的关系映射:配置封装user的内容
select属性制定的内容:查询用户的唯一标识
column属性指定的内容:用户根据id时,所需要的参数值的值-->
<association property="user" column="uid" javaType="user" select="com.rpf.dao.IUserDao.findById"></association>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="accountUserMap">
select * from account
</select>
3.Mybatis主配置文件配置开启懒加载
<!--加入settings-->
<settings>
<!--开启Mybatis支持延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
4.测试
@Test
public void testFindAll(){
List<Account> accounts = accountDao.findAll();
}
效果图
没开启延迟加载之前执行了三条
开启了延迟加载后 执行了一条语句
一对多实现延迟加载:
1. dao层接口
List findAll();
2.映射文件
//user
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!-- 配置user对象中accounts集合的映射 -->
<collection property="accounts" ofType="account" select="com.rpf.dao.AccountDao.findAccountByUid" column="id"></collection>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userAccountMap">
select * from user
</select>
<!-- 根据id查询用户 -->
<select id="findById" parameterType="INT" resultType="user">
select * from user where id = #{uid}
</select>
<!-- 根据用户id查询账户列表 account -->
<select id="findAccountByUid" resultType="account">
select * from account where uid=#{uid}
</select>
3.测试类:
@Test
public void testFindAll(){
List<User> users = userDao.findAll();
}
只查询了用户并没有查用户下账户的信息