一对一,多对一的延迟加载:
Account对应的User对象在查询时先不加载,等用到了再进行加载
首先在主配置文件里要设置两个选项
<!--配置参数--> <settings> <!--开启mybatis支持延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <!--关闭调用任意方法立即加载,每个属性按需加载--> <setting name="aggressiveLazyLoading" value="false"/> </settings>
配置IAccountDao.xml
<!--用于延迟加载的map--> <resultMap id="accountUserLazyMap" type="com.itheima.domain.Account"> <id property="id" column="aid"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> <!--select属性指定的内容:查询用户的唯一标识,即根据column对应列提供的值作为参数,调用select指定的方法去查询 ,column:User根据id查询时,所需要的id的值--> <association property="user" column="uid" javaType="com.itheima.domain.User" select="com.itheima.dao.IUserDao.findById"> </association> </resultMap>
同时,sql语句里不要涉及有关user表的列名,不然也会进行加载
一对多,多对多的延迟加载:每次加载User对象,其包含的Account集合进行懒加载
在IUserDao.xml里进行配置:
<!--一对多查询Account并延迟加载的map--> <resultMap id="userAccountLazyMap" type="com.itheima.domain.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集合的映射,ofType:集合中元素的类型--> <collection property="accounts" ofType="com.itheima.domain.Account" column="id" select="com.itheima.dao.IAccountDao.findAccountByUid"> </collection> </resultMap> <!--配置查询所有--> <select id="findAll" resultMap="userAccountLazyMap"> select * from user </select>
collection中,select调用一个方法
com.itheima.dao.IAccountDao.findAccountByUid
以User.id为参数,寻找所有相关联的account,那么就到IAccountDao.xml里配置一下
<!--根据User的id查询Account集合--> <select id="findAccountByUid" parameterType="int" resultType="com.itheima.domain.Account"> select * from account where uid = #{uid} </select>
现在User就可以进行一对多的懒加载了
缓存机制
一级缓存是session默认开启的,使用无需配置
要使用二级缓存首先要在主配置文件里开启二级缓存
<!--配置参数--> <settings> <!--开启mybatis支持延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <!--关闭调用任意方法立即加载,每个属性按需加载--> <setting name="aggressiveLazyLoading" value="false"/> <!--设置二级缓存--> <setting name="cacheEnabled" value="true"/> </settings>
在IUserDao.xml里也要配置
<!--开启user支持二级缓存--> <cache/>
使用缓存
/* * 测试缓存 * 一级缓存是session自带的,在session进行增删改,commit,close之后消失 * 二级缓存是同一个SqlSessionFactory创建的所有session共享缓存 * 但里面存的是数据(散装数据),不是对象 * */ @Test public void testCache(){ SqlSession session1 = factory.openSession(); IUserDao dao1 = session1.getMapper(IUserDao.class); User user1 = dao1.findById(41); System.out.println(user1); session1.close();//一级缓存消失 SqlSession session2 = factory.openSession(); IUserDao dao2 = session2.getMapper(IUserDao.class); User user2 = dao2.findById(41); System.out.println(user2); session2.close(); System.out.println(user1==user2); }