Mybatis延迟加载

注意:以下内容建立在你学会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查询成功");
        }
    }

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...