在数据库中,一对一、一对多和多对多是关联关系的三种基本类型:
- 一对一(One-to-One): 一个实体A的实例只能关联到另一个实体B的一个实例,反之亦然。例如,一个国家只有一个首都,一个首都也只属于一个国家。
- 一对多(One-to-Many): 一个实体A的实例可以关联到多个实体B的实例,而一个实体B的实例只能关联到一个实体A的实例。例如,一个班级有多个学生,但一个学生只属于一个班级。
- 多对多(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>