延迟加载:
在真正使用数据时才发起查询,不用的时候不查询,按需加载。(懒加载)
举例:一个用户关联100个账户,查询用户时,是否需要把关联的账户信息全部查询出来?
立即加载:
举例:查询账户时,需要用到用户信息,则需要立即把关联的用户信息一起查询出来
只要以调用方法,立即发起查询
在对应的四种表关系中:
一对多,多对多:通常采用延迟加载
一对一,多对一:通常采用立即加载
实现延迟加载:
举例:IAcountDao.xml:实现查询账户时对用户信息的延迟加载(正常情形下不使用)
<!-- 定义封装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>
<!-- 一对一的关系映射:配置封装user的内容
select属性指定的内容:查询用户的唯一标识:
column属性指定的内容:用户根据id查询时,所需要的参数的值
-->
<association property="user" column="uid" javaType="user" select="com.itheima.dao.IUserDao.findById"></association>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="accountUserMap">
select * from account
</select>
<!-- 根据用户id查询账户列表 -->
<select id="findAccountByUid" resultType="account">
select * from account where uid = #{uid}
</select>
IUserDao.xml实现查询用户时对多个账户信息的延迟加载
<!-- 定义User的resultMap-->
<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.itheima.dao.IAccountDao.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>
association标签对account类中的要延迟加载的User属性进行配置。
值得注意的是:Sql查询语句不再直接对两个表进行查询,而是仅对当前表查询,对相关表的查询则通过相关表映射文件里面的对应sql语句实现。
比如用户查询所有操作,会通过IUserDao中的findAll()先把用户表中的信息查询出来,然后在调用IAccountDao类的findAccountByUid()方法查询账户信息
主配置文件:
<!--配置参数-->
<settings>
<!--开启Mybatis支持延迟加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"></setting>
</settings>
缓存:
存在于内存中的临时数据,目的是减少和数据库的交互次数,提高执行效率。适用于经常查询且不经常改变的数据,另外应保证数据的正确与否对最终的结果影响不大。
Mybatis的一级缓存与二级缓存:
一级缓存:SqlSession对象的缓存。(无须配置)
当执行查询操作后,查询结果存入到SqlSession提供的Map结构的一块区域。当再次查询同样数据时,Mybatis会先去SqlSession查询是否有,有则直接用。当调用修改,添加,删除或关闭SqlSession对象时,缓存清空。另外还可以主动调用clearcache()方法。
二级缓存:SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
使用步骤:
1) 让Mybatis框架支持二级缓存(主配置文件)默认为true,可不配置
<settings>
<setting name="cacheEnabled" value="true"/>
<settings>
2)让当前的映射文件支持二级缓存(映射文件)
<!--开启user支持二级缓存-->
<cache/>
3)让当前操作支持二级缓存(在select 标签中)
<!--useCache标签-->
<select id="findAll" resultType="com.mbtest.domain.User" useCache="true">
select * from userinfo
</select>