什么是一对一,一对多,多对多? mybatis 中如何实现?

156 阅读1分钟

在数据库中,一对一、一对多和多对多是关联关系的三种基本类型:

  1. 一对一(One-to-One): 一个实体A的实例只能关联到另一个实体B的一个实例,反之亦然。例如,一个国家只有一个首都,一个首都也只属于一个国家。
  2. 一对多(One-to-Many): 一个实体A的实例可以关联到多个实体B的实例,而一个实体B的实例只能关联到一个实体A的实例。例如,一个班级有多个学生,但一个学生只属于一个班级。
  3. 多对多(Many-to-Many): 一个实体A的实例可以关联到多个实体B的实例,同时一个实体B的实例也可以关联到多个实体A的实例。例如,一个学生可以选择多门课程,而一门课程也可以有多个学生。

在 MyBatis 中,可以通过 XML 映射文件或注解的方式来实现这些关联关系:

一对一关联:

<!-- Country 实体 -->
<resultMap id="countryResult" type="Country">
    <id property="id" column="country_id" />
    <result property="name" column="country_name" />
    <!-- 其他属性映射... -->
    <association property="capital" javaType="Capital">
        <id property="id" column="capital_id" />
        <result property="name" column="capital_name" />
        <!-- 其他属性映射... -->
    </association>
</resultMap>

<!-- 查询 -->
<select id="selectCountryById" resultMap="countryResult">
    SELECT country.id as country_id, country.name as country_name,
           capital.id as capital_id, capital.name as capital_name
    FROM country
    LEFT JOIN capital ON country.capital_id = capital.id
    WHERE country.id = #{id}
</select>

一对多关联:

<!-- Class 实体 -->
<resultMap id="classResult" type="Class">
    <id property="id" column="class_id" />
    <result property="name" column="class_name" />
    <!-- 其他属性映射... -->
    <collection property="students" ofType="Student">
        <id property="id" column="student_id" />
        <result property="name" column="student_name" />
        <!-- 其他属性映射... -->
    </collection>
</resultMap>

<!-- 查询 -->
<select id="selectClassById" resultMap="classResult">
    SELECT class.id as class_id, class.name as class_name,
           student.id as student_id, student.name as student_name
    FROM class
    LEFT JOIN student ON class.id = student.class_id
    WHERE class.id = #{id}
</select>

多对多关联:

<!-- Student 实体 -->
<resultMap id="studentResult" type="Student">
    <id property="id" column="student_id" />
    <result property="name" column="student_name" />
    <!-- 其他属性映射... -->
    <collection property="courses" ofType="Course">
        <id property="id" column="course_id" />
        <result property="name" column="course_name" />
        <!-- 其他属性映射... -->
    </collection>
</resultMap>

<!-- 查询 -->
<select id="selectStudentById" resultMap="studentResult">
    SELECT student.id as student_id, student.name as student_name,
           course.id as course_id, course.name as course_name
    FROM student
    LEFT JOIN student_course ON student.id = student_course.student_id
    LEFT JOIN course ON student_course.course_id = course.id
    WHERE student.id = #{id}
</select>