一对多关系
- 解释
- 案例
解释
可以把一对多关系,抽象成一个老师面对许多学生
案例
- pojo
// 老师的实体类
package com.dilidiliniang.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
List<Student> students;
}
// 学生的实体类
package com.dilidiliniang.pojo;
import lombok.Data;
// 一对多模型
@Data
public class Student {
private int id;
private String name;
private int tid;
}
- 接口
package com.dilidiliniang.dao;
import com.dilidiliniang.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TeacherMapper {
//获取指定老师,及老师下的所有学生
public Teacher getTeacher( int id);
public Teacher getTeacher2(int id);
}
- TeacherMapper.xml文件理解
这里有两种方法实现,先看按结果嵌套查询,需要写复杂SQL语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dilidiliniang.dao.TeacherMapper">
<!--
where s.tid = t.id and t.id=#{id} 中的id是由接口传过来的
写这个的原因是:
<result property="id" column="tid"></result>
<result property="name" column="tname"/>
由于sql语句添加了别名,因此需要匹配数据库中别名
-->
<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=#{id}
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"></result>
<result property="name" column="tname"/>
<collection property="students" ofType="Student">
<result property="id" column="sid" />
<result property="name" column="sname" />
<result property="tid" column="tid" />
</collection>
</resultMap>
<!--
第一步:查出该ID对应的老师
第二步:使用resultMap,为了防止student为null
第三步:resultMap中使用collection(集合)
第四步:单独抽出外键关联的,写出查询语句,该参数由resultMap中的collection中提供column
-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<!--column是一对多的外键 , 写的是一的主键的列名-->
<collection property="students" ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from student where tid = #{id}
</select>
</mapper>