-- 數據庫表
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
-- 實體類屬性
public class Order {
private int id; // 對應 order_id
private String orderNo; // 對應 order_no
private float price; // 對應 order_price
}
直接查詢 SELECT * FROM orders 無法自動映射,因為列名與屬性名不匹配。
<select id="selectOrder" resultType="Order">
SELECT order_id AS id, order_no AS orderNo, order_price AS price
FROM orders WHERE order_id = #{id}
</select>
優點:零配置、直觀。缺點:SQL 複雜時別名冗長、多表查詢易衝突。
<select id="selectOrderRM" resultMap="orderMap">
SELECT * FROM orders WHERE order_id = #{id}
</select>
<resultMap id="orderMap" type="Order">
<id property="id" column="order_id"/> <!-- 主鍵用 id -->
<result property="orderNo" column="order_no"/> <!-- 非主鍵用 result -->
<result property="price" column="order_price"/>
</resultMap>
優點:SQL 與映射分離、支持複雜類型轉換、可復用。缺點:需維護 XML 配置。
<resultMap id="baseOrderMap" type="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="price" column="order_price"/>
</resultMap>
<!-- 擴展映射:添加關聯對象 -->
<resultMap id="orderDetailMap" extends="baseOrderMap">
<association property="customer" resultMap="customerMap"/>
</resultMap>
@Test
public void testAlias() {
Order o = sqlSession.selectOne("selectOrder", 1);
// Order [id=1, orderNo=aaaa, price=23.0]
}
@Test
public void testResultMap() {
Order o = sqlSession.selectOne("selectOrderRM", 1);
// Order [id=1, orderNo=aaaa, price=23.0]
}
<id> 標籤,否則一對多去重失效mapUnderscoreToCamelCase=true 自動映射<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
開啟後,order_no 自動映射到 orderNo,無需別名或 resultMap(主鍵除外)。