一对多 多对多SQL在mapper中怎么写
时间: 2024-02-23 14:01:26 浏览: 89
对于一对多关系,可以使用一对多映射来实现。在 MyBatis 中,可以使用 `collection` 元素来处理一对多映射。
假设有两个表:Order(订单)和 OrderItem(订单项),一个订单可以包含多个订单项。在 Order 表中,有一个 orderId 字段作为主键,在 OrderItem 表中,有一个 orderId 字段作为外键,关联到 Order 表的 orderId 字段。
在 OrderMapper.xml 文件中,可以这样配置一对多映射:
```xml
<!-- 查询订单及其所有订单项 -->
<select id="getOrderWithItems" resultMap="orderResultMap">
SELECT *
FROM Order
WHERE orderId = #{orderId}
</select>
<!-- 定义 Order 表和 OrderItem 表的 resultMap -->
<resultMap id="orderResultMap" type="Order">
<id property="orderId" column="orderId"/>
<result property="orderName" column="orderName"/>
<collection property="orderItems" ofType="OrderItem">
<id property="itemId" column="itemId"/>
<result property="item" column="item"/>
<result property="price" column="price"/>
</collection>
</resultMap>
```
在 Order 类中,需要定义一个 List<OrderItem> 类型的属性 orderItems,并提供 getter 和 setter 方法。
对于多对多关系,可以使用多对多映射来实现。在 MyBatis 中,可以使用 `association` 和 `collection` 元素来处理多对多映射。
假设有两个表:Student(学生)和 Course(课程),一个学生可以选修多个课程,一个课程可以被多个学生选修。在 Student 表中,有一个 studentId 字段作为主键,在 Course 表中,有一个 courseId 字段作为主键。两个表之间使用一个中间表 StudentCourse(学生课程关系表)来维护多对多关系,其中有一个 studentId 字段和一个 courseId 字段。
在 StudentMapper.xml 文件中,可以这样配置多对多映射:
```xml
<!-- 查询学生及其所选的所有课程 -->
<select id="getStudentWithCourses" resultMap="studentResultMap">
SELECT *
FROM Student
WHERE studentId = #{studentId}
</select>
<!-- 定义 Student 表和 Course 表的 resultMap -->
<resultMap id="studentResultMap" type="Student">
<id property="studentId" column="studentId"/>
<result property="studentName" column="studentName"/>
<collection property="courses" ofType="Course" resultMap="courseResultMap"/>
</resultMap>
<resultMap id="courseResultMap" type="Course">
<id property="courseId" column="courseId"/>
<result property="courseName" column="courseName"/>
</resultMap>
<!-- 查询学生选修的所有课程 -->
<select id="getCoursesByStudentId" resultMap="courseResultMap">
SELECT Course.*
FROM Course
INNER JOIN StudentCourse ON Course.courseId = StudentCourse.courseId
WHERE StudentCourse.studentId = #{studentId}
</select>
<!-- 查询课程被哪些学生选修 -->
<select id="getStudentsByCourseId" resultMap="studentResultMap">
SELECT Student.*
FROM Student
INNER JOIN StudentCourse ON Student.studentId = StudentCourse.studentId
WHERE StudentCourse.courseId = #{courseId}
</select>
```
在 Student 类中,需要定义一个 List<Course> 类型的属性 courses,并提供 getter 和 setter 方法。在 Course 类中,需要定义一个 List<Student> 类型的属性 students,并提供 getter 和 setter 方法。
阅读全文