创建数据库和实体类
首先创建数据库student和teacher,并且每个学生对应一个老师,一个老师可以对应多个学生,数据库如下图:
创建实体类Student
1 package com.loubin.pojo; 2 3 public class Student { 4 private int id; 5 private String name; 6 7 Teacher teacher; 8 9 @Override 10 public String toString() { 11 return "Student{" + 12 "id=" + id + 13 ", name='" + name + '\'' + 14 ", teacher=" + teacher + 15 '}'; 16 } 17 18 public Teacher getTeacher() { 19 return teacher; 20 } 21 22 public void setTeacher(Teacher teacher) { 23 this.teacher = teacher; 24 } 25 26 public int getId() { 27 return id; 28 } 29 30 public void setId(int id) { 31 this.id = id; 32 } 33 34 public String getName() { 35 return name; 36 } 37 38 public void setName(String name) { 39 this.name = name; 40 } 41 }
创建实体类Teacher
1 package com.loubin.pojo; 2 3 import java.util.List; 4 5 public class Teacher { 6 private int id; 7 private String name; 8 9 List<Student> students; 10 11 public List<Student> getStudents() { 12 return students; 13 } 14 15 @Override 16 public String toString() { 17 return "Teacher{" + 18 "id=" + id + 19 ", name='" + name + '\'' + 20 ", students=" + students + 21 '}'; 22 } 23 24 public void setStudents(List<Student> students) { 25 this.students = students; 26 } 27 28 public int getId() { 29 return id; 30 } 31 32 public void setId(int id) { 33 this.id = id; 34 } 35 36 public String getName() { 37 return name; 38 } 39 40 public void setName(String name) { 41 this.name = name; 42 } 43 44 public Teacher(int id, String name) { 45 this.id = id; 46 this.name = name; 47 } 48 }
一对多查询
Student类中除了基本类型id和name之外,还有一个自定义类teacher,所以在进行查询的时候,需要对查询到的结果进行映射处理,将查到的字段映射为对象teacher
在接口StudenMapper中定义getStudentById的方法,如下所示
package com.loubin.dao;import com.loubin.pojo.Student; import org.apache.ibatis.annotations.Param;public interface StudentMapper {Student getStudentById(int id); }
对应的映射文件StudentMapper.xm如下所示,其中使用了resultMap标签对结果进行映射,由于student对象中的属性teacher是类Teacher的对象,所以需要使用association标签进行映射
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.loubin.dao.StudentMapper"><resultMap id="studentMap" type="com.loubin.pojo.Student"><result column="sid" property="id"/><result column="sname" property="name"/><association property="teacher" javaType="teacher"><result property="id" column="tid"/><result property="name" column="tname"/></association></resultMap><select id="getStudentById" resultMap="studentMap">select s.id sid, s.name sname, t.id tid, t.name tname from student as s, teacher as t WHERE s.tid = t.id and s.id = #{id};</select> </mapper>
查询得到的结果如下
多对一查询
在类Teacher中有属性students,该属性是类Student的集合,所以需要使用resultMap中的collection标签进行映射,如下所示,创建接口TeacherMapper
package com.loubin.dao;import com.loubin.pojo.Teacher; import org.apache.ibatis.annotations.Param;public interface TeacherMapper {Teacher getTeacherById(@Param("id") int id); }
对应的映射文件TeacherMapper.xml如下所示
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.loubin.dao.TeacherMapper"><resultMap id="teacherMap" type="teacher"><result column="tid" property="id"/><result column="tname" property="name"/><collection property="students" ofType="student"><result column="sid" property="id"/><result column="sname" property="name"/></collection></resultMap><select id="getTeacherById" resultMap="teacherMap">select s.id sid, s.name sname, t.id tid, t.name tname from student as s, teacher as t WHERE s.tid = t.id and t.id = #{id};</select> </mapper>
查询得到的结果如下