Mybatis-一对多和多对一的sql查询处理

102 阅读2分钟

定义

什么是一对多和多对一呢?

很简单,比如说学生和老师,一个老师对应多个学生,这就是一对多;反过来,多个学生对应一个老师,这就是多对一。这涉及到了两张表的连表查询。

需要用到的知识点

  1. 无论是一对多还是多对一,总会遇到复杂的属性,对于这些复杂的属性,我们需要单独出来。如果属性是一个对象:association,如果对象是一个集合:collection
  2. 不管是一对多还是多对一,都有两种方法进行查询处理:按照查询嵌套处理、按照结果嵌套处理,我们这里主推按照结果嵌套处理,比较简单
  3. 按照结果嵌套处理思想:直接写出sql,使用结果集映射处理sql。

示例

以上面的例子为例,这里只讲和一对一不一样的地方

一对多(查询老师id为1的老师信息和他的所有学生的信息)

  1. 我们先创建数据库mybatis,在数据库mybatis中创建两张表,Studnt表和Teacher表。

Student表:

image.png

Teacher表:

image.png

  1. 为了偷懒,在pom.xml文件配置lombok
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
  1. 创建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;
}
  1. 创建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);


}
  1. 绑定TeacherMapper
    <mappers>
        <mapper resource="com/wu/dao/TeacherMapper.xml"/>
    </mappers>
  1. 在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>

image.png

多对一(查询所有学生的全部信息以及他们老师的信息)

  1. 实体类
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;
}

  1. StudentMapper
package com.wu.dao;

import com.wu.pojo.Student;

import java.util.List;

public interface StudentMapper {
    List<Student> selectStudent();
}

  1. 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>

image.png

总结

  1. 关联 - association 【处理多对一】
  2. 集合 - collection 【处理一对多】
  3. JavaType --> 指定pojo中属性的类型
  4. ofType--> 指定的是映射到list集合属性中pojo的类型或者泛型中的约束类型。

如在private List<Student> students;students属性指定了一个JavaType:ArrayList

如在private List<Student> students;中的范型也指定了一个ofType:Student