延迟加载简介
在一对多中,我们有一个用户,它有100个账户
在查询用户的时候,要不要把关联的账户查出来?
在查询账户的时候,要不要把关联的用户查处理来?
在查询用户时,用户下的账户信息应该是什么时候使用,什么时候查处理来!
在查询账户时,账户所属的用户信息,应该一起查询出来。
什么是延迟加载?
在真正使用数据时才发起查询,不用的时候不查询,按需加载(懒加载)
什么是立即加载
不管用不用,只要一调用方法,就查询处理啊
在对应的四种表关系中: 一对多、多对一、一对一、多对多
延迟加载:一对多,多对多
立即加载:多对一,一对一
一对一实现延迟加载
先定义根据ID查询用户
User findById(Integer id);
<select id="findById" resultType="com.kcl.pojo.User" parameterType="int">
select * from user where id = #{id}
</select>
定义查询账户,同时关联用户
List<Account> findAll();
<resultMap id="accountUserMap" type="com.kcl.pojo.Account">
<id property="id" column="id"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--
select:查询用户的唯一标志
column: 懒加载必须写,表示用户根据id查询时,所需要的参数值
-->
<association property="user" column="uid" javaType="com.kcl.pojo.User" select="com.kcl.dao.UserDao.findById"></association>
</resultMap>
<select id="findAll" resultMap="accountUserMap">
select * from account
</select>
在mybatisConfig.xml进行配置
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<!--开启时,任何加载的调用都会加载该对象的所有属性,否则,每个属性都会按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
一对多
类似于一对一的方法
缓存介绍
- 什么是缓存?
- 存在内存中的数据
- 为什么使用缓存?
- 减少和数据库的交互次数,提高执行效率
- 什么样的数据使用缓存,什么数据不能使用?
- 经常查询且不经常改变的,数据的正确与否对结果不大的,适用于缓存
- 经常改变的数据,数据的正确性对结果影响很大不使用缓存,比如商品的库存,银行的汇率等
一级缓存
- 它指的是mybatis中SQLSession对象的缓存
- 当我们执行查询之后,查询的结果会同时存储SQLSession为我们提供的一块区域中
- 该区域的结构是一个Map
- 当我们再次查询同样的数据,mybatis会先去SQLSession中查询是否存在,如果有就拿出来
- 当SQLSession对象消失时,mybatis的一级缓存就消失了
- 当调用SQLSession的update、add、delete、commit(),cloes()等方法时,就会清空一级缓存!!!!!
二级缓存
- 它指的是mybatis中SQLSessionFactory对象的缓存。
- 由同一个SQLSessionFactory创建的SQLSession共享其缓存
使用步骤:
- 让mybatis框架支持二级缓存,在mybatisConfig.xml配置
- 让当前的映射文件中支持二级缓存, 在UesrDao.xml配置
- 让当前操作支持二级缓存,在select标签中配置
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<!--开启时,任何加载的调用都会加载该对象的所有属性,否则,每个属性都会按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<!--开启user支持二级缓存-->
<cache/>
<select id="findById" useCache="true" resultType="com.kcl.pojo.User" parameterType="int" >
select * from user where id = #{id}
</select>
二级缓存中存放的是数据,而不是对象!
不同的SQLSession查询时,查询出来的对象不是同一个,但是从二级缓存中拿出来的,让一个SQLSession.close,然后查询第二个SQLSession