首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 多對多映射入門教程:學生-課程關聯實戰

     編輯:Java 相關知識

業務場景

一個學生可選多門課程,一門課程可被多個學生選擇,典型多對多關係。需通過中間表 student_course 關聯。

數據庫腳本

DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8;
USE mybatis;

DROP TABLE IF EXISTS student, course, student_course;

CREATE TABLE student (
    sid INT PRIMARY KEY,
    sname VARCHAR(32)
);
CREATE TABLE course (
    cid INT PRIMARY KEY,
    cname VARCHAR(32)
);
CREATE TABLE student_course (
    sid INT,
    cid INT,
    PRIMARY KEY (sid, cid),
    FOREIGN KEY (sid) REFERENCES student(sid),
    FOREIGN KEY (cid) REFERENCES course(cid)
);

INSERT INTO student VALUES (1,'哈哈'), (2,'呵呵');
INSERT INTO course VALUES (1,'java'), (2,'.NET');
INSERT INTO student_course VALUES (1,1), (1,2), (2,1), (2,2);

實體類

public class Student implements Serializable {
    private Integer sid;
    private String sname;
    private List<Course> courses = new ArrayList<>();
    // getter/setter
}

public class Course implements Serializable {
    private Integer cid;
    private String cname;
    private List<Student> students = new ArrayList<>();
    // getter/setter
}

Mapper XML

StudentMapper.xml

<mapper namespace="studentMapper">
    <resultMap type="many2many.Student" id="studentMap">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
    </resultMap>
</mapper>

CourseMapper.xml

<mapper namespace="courseNamespace">
    <resultMap type="many2many.Course" id="courseMap">
        <id property="cid" column="cid"/>
        <result property="cname" column="cname"/>
    </resultMap>

    <!-- 查詢某學生選修的所有課程 -->
    <select id="findAllByName" parameterType="string" resultMap="courseMap">
        SELECT c.cname, c.cid
        FROM student s, course c, student_course sc
        WHERE s.sid = sc.sid AND c.cid = sc.cid AND s.sname = #{sname}
    </select>
</mapper>

DAO 與測試

public class StudentCourseDAO {
    public List<Course> findAllByName(String name) throws Exception {
        try (SqlSession session = MyBatisUtil.getSqlSession()) {
            return session.selectList("courseNamespace.findAllByName", name);
        }
    }

    @Test
    public void test() throws Exception {
        List<Course> list = new StudentCourseDAO().findAllByName("哈哈");
        list.forEach(c -> System.out.println(c.getCid() + ":" + c.getCname()));
    }
}

mybatis-config.xml 註冊

<mappers>
    <mapper resource="many2many/StudentMapper.xml"/>
    <mapper resource="many2many/CourseMapper.xml"/>
</mappers>

關鍵點總結

  1. 多對多必須通過中間表拆解為兩個一對多。
  2. 實體類雙向持有集合引用,注意序列化與無限遞歸(JSON 輸出時需忽略)。
  3. Mapper 中使用多表連接查詢,配合 resultMap 映射嵌套集合(此處簡化為單向查詢)。
  4. 實際項目中常用 <collection> 標籤實現嵌套結果映射。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved