mybatis一对多的查询方法详解

因为是用记事本写的,可能排版比较乱,所以先附上一张大图片。
这里写图片描述

首先,先新建两个实体类Teacher.java和Student.java
public class Teacher {
    private Integer teacherId;
    private String teacherName;
    //getXxx()和setXxx()方法省略
}

public class Student {
    private String studentName;
    private String studentAddr;
    private Integer teacherId;
    //getXxx()和setXxx()方法省略
}
他们的关系是:一(个老师)对应多(个学生),通过teacherId进行关联。
**************************************************************************************************************
------------------------------------------------第一种方式----------------------------------------------------
**************************************************************************************************************
1、首先在Teacher.java中添加一个List<Student>集合,表示多个学生。
修改之后的Teacher.java类:
public class Teacher {
    private String teacherName;
    private Integer teacherAge;
    private List<Student> stuList;
    //getXxx()和setXxx()方法省略
}
2、接下来就是在Mapper.xml中做文章了。
    2.1、StudentMapper.xml中的字段映射就安装正常的字段映射来写就可以了。
    2.2、TeacherMapper.xml文件
        <resultMap id = "TeacherResultMap" type = "Teacher.java的路径">
            <result column = "表字段名" property = "属性名" />
            ....
            <!--
                ************************************
                *          重点就在这里            *
                ************************************
            -->
            <collection property="stuList" column="teacherId" javaType="ArrayList" 
                ofType="Student实体类路径" select="getStudentByTeacherId"/>
            <!--
                ************************************
                *   property是关联的字段,ofType是查*
                *   询返回的学生信息对应的实体类,  *
                *   select为要执行的查询学生列表的 *
                *   查询语句。                     *
                ************************************
            -->
        </resultMap>

        <resultMap id="StudentResultMap" type="Student实体类路径">  
            <result property="studentName" column="studentName" />  
            <result property="studentAddr" column="studentAddr" />  
            ...
        </resultMap> 
        <select id="getTeacherByID" resultMap="TeacherResultMap" parameterType="java.lang.Integer" >
            select teacherId,teacherName
            from teacher
            where teacherId = #{teacherId}
        </select>

        <select id="getStudentByTeacherId" resultMap="StudentResultMap" parameterType="java.lang.Integer" >
            select studentName,studentAddr,teacherId
            from student_t
            where teacherId = #{teacherId}
        </select>
这个时候,通过getTeacherByID就可以查出一个教师的信息和每个教师所对应的学生信息。
这种方式可能适用于查询条件就是两张表的关联字段,如果查询条件是其它字段的话,可能就不适用于这种了。
**************************************************************************************************************
------------------------------------------------第二种方式----------------------------------------------------
**************************************************************************************************************
第二种方式和第一种方式差不多,主要有以下几点的区别:
1、还是TeacherMapper.xml的配置文件中的字段映射:
    <collection property="stuList" ofType="Student实体类路径" resultMap="StudentResultMap"/>
2、这个时候,就不用写两个查询语句了,而且查询条件也可以是任意的字段了,只需要一个关联查询,将你想要的查出来就可以了
    <select id = "queryAll" parameterType="**" resultMap="TeacherResultMap">
        SELECT a.*, b.*
        FROM teacher a
        LEFT JOIN student b ON a.teacher_id = b.teacher_id
        WHERE 查询条件
    </select>
这种方式比第一种方式少了一个查询语句,而且查询条件也比较灵活了。

最后附上源文件的下载路径,欢迎下载:
源文件下载地址

猜你喜欢

转载自blog.csdn.net/steven_sf/article/details/78662233