MyBatis 分頁查詢涉及多表關聯,resultType 無法直接映射單一實體類,需決定是否新建類。
新建 DTO (Data Transfer Object) / VO (View Object) 類,專門承載該查詢的結果集字段。這符合單一職責原則,避免污染領域模型。
<resultMap> 映射列名到 DTO 屬性(支持列別名)。PageHelper 或手寫 LIMIT。public class OrderDetailDTO {
private Long orderId;
private String orderNo;
private String userName;
private String productName;
private BigDecimal amount;
// getter/setter
}
<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 精確映射,代碼清晰、類型安全、易維護。