Github代码地址

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);
    }
    
}

 

posted @ 2017-02-21 21:33  @小葱拌豆腐  阅读(383)  评论(0编辑  收藏  举报

霸气