概述
文章目录
- 一、何为延迟加载?
- 二、实现需求
- 三、使用 assocation 实现延迟加载
- 四、使用 Collection 实现延迟加载
一、何为延迟加载?
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据,延迟加载也称懒加载.
好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
二、实现需求
查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要求,当我们需要查询用户(User)信息时再查询用户(User)信息。把对用户(User)信息的按需去查询就是延迟加载。
mybatis 实现多表操作时,我们使用了resultMap来实现一对一,一对多,多对多关系的操作。主要是通过 association、 collection 实现一对一及一对多映射。 association、 collection 具备延迟加载功能
本质上都是利用对方的配置文件实现 延迟加载
三、使用 assocation 实现延迟加载
需求:查询账户信息同时查询用户信息。
//Account.java
@Data
public class Account {
private Integer id;
private Integer uid;
private Double money;
/**
* 从表实体应该包含一个主表实体的对象引用
*/
private User user;
}
//AccountDao.java
public interface AccountDao {
/**
* 查询所有账户,同时还要获取到当前账户的所属用户信息
* @return
*/
List<Account> findAll();
/**
*根据 uid 查询账户信息
* @param uid
* @return
*/
List<Account> findByUid(Integer uid);
AccountDao.xml 配置文件:
<mapper namespace="mybatis.dao.AccountDao">
<!--定义封装account和user的resultMap-->
<resultMap id="accountUserMap" type="account">
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--select:填写我们要调用的 select 映射的 ID-->
<!--column:填写传递给 select 映射的 参数-->
<association property="user" javaType="user"
select="mybatis.dao.UserDao.findById"
column="uid"
fetchType="eager">
</association>
</resultMap>
<!--查询账户信息-->
<select id="findAll" resultMap="accountUserMap">
select * from account;
</select>
<!--查询账户信息-->
<select id="findByUid" resultType="account" parameterType="int">
select * from account where uid = #{uid};
</select>
</mapper>
fetchType:当开启了全局的延迟加载之后,可通过此属性手动控制延迟加载的效果
fetchType="lazy|eager"
:lazy表示延迟加载,eager表示立即加载
SqlMapConfig.xml 怎增加了延迟配置,具体含义可参考
lazyLoadingEnabled
:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading
:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载,默认是false
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association
和
collection
中的fetchType
属性设置当前的分步查询是否使用延迟加载,
fetchType=“lazy(延迟加载)|eager(立即加载)”
通过测试用例,可以看到延迟加载策略实行了,当需要时,才会调用设置的延迟加载策略
四、使用 Collection 实现延迟加载
UserDao.xml
<mapper namespace="mybatis.dao.UserDao">
<resultMap id="userMap" type="user">
<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="mybatis.dao.AccountDao.findByUid"
column="id">
</collection>
</resultMap>
<!--提取重复的 SQL 语句-->
<sql id="defaultUser">
select * from user
</sql>
<!--查询所有-->
<select id="findAll" resultMap="userMap">
<include refid="defaultUser"></include>
</select>
<!--根据id查询-->
<select id="findById" resultType="user" parameterType="int">
<include refid="defaultUser"></include>
where id = #{uid};
</select>
</mapper>
//UserDao.java
public interface UserDao {
/**
* 查询所有操作
* @return
*/
List<User> findAll();
/**
* 根据 id 查询用户信息
* @param id
* @return
*/
List<User> findById(Integer id);
}
最后
以上就是伶俐水杯为你收集整理的【Mybatis 学习】Mybatis 延迟加载策略的全部内容,希望文章能够帮你解决【Mybatis 学习】Mybatis 延迟加载策略所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复