ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis学习笔记【part06】延迟加载

2022-01-15 09:32:53  阅读:106  来源: 互联网

标签:collection 查询 part06 Mybatis 延迟 select 加载


Mybatis 学习笔记 Part06

1. 延迟加载策略

​ 通过前面的学习,我们已经掌握了 Mybatis 中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的账户信息。此时就是我们所说的延迟加载。

延迟加载

​ 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。

好处:

​ 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。

坏处:

​ 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。

需求:

​ 实现多表操作时,我们使用了resultMap来实现一对一,一对多,多对多关系的操作。主要是通过 association、collection 实现一对一及一对多映射。association、collection 具备延迟加载功能。

1.1 开启Mybatis延迟加载策略的xml配置

我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置。
<!-- 开启延迟加载的支持 -->
<settings> 
    <setting name="lazyLoadingEnabled" value="true"/>
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>

1.2 association 标签 实现延迟加载(一对一)

​ 我们需要在在一对多关系配置的 < association > 结点中配置延迟加载策略。
​ < association >结点中有 select 属性,column 属性。

<mapper namespace="com.itheima.dao.IAccountDao">
    <resultMap type="account" id="accountMap"> 
        <id column="aid" property="id"/>
        <result column="uid" property="uid"/>
        <result column="money" property="money"/>
		<!-- 它是用于指定从表方的引用实体属性的 --> 
        <association property="user" javaType="user" select="com.itheima.dao.IUserDao.findById" column="uid"/>
	</resultMap> 
    <select id="findAll" resultMap="accountMap">
    	select * from account
    </select>
</mapper>

select: 填写我们要调用的 select 映射的 id查找方法(findById)
column : 填写我们要传递给 select 映射的参数(id)

​ 我们可以发现,本次只是将 Account对象查询出来放入 List 集合中,并没有涉及到 User对象,所以就没有发出 SQL 语句查询账户所关联的 User 对象的查询。

1.3 collection 标签 实现延迟加载(一对多)

​ 同样我们也可以在一对多关系配置的 < collection > 结点中配置延迟加载策略。
​ < collection >结点中也有 select 属性,column 属性。

<mapper namespace="com.itheima.dao.UserDao">
    <resultMap type="user" id="userMap"> 
        <id column="id" property="id"></id> 
        <result column="username" property="username"/>
        <result column="address" property="address"/>
        <result column="sex" property="sex"/>
        <result column="birthday" property="birthday"/>
        <!-- 
		collection 是用于建立一对多中集合属性的对应关系
        		ofType 用于指定集合元素的数据类型
        		select 是用于指定查询账户的唯一标识(账户的 dao 全限定类名加上方法名称)
        		column 是用于指定使用哪个字段的值作为条件查询 
		--> 
        <collection property="accounts" ofType="account" select="com.itheima.dao.IAccountDao.findByUid" column="id"/>
    </resultMap>
    <select id="findAll" resultMap="userMap">
    	select * from user
    </select>
</mapper>


    
collection标签:
	主要用于加载关联的集合对象
select 属性:
	用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 findById 方法
column 属性:
	用于指定 select 属性的 sql 语句的参数来源(id)

标签:collection,查询,part06,Mybatis,延迟,select,加载
来源: https://blog.csdn.net/Parker_cpp/article/details/122505926

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有