关联关系反应到数据库中是主外键关系,外键肯定是定义在多方的,某个表中有外键,一定和某个表存在主外键关系,也就是充当着多方。
1、多对一的处理
多个学生对应着一名老师
从学生的角度,学生关联一个老师
老师学生实体类
public class student {
private int id;
private String name;
private teacher teachers;
}
public class teacher {
private int tid;
private String tname;
}
学生dao层(接口)
public interface studentDao {
List<student> getstudents();
}
学生mapper文件:
在这里实体取别名的方式处理字段相同,被覆盖的情况
<?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="cn.com.Ycy.mybatsi.dao.studentDao">
<select id="getstudents" resultMap="student_teacher">
SELECT stu.id,stu.name,teacher.name AS teacher_name,teacher.id AS teacher_id FROM student stu,teacher
WHERE stu.tid = teacher.id
</select>
<resultMap id="student_teacher" type="cn.com.Ycy.mybatsi.domain.student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="teachers" javaType="cn.com.Ycy.mybatsi.domain.teacher">
<id column="teacher_id" property="tid"/>
<result column="teacher_name" property="tname"/>
</association>
</resultMap>
</mapper>
代码分析:
namespace:接口的绑定 就是namespace的包名要和接口的包名一致
resultMap:结果集映射,值随便取,但是要与下前的resultMap的id值相同一致
type:说明结果集的类型时student类
<association property="teachers" javaType="cn.com.Ycy.mybatsi.domain.teacher">
<id column="teacher_id" property="tid"/>
<result column="teacher_name" property="tname"/>
</association>
property:是在类属性名
javaType:teacher的类型
因为这个是学生的配置文件(也可以叫接口的实现类,由之前的类转为xml文件)
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="teachers" javaType="cn.com.Ycy.mybatsi.domain.teacher">
<id column="teacher_id" property="tid"/>
<result column="teacher_name" property="tname"/>
</association>
上面的关联属性对应着下面的类的属性
public class student {
private int id;
private String name;
private teacher teachers;
}
id是主键属性关联,result是非主键关联 column是表中的名称,property是类中属性名称(相对应的)
测试类:
@Test
public void test03(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
studentDao mapper = sqlSession.getMapper(studentDao.class);
List<student> students = mapper.getstudents();
for (student student : students) {
System.out.println(student);
}
sqlSession.close();
}
2、一对多的处理
一对多的理解
一个老师有多名学生
从老师的角度,一个老师拥有一个群学生(集合)
public class teacher {
private int tid;
private String tname;
private Set<student>Students;
}
public class student {
private int id;
private String name;
}
接口中:
public interface teacherDao {
List<teacher> getTeachers();
}
teacherDao.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="cn.com.Ycy.mybatsi.dao.teacherDao">
<select id="getTeachers" resultMap="teacher_student">
SELECT t.*,stu.id as teacher_id,stu.name as teacher_name FROM teacher t,student stu
WHERE t.id=stu.tid
</select>
<resultMap id="teacher_student" type="cn.com.Ycy.mybatsi.domain.teacher">
<id column="id" property="tid"/>
<result column="name" property="tname"/>
<collection property="Students" ofType="cn.com.Ycy.mybatsi.domain.student">
<id column="teacher_id" property="id"/>
<result column="teacher_name" property="name"/>
</collection>
</resultMap>
</mapper>
测试类
@Test
public void test02(){
SqlSession sqlSession = mybatisUtils.getSqlSession();
teacherDao mapper = sqlSession.getMapper(teacherDao.class);
List<teacher> teachers = mapper.getTeachers();
for (teacher teacher : teachers) {
System.out.println(teacher);
}
sqlSession.close();
}