mybatis-复杂查询(一对多,多对一)


一、多对一(例如多个学生对应一个老师)

1、学生实体

package com.me.domain;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}

2、老师实体

package com.me.domain;

import lombok.Data;

@Data
public class Teacher {
    private int id;
    private String name;
}

方法一:嵌套查询(按查询嵌套处理)

1、 StudentMapper-getStudentList:



  
  
  

2、测试

@org.junit.Test
public void getStudentList(){
  SqlSession sqlSession = MyBatisUtils.getSqlSession();
  StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  List studentList = mapper.getStudentList();
  for (Student student : studentList) {
    System.out.println(student.toString());
  }
  sqlSession.close();
}

3、结果

 方法二、联合查询(按结果嵌套处理)

1、 StudentMapper-getStudentList2:



  
  
  
    
    
  

2、测试

@org.junit.Test
public void getStudentList2(){
  SqlSession sqlSession = MyBatisUtils.getSqlSession();
  StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  List studentList = mapper.getStudentList2();
  for (Student student : studentList) {
    System.out.println(student.toString());
  }
  sqlSession.close();
}

3、结果

 二、一对多(一个老师有多个学生)

1、学生实体

package com.me.domain;

import lombok.Data;

@Data
public class Student2 {
  private int id;
  private String name;
  private int tid;
}

2、老师实体

package com.me.domain;

import lombok.Data;

import java.util.List;

@Data
public class Teacher2 {
  private int id;
  private String name;
  private List students;
}

方法一:嵌套查询(按查询嵌套处理)

1、 TeacherMapper-getTeacher2:



  
  
  


2、测试

@org.junit.Test
public void getTeacher2(){
  SqlSession sqlSession = MyBatisUtils.getSqlSession();
  TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
  Teacher2 teacher = mapper.getTeacher2(1);
  System.out.println(teacher.toString());
  sqlSession.close();
}

3、结果

  方法二、联合查询(按结果嵌套处理)

1、 TeacherMapper-getTeacher:



  
  
  
    
    
    
  

2、测试

@org.junit.Test
public void getTeacher(){
  SqlSession sqlSession = MyBatisUtils.getSqlSession();
  TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
  Teacher2 teacher = mapper.getTeacher(1);
  System.out.println(teacher.toString());
  sqlSession.close();
}

3、结果

 三、小结

1、集合--collection【一对多】

2、关联--association【多对一】

3、javaType:用来指定实体类中属性的类型

4、ofType:用来指定映射到List或集合中的实体类型,泛型中的约束类型。

5、嵌套查询可读性强,容易理解,但是联合查询书写简便一点。