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查询成功");
        }
    }

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...