定义
什么是一对多和多对一呢?
很简单,比如说学生和老师,一个老师对应多个学生,这就是一对多;反过来,多个学生对应一个老师,这就是多对一。这涉及到了两张表的连表查询。
需要用到的知识点
- 无论是一对多还是多对一,总会遇到复杂的属性,对于这些复杂的属性,我们需要单独出来。如果属性是一个对象:
association
,如果对象是一个集合:collection
- 不管是一对多还是多对一,都有两种方法进行查询处理:
按照查询嵌套处理、按照结果嵌套处理
,我们这里主推按照结果嵌套处理
,比较简单 - 按照结果嵌套处理思想:直接写出sql,使用结果集映射处理sql。
示例
以上面的例子为例,这里只讲和一对一不一样的地方
一对多(查询老师id为1的老师信息和他的所有学生的信息)
- 我们先创建数据库mybatis,在数据库mybatis中创建两张表,Studnt表和Teacher表。
Student表:
Teacher表:
- 为了偷懒,在pom.xml文件配置lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
- 创建Student和Teacher的实体类
哪个是一,就修改哪个实体类的个别属性,比如这里Teacher类的private List<Student> students;属性
package com.wu.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int tid;
}
package com.wu.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
- 创建TeacherMapper,记得绑定
package com.wu.dao;
import com.wu.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TeacherMapper {
List<Teacher> getTeacher(@Param("id") int id);
}
- 绑定TeacherMapper
<mappers>
<mapper resource="com/wu/dao/TeacherMapper.xml"/>
</mappers>
- 在TeacherMapper.xml写sql语句
<select id="getTeacher" resultMap="ST">
select s.id sid,s.name sname,s.tid stid,t.name tname
from mybatis.teacher t,mybatis.student s
where s.tid=t.id and t.id=#{id};
</select>
<resultMap id="ST" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="Student" >
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="stid"/>
</collection>
</resultMap>
多对一(查询所有学生的全部信息以及他们老师的信息)
- 实体类
package com.wu.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
Teacher teacher;
}
package com.wu.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
- StudentMapper
package com.wu.dao;
import com.wu.pojo.Student;
import java.util.List;
public interface StudentMapper {
List<Student> selectStudent();
}
- StudentMapper.xml
<select id="selectStudent1" resultMap="ST1">
select s.id sid, s.name sname, t.name tname
from mybatis.student s,
mybatis.teacher t
where s.tid = t.id;
</select>
<resultMap id="ST1" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
总结
- 关联 - association 【处理多对一】
- 集合 - collection 【处理一对多】
- JavaType --> 指定pojo中属性的类型
- ofType--> 指定的是映射到list集合属性中pojo的类型或者泛型中的约束类型。
如在
private List<Student> students;
中 students属性指定了一个JavaType:ArrayList
如在
private List<Student> students;
中的范型也指定了一个ofType:Student