延迟加载:就是按照我们的需求去加载sql获取请求数据。例如在关联表进行查询时,为了减轻数据库的压力,我们先执行一张表的查询获取数据看看能否满足当前应用,如果不满足再去关联查询。mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
我们先进行oa_topic表的查询,在需要的时候再去加载关联to_forum的查询
(mapper.xml)
<!--一================================================延迟加载===============================================================-->
<!--查询发帖标题关联所属的分类的resultMap
将整个查询结果映射到com.mybatis.po.Topic中-->
<resultMap type="com.mybatis.po.Topic" id="topicToForumResultMapLazyLoading" >
<!--配置要映射的发帖标题信息-->
<!--id:指定查询列中的唯一的标识,发帖标题信息的唯一标识,如果有多个列组成唯一标识,那么需要配置多个id-->
<!--column:唯一标识的列-->
<!--property:要映射到的com.mybatis.po.Topic中的哪一个属性-->
<id column="id" property="id"/>
<!--需要多少个result映射就写多少个-->
<result column="title" property="title"/>
<result column="content" property="content"/>
<!--配置要映射关联的所属分类的信息-->
<!--association:用于映射关联查询单个对象的查询信息-->
<!--property:要将关联查询的信息关联到com.mybatis.po.Topic的哪个属性-->
<!--javaType: 属性的类型-->
<association property="forum" javaType="com.mybatis.po.Forum" select="findForumResultMapLazyLoading" column="forumId">
<!--实现分类的延迟加载-->
<!--select:指定延迟加载需要执行的statement的id(是根据forunId来查询分类信息的statement)-->
<!--column:发帖信息中关联分类信息的列-->
<!--关联查询的sql:SELECT oa_topic.*,oa_forum.name,oa_forum.description FROM oa_topic,oa_forum-->
<!--WHERE oa_topic.forumId = oa_forum.id-->
</association>
</resultMap>
<!--查询发帖标题关联所属的分类,使用延迟加载-->
<select id="findTopicToForumResultMapLazyLoading" resultMap="topicToForumResultMapLazyLoading">
SELECT * FROM oa_topic
</select>
<select id="findForumResultMapLazyLoading" parameterType="int" resultType="com.mybatis.po.Forum">
SELECT * FROM oa_forum WHERE id =#{id}
</select>
(SqlMapConfig.xml)
<!--全局配置参数 :二级缓存,延迟加载-->
<settings>
<!--打开延迟加载的开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将积极加载改为消极加载,即按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
(mapper.java)
// 查询发帖标题关联所属的分类,使用延迟加载
public List<Topic> findTopicToForumResultMapLazyLoading() throws Exception;
(测试类)
@Test
public void findTopicToForumByIdResultMapLazyLoadingTest() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
TopicToForumMapper topicToForumMapper=sqlSession.getMapper(TopicToForumMapper.class);
List<Topic> topicList= topicToForumMapper.findTopicToForumResultMapLazyLoading();
for(Topic topic :topicList){
//执行getForum()去执行查询分类信息,这里就是按需加载,也就是懒加载
Forum forum=topic.getForum();
System.out.println("懒加载:"+forum.getName());
}
sqlSession.close();
}