mybatis11--多对多关联查询
多对多关联! 其实就是两个一对多的关联! 比如说 一个学生可以有多个老师!一个老师可以有多个学生!
那么 学生和老师之间的关系 可以理解为 多对多的关联关系!
关键是怎么建立数据库中两个表之间的关系???
这时候需要一个中间表来组织两张表的关系!
创建对应的数据库表!
student表
teacher表
middle表
创建对应的实体类
/** *学生对应的实体类 */ public class Student { private Integer sId; private String sName; //一个学生可以有多个老师 private Set<Teacher> teachers=new HashSet<Teacher>(); public Integer getsId() { return sId; } public void setsId(Integer sId) { this.sId = sId; } public String getsName() { return sName; } public void setsName(String sName) { this.sName = sName; } public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } public Student(Integer sId, String sName, Set<Teacher> teachers) { super(); this.sId = sId; this.sName = sName; this.teachers = teachers; } public Student() { super(); } //在双向关联的时候 只能一方显示关联信息 否则会出现stackOverflow 异常 @Override public String toString() { return "Student [sId=" + sId + ", sName=" + sName + ", teachers=" + teachers + "]"; } }
/** *老师的实体类 */ public class Teacher { private Integer tId; private String tName; //一个老师可以有多个学生 private Set<Student> students=new HashSet<Student>(); public Integer gettId() { return tId; } public void settId(Integer tId) { this.tId = tId; } public String gettName() { return tName; } public void settName(String tName) { this.tName = tName; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } public Teacher(Integer tId, String tName, Set<Student> students) { super(); this.tId = tId; this.tName = tName; this.students = students; } public Teacher() { super(); } @Override public String toString() { return "Teacher [tId=" + tId + ", tName=" + tName + ", students=" + students.size() + "]"; } }
创建对应的dao
public interface StudentDao { /** * 根据学生的编号查询所有对应老师信息 */ Student selectTeahcerById(Integer tId); }
创建对应的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.bdqn.dao.StudentDao"> <resultMap type="Student" id="studentMap"> <id property="sId" column="sid"/> <result property="sName" column="sname"/> <!-- 设置关联集合的属性 --> <collection property="teachers" ofType="Teacher"> <id property="tId" column="tid"/> <result property="tName" column="tname"/> </collection> </resultMap> <!-- 根据学生的编号查询所有对应老师信息 --> <select id="selectTeahcerById" resultMap="studentMap"> select sid,sname,tid,tname from student,middle,teacher where sid=studentId and tid=teacherId and sid=#{xxx} </select> </mapper>
在mybatis.xml文件中管理mapper文件
<!-- 加载映射文件信息 --> <mappers> <mapper resource="cn/bdqn/dao/StudentMapper.xml" /> </mappers>
创建对应的测试类
public class TeacherTest { StudentDao dao; SqlSession session; @Before public void before() { // 因为需要关闭session 需要把session提取出去 session = SessionUtil.getSession(); dao = session.getMapper(StudentDao.class); } @After public void after() { if (session != null) { session.close(); } } /** * 根据老师的编号查询所有的导师信息 */ @Test public void test1() { Student student = dao.selectTeahcerById(1); System.out.println(student); } }