概述
注意:以下内容建立在你学会mybatis的基本配置以及熟悉了多对一,一对多关联关系的查询的前提下,前面的不懂,先去看前面的笔记。
一.什么是延迟加载:
- ResultMap中的assosiation和collection标签具有延迟加载的功能
- 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。
- 需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载。
-
多对一延迟加载:
- 在主配置文件mybatis-config.xml文件当中配置settings:可以去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>
StudentMapper.xml文件的SQL:
<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查询成功"); } }
最后
以上就是美丽路人为你收集整理的Mybatis延迟加载的全部内容,希望文章能够帮你解决Mybatis延迟加载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复