首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 字段名與屬性名不一致解決方案:別名映射與 resultMap 詳解

     編輯:Java 相關知識

問題場景

-- 數據庫表
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 無法自動映射,因為列名與屬性名不匹配。

方案一:SQL 列別名(最簡單)

<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 複雜時別名冗長、多表查詢易衝突。

方案二:resultMap 顯式映射(推薦)

<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 復用與繼承

<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]
}

最佳實踐建議

  1. 簡單查詢:優先用 SQL 別名,減少 XML 配置
  2. 複雜/復用查詢:使用 resultMap,統一管理映射關係
  3. 主鍵字段:必須用 <id> 標籤,否則一對多去重失效
  4. 命名規範:建議數據庫下劃線、Java 駝峰,配合 mapUnderscoreToCamelCase=true 自動映射

自動映射開啟(全局配置)

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

開啟後,order_no 自動映射到 orderNo,無需別名或 resultMap(主鍵除外)。

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