1. 程式人生 > >mybatis11--多對多關聯查詢

mybatis11--多對多關聯查詢

div 3.0 ctype his prop 1.0 加載 hash oct

多對多關聯! 其實就是兩個一對多的關聯! 比如說 一個學生可以有多個老師!一個老師可以有多個學生!

那麽 學生和老師之間的關系 可以理解為 多對多的關聯關系!

關鍵是怎麽建立數據庫中兩個表之間的關系???

這時候需要一個中間表來組織兩張表的關系!

創建對應的數據庫表!

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

mybatis11--多對多關聯查詢