关联查询(实现多对一查询)
- 表结构为多个学生对应一个老师
- 学生类和老师类对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
private Teacher teacher;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private int id;
private String name;
}
- 功能接口
public interface StudentMapper {
//获取所有学生和对应的老师
List<Student> findall();
}
- 按查询嵌套处理
<select id="findall" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="student">
<association property="teacher" column="{id=tid}" javaType="teacher" select="getTeacher"></association>
</resultMap>
<select id="getTeacher" resultType="teacher">
select * from teacher where id = #{id}
</select>
- 按结果嵌套处理
<select id="findall" resultMap="StudentTeacher">
select s.id sid, s.name sname, t.name tname from student s, teacher t where t.id = s.tid
</select>
<resultMap id="StudentTeacher" type="student">
<id property="id" column="sid"></id>
<id property="name" column="sname"></id>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"></result>
</association>
</resultMap>
- 输出
Student(id=1, name=江腾, tid=0, teacher=Teacher(id=0, name=韩宗水))
Student(id=2, name=胡秋菊, tid=0, teacher=Teacher(id=0, name=韩宗水))
Student(id=3, name=方环珍, tid=0, teacher=Teacher(id=0, name=韩宗水))
关联查询(实现一对多查询)
- 表结构为多个学生对应一个老师
- Teacher类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
- TeacherMapper接口
public interface TesacherMapper {
public Teacher findTeacher();
}
- TeacherMapper.xml(按结果嵌套处理)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.TesacherMapper">
<select id="findTeacher" resultMap="TeacherMapper">
select s.name sname, s.id sid, t.id tid, t.name tname from student s, teacher t where tid = s.tid
</select>
<resultMap id="TeacherMapper" type="teacher">
<result property="name" column="tname"></result>
<result property="id" column="tid"></result>
<collection property="students" ofType="student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
</collection>
</resultMap>
</mapper>
- TeacherMapper.xml(按查询嵌套处理)
<select id="findTeacher" resultMap="TeacherStudent">
select * from teacher
</select>
<resultMap id="TeacherStudent" type="teacher">
<result column="id" property="id"></result>
<collection property="students" javaType="ArrayList" ofType="student" column="id" select="getStudentByTeacher"></collection>
</resultMap>
<select id="getStudentByTeacher" resultType="student">
select * from student
</select>
- 测试代码
@Test
public void test2(){
SqlSession session = MybatisUtils.getSession();
TesacherMapper mapper = session.getMapper(TesacherMapper.class);
Teacher teacher = mapper.findTeacher();
System.out.println(teacher);
}
结果:
Teacher(id=1, name=韩宗水, students=[Student(id=1, name=江腾, tid=0), Student(id=2, name=胡秋菊, tid=0), Student(id=3, name=方环珍, tid=0)])
小结
- 关联-association
- 集合-collection
- 所以association是用于一对一和多对一,而collection是用于一对多的关系
- JavaType和ofType都是用来指定对象类型的
JavaType是用来指定pojo中属性的类型
ofType指定的是映射到list集合属性中pojo的类型。