1.一对多
一对多很好理解,就像是一个老师有很多个学生,那么就是一对多,一个老师对应多个学生
学生实体类
package Models;
public class Student {
private int cid;
private String cname;
private int teacherid;
public Student(int cid, String cname, int teacherid) {
this.cid = cid;
this.cname = cname;
this.teacherid = teacherid;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public int getTeacherid() {
return teacherid;
}
public void setTeacherid(int teacherid) {
this.teacherid = teacherid;
}
@Override
public String toString() {
return "Student{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", teacherid=" + teacherid +
'}';
}
}
老师实体类
package Models;
import java.util.List;
public class Teacher {
private int tid;
private String tname;
//老师拥有多个学生
private List<Student> students;
public Teacher(int tid, String tname, List<Student> students) {
this.tid = tid;
this.tname = tname;
this.students = students;
}
public int getTid() {
return tid;
}
public void setTid(int tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Teacher{" +
"tid=" + tid +
", tname='" + tname + '\'' +
", students=" + students +
'}';
}
}
不管是一对多还是多对一,都是有两种实现方法
一种是按照结果嵌套查询,一种是按照查询嵌套处理
我个人觉得第一种简单一些,本文也之介绍第一种
Mapper.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="Mapper.TeacherMapper">
<select id="getTeacher1" resultMap="TeacherStudent">
SELECT c_id cid,c_name cname,t_name tname,t_id tid,teacher_id teacherid FROM class a,teacher t
WHERE a.teacher_id=t.t_id AND t.t_id=#{ttid}
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="tname" column="tname"/>
<result property="tid" column="tid"></result>
<collection property="students" ofType="Student">
<result property="cid" column="cid"></result>
<result column="cname" property="cname"></result>
<result column="teacherid" property="teacherid"></result>
</collection>
</resultMap>
</mapper>
复杂的属性,我们要单独处理对象用association,它也是多对一的时候使用
集合使用collection,一般是一对多的时候使用,javaType是指定属性类型
集合中的泛型信息,我们用ofType获取
测试类就不写了
2.多对一
学生实体类
package Mpdels;
import org.apache.ibatis.type.Alias;
public class User {
//定义实体类的属性,与class表中的字段对应
private int id; //id===>c_id
private String name; //name===>c_name
/**
* class表中有一个teacher_id字段,所以在Classes类中定义一个teacher属性,
* 1 * 用于维护teacher和class之间的一对一关系,通过这个teacher属性就可以知道这个班级是由哪个老师负责的
*/
private Teacher teacher;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Classes [id=" + id + ", name=" + name + ", teacher=" + teacher + "]";
}
}
老师实体类
package Mpdels;
public class Teacher {
private int id; //id===>t_id
private String name; //name===>t_name
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + "]";
}
}
Mapper.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">
<!--namespace绑定一个Mapper接口-->
<mapper namespace="myMapper.UserMapper">
<!--id绑定接口里面的方法,resultType是指返回类型-->
<select id="getInner" parameterType="int" resultMap="ClassResultMap">
select c_id cid,c_name cname,t_name tname from class c, teacher t where c.teacher_id=t.t_id
</select>
<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
<resultMap type="Mpdels.User" id="ClassResultMap">
<result property="id" column="cid"/>
<result property="name" column="cname"/>
<association property="teacher" javaType="Mpdels.Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>