Mybatis延迟加载

注意:以下内容建立在你学会mybatis的基本配置以及熟悉了多对一,一对多关联关系的查询的前提下,前面的不懂,先去看前面的笔记。

 一.什么是延迟加载:

  • ResultMap中的assosiation和collection标签具有延迟加载的功能
  • 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。
  • 需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载。

  • 多对一延迟加载:

  • 在主配置文件mybatis-config.xml文件当中配置settings:可以去mybatis中文网当中的配置里面去找

 
        
        
    

ClassMapper.xmlwen文件:


    
        
        
    

    

StudentMapper.xml文件:

注意,使用延迟加载时,我们就没有直接把association写成上一篇多对一案例那样,而是写了一个查询语句,对应到关联关系的查询,以前只要配置好了,写一条SQL,但是在这里,我们是将查询学生和查询班级分成两条SQL,然后通过延迟加载,先查主信息学生,等到需要的时候,再发一条SQL去查班级信息。


    
        
        
        
        
    

    
  • junit测试

使用了延迟加载之后,先加载主要信息,关联信息并没有直接加载出来:

Mybatis延迟加载_第1张图片

 

当你需要加载关联信息时,通过延迟加载,即可加载出来:

Mybatis延迟加载_第2张图片

 Mybatis延迟加载_第3张图片

 一对多延迟加载:

Mybatis延迟加载_第4张图片Mybatis延迟加载_第5张图片

ClassMapper.xml文件:,注意collection里面和以前配置的不一样,要想延迟加载成功,那么发送SQL就需要分两段来查询,分别写在各自的xml文件里面,然后在resultMap里面设置关联关系时,加入另一个SQL的“地址: select="com.pro.dao.StudentDao.selectStus"/>”


    
        
        
        
    
    

 StudentMapper.xml文件的SQL:

    
  • 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,java,数据库)