【MyBatis】高级映射多对一,一对多和延迟加载

数据库准备:

【MyBatis】高级映射多对一,一对多和延迟加载_第1张图片
【MyBatis】高级映射多对一,一对多和延迟加载_第2张图片

1. 多对一:

多个学生对应一个班级(学生表是主表, 班级表是副表)

多种实现方式, 常见的包括三种

  1. 第一种方式: 一条sql语句, 级联属性映射

// StudentMapper.xml
// 一条sql语句, 级联属性映射

    
    
    
    




// 接口
public interface StudentMapper{
    // 根据id获取学生信息, 同时获取学生关联的班级信息
    // 返回一个学生对象, 但是学生对象当中含有班级对象
    Student selectById(Integer id);
} 

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(StudentMapper.class);

    Student student = mapper.selectById(6);
    System.out.println(student);
    sqlSession.close();
}
  1. 第二种方式: 一条sql语句, association标签

// StudentMapper.xml
// 一条sql语句, association(关联)

    
    
    
    // association翻译为关联, 一个Student对象关联一个Clazz对象
    // property: 提供要映射的POJO类的属性名
    // javaType: 用来指定要映射的java类型
    
        
        
    
    




// 接口
public interface StudentMapper{
    // 根据id获取学生信息, 同时获取学生关联的班级信息
    // 返回一个学生对象, 但是学生对象当中含有班级对象
    // 使用association
    Student selectByIdAssociation(Integer id);
} 

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(StudentMapper.class);

    Student student = mapper.selectByIdAssociation(6);
    System.out.println(student);
    sqlSession.close();
}
  1. 第三种方式: 俩条sql语句, 分布查询(这种方式常用: 优点可复用,支持懒加载)

// StudentMapper.xml
// 一条sql语句, association(关联)

    
    
    
	// 会将column传给select这条sql语句
    



-------------------------------------------------------------------------------------
// ClazzMapper.xml

-------------------------------------------------------------------------------------

// 接口
public interface StudentMapper{
	// 分布查询第一步, 先根据id查询出学生信息
    Student selectByIdStep1(Integer id);
} 
public interface ClazzMapper{
	// 分布查询第二步, 根据cid获取班级信息
	Clazz selectByIdStep2(Integer cid);
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(StudentMapper.class);

    Student student = mapper.selectByIdStep1(6);
    System.out.println(student);
    sqlSession.close();
}

2. 延迟加载:

  • 分布查询的好处:

  • 复用性强, 可以重复使用, 大步拆成多个小碎步, 每一个小碎步更加可以重复利用.

  • 可以充分利用他妈的延迟加载/懒加载机制

  • 什么是延迟加载(懒加载), 有什么用?

  • 延迟加载的核心原理是: 用的时候再执行查询语句, 不用的时候不查询.

  • 作用: 提高性能

  • 在mybatis中怎么开启延迟加载?

  • 默认情况下是没有开启懒加载的

  • association标签中添加fetchType="lazy"

  • 这种在association标签中配置fetchType="lazy"是局部的设置, 只对当前的association关联的sql语句起作用


    
    
    
    


// 如果只需要查看学生的名字
//		那么就不会使用到ClazzMapper.selectByIdStep2语句
// 如果想看班级的名字
//		那么就会执行ClazzMapper.selectByIdStep2语句了
    

3. 一对多:

一个班级对应多个学生(班级表是主表, 学生表是副表)

一对多的实现, 通常是在一的一方中有List集合属性

【MyBatis】高级映射多对一,一对多和延迟加载_第3张图片

一对多的实现通常包括俩种实现方式:

  1. collection

// ClazzMapper.xml

    
    
    
    // 一对多, 这里的collection是集合的意思
    // ofType属性用来指定集合当中的元素类型
	
    	
    	
	
    

    


// 接口
public interface ClazzMapper{
	// 根据班级编号查询班级信息
	Clazz selectByCollection(Integer cid);
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(StudentMapper.class);

    Clazz clazz = mapper.selectByCollection(6);
    System.out.println(clazz);
    sqlSession.close();
}
  1. 分布查询(常用)

// StudentMapper.xml

-------------------------------------------------------------------------------------
// ClazzMapper.xml

    
    
    
	// 会将column传给select这条sql语句
    



-------------------------------------------------------------------------------------

// 接口
public interface StudentMapper{
	// 分布查询第二步, 先根据班级编号查询出学生信息
    List selectByCidStep2(Integer id);
} 
public interface ClazzMapper{
	// 分布查询第一步, 根据班级编号获取班级信息
	Clazz selectByIdStep1(Integer cid);
}

// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    CarMapper mapper = sqlSession.getMapper(StudentMapper.class);

    Clazz clazz = mapper.selectByIdStep1(6);
    System.out.println(clazz);
    sqlSession.close();
}

你可能感兴趣的:(MyBatis,mybatis,java,数据库)