延迟加载
加载时机
侵入式延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访
问主加载对象的详情属性时,就会马上执行关联对象的select查询。。
深度延迟:执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详 情时,才会执行对关联对象的select 查询。
注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的
select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一-张表的查询。会一次性将多张表的所有信息查询出来。。
侵入式延迟
先到大配置文件(mybatis_config.xml)开启延迟加载
<setting name="lazyLoadingEnabled" value="true"/>
<!--侵入式aggressiveLazyLoadingd的value为true 深入式aggressiveLazyLoading的value为false-->
<setting name="aggressiveLazyLoading" value="true"/>
在调用主加载对像时不会加载第二条sql
调用加载对象时会产生两条sql
深度延迟
先到大配置文件(mybatis_config.xml)开启深度加载
<setting name="lazyLoadingEnabled" value="true"/>
<!--侵入式aggressiveLazyLoadingd的value为true 深入式aggressiveLazyLoading的value为false-->
<setting name="aggressiveLazyLoading" value="false"/>
在调用主加载对像时不会加载第二条sql
缓存说明
为什么要用缓存?
1.提升应用程序性能
2.提高读取吞吐
3.降低数据库成量(IOPS)本
4.消除数据库热减少后端负载点
一级缓存说明
同一会话中(sqlsession)执行两个相同的sql,控制台会找上一条sql查询出来的缓存进行查找
City citytoChild = sqlSession.getMapper(ISsmbms_CityDao.class).getCitytoChild(1);
System.out.println(citytoChild.toString());
City citytoChild2 = sqlSession.getMapper(ISsmbms_CityDao.class).getCitytoChild(1);
System.out.println(citytoChild2.toString());
在citytoChild2对象查询的时候不会在查询一次sql会在缓存里面进行查找
增删改会清空缓存
City citytoChild = sqlSession.getMapper(ISsmbms_CityDao.class).getCitytoChild(1);
System.out.println(citytoChild.toString());
int i = sqlSession.getMapper(ISsmbms_CityDao.class).delRoleAll(8);
sqlSession.commit();
City citytoChild2 = sqlSession.getMapper(ISsmbms_CityDao.class).getCitytoChild(1);
System.out.println(citytoChild2.toString());
/*一级缓存在增删改,无论是否提交事务,缓存都会被清空,重新执行数据库查询
二级缓存在增删改的情况下,如果提交则会清空缓存,如果不提交则会获取数据库缓存*/
关闭刷新缓存(关闭后不会在执行缓存)
flushCache属性默认为true,开启刷新缓存,将lushCache属性设置为true关闭刷新缓存
<delete id="delRoleAll" flushCache="false">
DELETE FROM city where cid=#{cid}
</delete>
查询不应用缓存
useCache属性默认为true,应用缓存,将useCache属性设置为true不应用缓存
<select id="getCitytoChildof" resultMap="proMap" useCache="false">
select * from city WHERE pid=#{cid}
</select>