mybatis查询多对一、一对多

现在数据库mybatis中存在两个表:student与teacher,结构与数据分别为:

student:

teacher:

 其中:表student的stid字段为外键,约束参考表teacher中的tid字段。

两个javabean:student、teacher:

student:

@Data
public class Student {
    private int sid;
    private String sname;
    private Teacher teacher;
}

teacher:

@Data
public class Teacher {
    private int tid;
    private String tname;
}

 studentMapper接口:

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

如何查询学生所有信息加上所关联的是哪个老师?

sql查询语句我们可以这样写:

select sid,sname,tname from mybatis.student,mybatis.teacher where stid = tid;

那么使用mybatis该怎么查询呢?

这里提供了两种方式:

子查询方式:

<select id="getStudents" resultMap="StudentTeacher">
    select * from mybatis.student
</select>
<resultMap id="StudentTeacher" type="pojo.Student">
    <result property="sid" column="sid"/>
    <result property="sname" column="sname"/>
    <association property="teacher" column="stid" javaType="pojo.Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="pojo.Teacher">
    select * from mybatis.teacher where tid = #{stid}
</select>

嵌套查询方式:

 <select id="getStudents1" resultMap="StudentTeacher1">
    select sid,sname,tname from mybatis.student,mybatis.teacher where stid = tid
</select>
<resultMap id="StudentTeacher1" type="pojo.Student">
    <result property="sid" column="sid"/>
    <result property="sname" column="sname"/>
    <association property="teacher" javaType="pojo.Teacher">
        <result property="tname" column="tname"/>
    </association>
</resultMap>

嵌套方式比较容易掌握。以上就是多对一的操作。

下面来看看一对多的操作:

javabean:

@Data
public class Student {
    private int sid;
    private String sname;
    private int stid;
}
@Data
public class Teacher {
    private int tid;
    private String tname;
    private List<Student> students;
}

TeacherMapper接口:

public interface TeacherMapper {
    //根据tid获取指定老师及该老师下所有的学生
    Teacher getTeacherById(@Param("tid") int tid);
    Teacher getTeacherById1(@Param("tid") int tid);
}

TeacherMapper.xml文件:

嵌套查询处理:

<select id="getTeacherById1" resultMap="TeacherStudent2">
        select * from teacher where tid = #{tid}
</select>
<resultMap id="TeacherStudent2" type="pojo.Teacher">
    <collection property="students" column="tid" ofType="pojo.Student"  javaType="java.util.ArrayList"  select="getStudentsByTid" />
</resultMap>
<select id="getStudentsByTid" resultType="pojo.Student">
    select * from student where stid = #{tid}
</select>

按照结果嵌套处理:

<select id="getTeacherById" resultMap="TeacherStudent">
        select tid,tname,sid,sname from student,teacher where (stid=tid) and (tid=#{tid})
</select>
<resultMap id="TeacherStudent" type="pojo.Teacher">
    <result property="tid" column="tid"/>
    <result property="tname" column="tname"/>
    <collection property="students" ofType="pojo.Student">
        <result property="sid" column="sid"/>
        <result property="sname" column="sname"/>
    </collection>
</resultMap>
原文地址:https://www.cnblogs.com/wmskywm/p/13585956.html