当我们使用 MyBatis 进行数据库操作时,经常会遇到需要查询多个表的情况。MyBatis 提供了多种方式来进行多表查询,其中包括一对一、一对多和多对多查询。下面就分别介绍这三种查询方式的实现方法和示例代码。
一对一查询
一对一查询指的是查询两个表中分别有一条对应关系的数据,例如查询订单(order)和客户(customer)两张表中对应的记录。我们可以使用 MyBatis 的 resultType 来封装查询结果,实现一对一查询。
以下是一对一查询的示例代码:
<select id="getOrderWithCustomer" resultMap="OrderWithCustomer">
SELECT
o.id AS oid,
o.order_no AS orderNo,
o.total_price AS totalPrice,
c.id AS cid,
c.name AS customerName,
c.tel AS customerTel,
c.address AS customerAddress
FROM
`order` o
INNER JOIN customer c ON o.customer_id = c.id
WHERE
o.id = #{orderId}
</select>
<resultMap id="OrderWithCustomer" type="com.example.Order">
<id property="id" column="oid"/>
<result property="orderNo" column="orderNo"/>
<result property="totalPrice" column="totalPrice"/>
<association property="customer" javaType="com.example.Customer">
<id property="id" column="cid"/>
<result property="name" column="customerName"/>
<result property="tel" column="customerTel"/>
<result property="address" column="customerAddress"/>
</association>
</resultMap>
一对多查询
一对多查询指的是查询两个表中存在一对多关系的数据,例如查询一个班级中所有学生的信息。我们可以使用 MyBatis 的 collection 元素以及 resultMap 元素来实现一对多查询。
以下是一对多查询的示例代码:
<select id="getClassWithStudent" resultMap="ClassWithStudent">
SELECT
c.*,
s.id AS sid,
s.name AS studentName,
s.tel AS studentTel,
s.age AS studentAge
FROM
class c
INNER JOIN student s ON c.id = s.class_id
WHERE
c.id = #{classId}
</select>
<resultMap id="ClassWithStudent" type="com.example.Class">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="teacher" column="teacher"/>
<collection property="students" ofType="com.example.Student"
resultMap="StudentResultMap"/>
</resultMap>
<resultMap id="StudentResultMap" type="com.example.Student">
<id property="id" column="sid"/>
<result property="name" column="studentName"/>
<result property="tel" column="studentTel"/>
<result property="age" column="studentAge"/>
</resultMap>
多对多查询
多对多查询指的是查询两个表中存在多对多关系的数据,例如查询所有的学生和所选的课程的信息。我们需要使用中间表来关联这两张表,并建立对应的实体类来封装查询结果。同时,我们还需要使用 collection 元素以及 resultMap 元素来实现多对多查询。
以下是多对多查询的示例代码:
<select id="getStudentWithCourse" resultType="com.example.Student">
SELECT
s.*,
c.id AS cid,
c.name AS courseName,
c.teacher AS courseTeacher
FROM
student s
INNER JOIN student_course sc ON s.id = sc.student_id
INNER JOIN course c ON sc.course_id = c.id
WHERE
s.id = #{studentId}
</select>
总结
以上就是一对一、一对多和多对多查询的实现方法和示例代码。在实际应用中,我们可以根据需求选择合适的查询方式,并根据需求适当调整查询语句和 resultMap,以达到最好的查询效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis 一对一、一对多和多对多查询实例代码 - Python技术站