首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MyBatis 多表分頁查詢 ResultType 映射:定義 DTO 聚合對象

     編輯:程式設計綜合問答

問題背景

MyBatis 分頁查詢涉及多表關聯,resultType 無法直接映射單一實體類,需決定是否新建類。

最佳實踐

新建 DTO (Data Transfer Object) / VO (View Object) 類,專門承載該查詢的結果集字段。這符合單一職責原則,避免污染領域模型。

實現步驟

  1. 定義 DTO 類,包含所有 SELECT 列對應字段,提供 Getter/Setter。
  2. Mapper XML 中 <resultMap> 映射列名到 DTO 屬性(支持列別名)。
  3. 分頁插件配合 PageHelper 或手寫 LIMIT。

代碼示例

DTO 類

public class OrderDetailDTO {
    private Long orderId;
    private String orderNo;
    private String userName;
    private String productName;
    private BigDecimal amount;
    // getter/setter
}

Mapper XML

<resultMap id="orderDetailMap" type="com.example.dto.OrderDetailDTO">
    <id property="orderId" column="order_id"/>
    <result property="orderNo" column="order_no"/>
    <result property="userName" column="user_name"/>
    <result property="productName" column="product_name"/>
    <result property="amount" column="amount"/>
</resultMap>

<select id="selectOrderDetails" resultMap="orderDetailMap">
    SELECT o.id AS order_id, o.no AS order_no, u.name AS user_name,
           p.name AS product_name, o.amount
    FROM orders o
    JOIN users u ON o.user_id = u.id
    JOIN products p ON o.product_id = p.id
    WHERE o.status = 1
    ORDER BY o.create_time DESC
    LIMIT #{offset}, #{pageSize}
</select>

替代方案

  • resultType="map":返回 List<Map<String, Object>>,靈活但無類型安全,不推薦作為主流。
  • 嵌套結果映射 <association>/<collection>:若業務需對象圖,可映射到主實體包含關聯對象,但分頁時嵌套集合大小不可控,需謹慎。

總結

多表分頁查詢**強烈建議定義專用 DTO**,配合 resultMap 精確映射,代碼清晰、類型安全、易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved