Mybatis查询多对一,一对多Mapper语句(返回集合,返回对象)
1.多对一
多个学生对应一个老师
学生类:
Student{
private int id;
private String name;
private Teacher teacher;
}
学生数据表:
id | name | tid |
---|---|---|
1 | 小明 | 1 |
2 | 小刚 | 1 |
方法一:按照查询嵌套处理:
<select id = getStudent resultMap="StudentTeacher">
select * from student
</select>
<resultMap id = "StudentTeacher" type = "Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- association用于处理对象,property代表这个对象,
column只数据库字段名,用字段名来根据方法来获取对象,
javaType为该对象所属类 -->
<association property="teacher" column="tid" javaType="Teacher" select="getTcherById" />
</resultMap>
<select id = "getTcherById">
select * from teacher where id = #{id}
</select>
方法二(推荐):按照结果嵌套查询(联表查询):
<select id = "getStudent2" resultMap = "StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid = t.id;
</select>
<resultMap id="StudentTeacher2" type = "Student">
<result property = "id" column = "sid">
<result property = "name" column = "sname"
<association property = "teacher" javaType = "Teacher">
<property = "name" column = " tname">
</association>
</resultMap>
2.多对一
一个老师对应多个学生
学生类:
Student{
private int id;
private String name;
private Teacher teacher;
}
老师类:
Teacher{
private int id;
private String name;
private List<Student> students;
}
方法1:按照结果嵌套处理(联表查询):
<select id = "getTeacher" resultMap = "TeacherStudent">
select s.id sid, s.name sname, t.name tname,t.id tid
from student s,teacher t
where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id = "TeacherStudent" ofType = "Student">
<result property = "id" column = "tid">
<result property = "name" column = "tname">
<!-- collection表示集合,ofType表示students泛型类 -->
<collection property = "students" ofType = "Student">
<result property = "id" column = "sid">
<result property = "name" column = "sname">
<result property = "tid" column = "tid">
</collection>
</resultMap>
方法2:按照查询嵌套处理
<select id = "getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{tid}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<!--这里省略id,name对应关系-->
<collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from mybatis.student where tid = #{tid}
</select>
3.javaType & ofType
1.JavaType 用来指定实体类中属性的类型
2.ofType 用来指定映射到List或者集合中的 pojo类型,泛型中的约束类型!