注意:以下内容建立在你学会mybatis的基本配置以及熟悉了多对一,一对多关联关系的查询的前提下,前面的不懂,先去看前面的笔记。
一.什么是延迟加载:
- ResultMap中的assosiation和collection标签具有延迟加载的功能
- 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。
- 需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
ClassMapper.xmlwen文件:
<mapper namespace="com.pro.dao.ClassDao">
<resultMap id="classMap" type="classes">
<id property="classId" column="classId"/>
<result property="className" column="className"/>
</resultMap>
<select id="selectClass" parameterType="int" resultMap="classMap">
select *from classes where classId=#{classId}
</select>
</mapper>
StudentMapper.xml文件:
注意,使用延迟加载时,我们就没有直接把association写成上一篇多对一案例那样,而是写了一个查询语句,对应到关联关系的查询,以前只要配置好了,写一条sql,但是在这里,我们是将查询学生和查询班级分成两条sql,然后通过延迟加载,先查主信息学生,等到需要的时候,再发一条sql去查班级信息。
<mapper namespace="com.pro.dao.StudentDao">
<resultMap id="stuMap" type="student">
<id property="stuId" column="stuId"/>
<result property="stuName" column="stuName"/>
<result property="age" column="age"/>
<association property="cs" javaType="Classes" column="classId"
select="com.pro.dao.ClassDao.selectClass"/>
</resultMap>
<select id="selectStu" resultMap="stuMap" parameterType="int">
select * from student where stuId=#{stuId}
</select>
</mapper>
-
junit测试
使用了延迟加载之后,先加载主要信息,关联信息并没有直接加载出来:
当你需要加载关联信息时,通过延迟加载,即可加载出来:
一对多延迟加载:
ClassMapper.xml文件:,注意collection里面和以前配置的不一样,要想延迟加载成功,那么发送sql就需要分两段来查询,分别写在各自的xml文件里面,然后在resultMap里面设置关联关系时,加入另一个sql的“地址: select="com.pro.dao.StudentDao.selectStus"/>”
<mapper namespace="com.pro.dao.ClassDao">
<resultMap id="classMap" type="classes">
<id property="classId" column="classId"/>
<result property="className" column="className"/>
<collection property="stuList" ofType="student" column="classId"
select="com.pro.dao.StudentDao.selectStus"/>
</resultMap>
<select id="selectClass" parameterType="int" resultMap="classMap">
select * from classes where classId=#{classId}
</select>
</mapper>
<select id="selectStus" resultType="Student" parameterType="int">
select * from student where classId=#{classId}
</select>
-
junit测试
- 因为学生集合是班级的属性,所以如果你要打印班级,那就会发送两条sql
-
public class ClassDaoTest { @Test public void selectClass() throws IOException { InputStream inputStream = Resources.getResourceAsstream("mybatis-config.xml"); sqlSessionFactory sessionFactory = new sqlSessionFactoryBuilder().build(inputStream); sqlSession sqlSession = sessionFactory.openSession(); ClassDao classDao = sqlSession.getMapper(ClassDao.class); Classes classes = classDao.selectClass(1); //因为学生集合是班级的属性,下面我们没有打印班级,那么由于延迟加载,只会发送一条sql System.out.println("classes查询成功"); //因为学生集合是班级的属性,所以如果你要打印班级,那就会发送两条sql System.out.println(classes+"classes查询成功"); } }