1.使用场景
实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的账户信息。此时就是我们所说的延迟加载。
2.何为延迟加载
前面实现多表操作时,我们使用了resultMap来实现一对一,一对多,多对多关系的操作。主要是通过association、collection实现一对一及一对多映射。association、collection具备延迟加载功能。
3.使用Assocation实现延迟加载
第一步:只查询账户信息的Mapper接口
SQL:select * from account;
List<Account> queryAccountList();
第二步:AccountMapper.xml映射文件
<select id="queryAccountList" resultMap="accountLazyLoadUserResultMap">
select * from account
</select>
其中上面resultMap属性的值accountLazyLoadUserResultMap,它是我们自定义的resultMap,具体如下:
<resultMap id="accountLazyLoadUserResultMap" type="account">
<!--账户信息-->
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!--用户信息-->
<!--
select:指定延迟加载要执行的statement的id(是根据uid查询用户信息的statement)
要使用UserMapper.xml中getUserById完成根据用户id(uid)对用户信息的查询,如果
getUserById不在本Mapper中,需要前面加namespace
column:延迟加载查询传入的参数(用户所关联账户信息的外键字段名uid)
-->
<association property="user" javaType="User" select="com.itheima.mybatis.mapper.UserMapper .getUserById
" column="uid">
</association>
</resultMap>
select: 填写我们要调用的 select 映射的 id
column : 填写我们要传递给 select 映射的参数
第三步:UserMapper接口及UserMapper.xml映射文件
修改项目中的UserMapper接口,添加一个根据用户id查询用户对象的方法。
User getUserById(int id);
在UserMapper.xml映射文件中添加映射。
<select id="getUserById" parameterType="int" resultType="user">
select * from user where id=#{id}
</select>
第四步:开启Mybatis的延迟加载策略
进入Mybaits的官方文档,找到settings的说明信息:
我们需要在Mybatis的配置文件SqlMapConfig.xml文件中添加延迟加载的配置。
第四步:编写测试只查账户信息不查用户信息
注意:只打印account账户的money字段信息
第五步:测试加载账户信息同时加载用户信息
4.使用Collection实现延迟加载
同样我们也可以在一对多关系配置的结点中配置延迟加载策略。
结点中也有select属性,column属性。
第一步:在User实体类中加入List属性
private List<Account> accountList;
第二步:UserMapper接口及AccountMapper接口
在UserMapper接口中添加查询所有用户信息的方法
List<User> queryUserList();
在AccountMapper接口中添加一个根据用户id查询账户列表的方法
List<Account> getAccountsByUid (int uid);
第三步:UserMapper.xml 配置文件
<select id="queryUserList" resultMap="userLazyloadAccountsResultMap">
SELECT * FROM USER
</select>
<resultMap id="userLazyloadAccountsResultMap" type="user">
<!--用户信息-->
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="address" property="address"/>
<!--账户信息-->
<collection property="accountList" ofType="account" select="com.itheima.mybatis.mapper.UserMapper.getAccountsByUid" column="id">
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
</collection>
</resultMap>
标签主要用于加载关联的集合对象
select属性用于指定查询account列表的sql语句,所以填写的是该sql映射的id
column属性用于指定select属性的sql语句的参数来源,上面的参数来自于user的id列,所以就写成id这一个字段名了
第四步:AccountMapper.xml映射文件
UserMapper.xml映射文件中的标签的select属性的值就是来自这个文件的的id的值。
<select id="getAccountsByUid" parameterType="int" resultType="account"
>
select * from account where uid=#{uid}
</select>
第五步:开启Mybatis的延迟加载
在Mybatis的配置文件SqlMapConfig.xml中添加延迟加载的配置
第六步:测试只加载用户信息
第七步:测试加载用户信息同时还加载账户列表