Mybatis 延迟加载策略
延迟加载:
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
好处:
先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 度要快。
坏处:
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降。
在对应的四种表关系中:一对多,多对一,一对一,多对多
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
使用 assocation 实现延迟加载
需求:
查询账户(Account)信息并且关联查询用户(User)信息。如果先查询账户(Account)信息即可满足要求,当我们需要查询用户(User)信息时再查询用户(User)信息。
用户(User)信息按需查询
账户的持久层映射文件 :
在association标签中
select 填写要调用的select映射的ID
column 填写要传递给select映射的参数
<mapper namespace="com.mkl.dao.IAccountDao">
<!--定义封装account和user的resultMap-->
<resultMap id="accountUserMap" type="account">
<id column="id" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
<!--一对一的关系映射, 配置封装User的内容-->
<!--<association property="user" javaType="user">-->
<!--<id column="id" property="id"></id>-->
<!--<result column="username" property="username"></result>-->
<!--<result column="sex" property="sex"></result>-->
<!--<result column="birthday" property="birthday"></result>-->
<!--<result column="address" property="address"></result>-->
<!--</association>-->
<association property="user" javaType="user" select="com.mkl.dao.IUserDao.findUserById" column="uid"></association>
<!--select 填写要调用的select映射的ID
column 填写要传递给select映射的参数
-->
</resultMap>
<!-- 查询所有账户信息-->
<select id="findAll" resultMap="accountUserMap">
select *
from account
</select>
</mapper>
用户的持久层映射文件中添加
<!-- 根据id查询用户 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{uid}
</select>
开启 Mybatis 的延迟加载策略 :
在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延迟加载的配置

<!-- 开启延迟加载的支持 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>

使用 Collection 实现延迟加载
需求:
加载用户对象时,按需查询该用户所拥有的账户信息。
编写用户持久层映射配置 :
<mapper namespace="com.mkl.dao.IUserDao">
<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"/>
<!--封装该用户下的账户信息到List-->
<!--collection是用于建立一对多中集合属性的对应关系, ofType用于指定集合元素的数据类型-->
<!--<collection property="accounts" ofType="account">-->
<!--<id column="aid" property="id"/>-->
<!--<result column="uid" property="uid"/>-->
<!--<result column="money" property="money"/>-->
<!--</collection>-->
<collection property="accounts" ofType="account" select="com.mkl.dao.IAccountDao.findByUid" column="id"></collection>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userMap">
SELECT *
FROM USER
</select>
<!-- 根据id查询用户 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{uid}
</select>
</mapper>
select 属性:
用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id
column 属性:
用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所以就写成 id 这一 个字段名了
在账户持久层映射配置文件中添加:
<!-- 根据用户 id 查询账户信息 -->
<select id="findByUid" resultType="account" parameterType="int">
select * from account where uid = #{uid}
</select>

Mybatis 延迟加载策略的更多相关文章
- 【MyBatis】MyBatis 延迟加载策略
MyBatis 延迟加载策略 文章源码 什么是延迟加载 延迟加载,就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据,也被成为懒加载. 好处:先从单表查询,需要时再从关联表去关联查询,大大提 ...
- Mybatis缓存及延迟加载策略
一:引言 通过前面几篇的文章介绍了Mybatis的一对一.一对多.多对多关系的配置及实现,可是大家发现了吗?在执行关联查询的时候,直接会把当前查询的主表里包含的副表也查询后封装到对象里,其实在实际开发 ...
- mybatis延迟加载一对多
1.实体类 package cn.bdqn.bean; import java.util.Set; /** *国家的实体类 */ public class Country { private Inte ...
- MyBatis延迟加载和缓存
一.延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载. 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主 ...
- mybatis延迟加载(assocation)
一.何为延迟加载? 延迟加载 我们并不需要总是在加载用户信息时就一定要加载他的账户信息.此时就是我们所说的延迟加载. 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. ...
- Hibernnate延迟加载策略(这么详细你还看不懂)
好久没有认真写过博客了,今天就好好的写一篇吧!!!!!!!!! 当Hibernate 从数据库中加载某个对象(例如:Dept对象)时,如果同时自动加载所有的关联的某个对象(例如:Emp对象),而程序实 ...
- mybatis源代码分析:mybatis延迟加载机制改进
在上一篇博客<mybatis源代码分析:深入了解mybatis延迟加载机制>讲诉了mybatis延迟加载的具体机制及实现原理. 可以看出,如果查询结果对象中有一个属性是需要延迟加载的,那整 ...
- mybatis源代码分析:深入了解mybatis延迟加载机制
下文从mybatis(3.2.7)延迟加载样例讲起,逐步深入其实现机制. 下面的例子是Student类关联一个Teacher对象,在访问Student对象时,不立即加载其关联的Teacher对象,而是 ...
- Hibernate延迟加载策略
所谓懒加载(lazy)就是延时加载,就是当在真正需要数据的时候,才真正执行数据加载操作 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量, ...
随机推荐
- Patator-一款很好用的爆破工具
项目地址:https://github.com/lanjelot/patator 打开文件夹 运行一下文件查看帮助 python patator.py --help 这里有很多的爆破选项,就不一一截图 ...
- EXT.net 窗体传值
ext.net 窗体传值 EXT.net 窗体传值 子窗体代码 protected void btnClose_Click(object sender,EventArges e) { PageCont ...
- 关于python3 发送邮件
一:发送文本信息 from email.mime.text import MIMEText from email.header import Header from smtplib import SM ...
- Android独立交叉编译环境搭建
我们经常需将一些C/C++源码编译成本地二进制,直接在android的linux内核上运行,这是就需要进行交叉编译.由于Android的运行环境核普通Linux又区别,所以常规方式针对ARM进行交叉编 ...
- 使用avalon实现SKU组合查询功能
SKU(stock keeping unit库存量单位)组合查询是网上商场一个非常常用的功能.具体来说,一件商品会有许多型号,许多颜色,许多产地,许多码寸,而满足用户选中的这些条件的具体商品可能有库存 ...
- 移植OK6410'S dm9000ae…
转载自:http://lagignition.blog.163.com/blog/static/12873002320110443341961/
- cuteFTP软件往linux中上传文件时报…
我是在win7和VM中的ubuntu传输文件: 使用一个客户端,可以正常的连接,但是当上传文件时,总是报553 Could not create file错误信息. 主要原因是新建的文件夹没有更改权限 ...
- Markdown使用简单示例(每一个使用对应一个实际的markdown语法)
1.标题示例:通过"#"数量表示几级标题.(一共只有1~6级标题,1级标题字体最大) 标题一 #标题一 标题二 #标题二 标题三 ###标题三 标题四 ####标题四 标题五 ## ...
- codeforce453DIV2——D. GCD of Polynomials
题意 给出n(1–150). 输出两个多项式A,B从常数到最高次的系数,使得对两个多项式求gcd时,恰好经过n步得到结果. 多项式的gcd一步是指(A(x),B(x))变成(B,A mod B)的过程 ...
- 645. Set Mismatch挑出不匹配的元素和应该真正存在的元素
[抄题]: he set S originally contains numbers from 1 to n. But unfortunately, due to the data error, on ...