Mybatis中的延迟加载详细解析
目录
- 一、什么叫延迟加载、立即加载
- 二、MyBATis中的延迟加载
- 一对一延迟加载
- 一对多实现延迟加载
一、什么叫延迟加载、立即加载
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> <!javascript-- 查询所有 --> <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"></idwww.devze.com> <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(); }
只查询了用户并没有查用户下账户的信息
到此这篇关于Mybatis中的延迟加载详细解析的文章就介绍到这了,更多相关Mybatis延迟加载内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论