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>
<!-- 查询所有 -->
<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();
}只查询了用户并没有查用户下账户的信息

到此这篇关于Mybatis中的延迟加载详细解析的文章就介绍到这了,更多相关Mybatis延迟加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中CountDownLatch进行多线程同步详解及实例代码
这篇文章主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下2017-03-03
java通过Idea远程一键部署springboot到Docker详解
这篇文章主要介绍了java通过Idea远程一键部署springboot到Docker详解,Idea是Java开发利器,springboot是Java生态中最流行的微服务框架,docker是时下最火的容器技术,那么它们结合在一起会产生什么化学反应呢?的相关资料2019-06-06
使用springboot防止反编译proguard+xjar
介绍了三种代码混淆和加密工具的使用方法:ProGuard、Xjar和ClassFinal,ProGuard用于混淆Java字节码,Xjar提供对JAR包内资源的加密和动态解密,而ClassFinal则支持直接加密JAR包或WAR包,通过预研和实际操作2024-11-11


最新评论