2011-03-20 45 views
2

我剛開始學習MyBatis,我想知道,當我創建插入或更新查詢時,是否有一種方法可以使屬性對重構有點更友好?我將更詳細地解釋:插入和更新時使用MyBatis映射屬性到數據庫列(使用註釋)

我在所有可用於引用屬性名稱的域類中都有常量。在我看來,它減少了拼寫錯誤,並使重構變得更容易一些。

public static final String FIRST_NAME = "firstName"; 
private String firstName = ""; 

當我創建一個使用註釋的MyBatis的select語句,我可以做這樣的事情:

@Select("SELECT ID, FIRST_NAME, LAST_NAME FROM CUSTOMERS WHERE ID = #{id}") 
@Results({ 
    @Result(property = CustomerDetail.ID, column = "ID"), 
    @Result(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"), 
    @Result(property = CustomerDetail.LAST_NAME, column = "LAST_NAME") 
}) 
CustomerDetail selectById(final int id); 

如果我修改我的域對象(爲CustomerDetail)並更改屬性名稱,它最終被相當簡單。

然而,當我創建一個使用註釋的MyBatis的INSERT語句,我必須做這樣的事情:

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME) VALUES (#{id}, #{firstName}, #{lastName})") 
void insertCustomerDetail(final CustomerDetail customerDetail); 

在這種情況下,如果我修改我的域對象(爲CustomerDetail)並更改屬性名稱,它是更容易出錯。有沒有辦法可以使用我的常量,而不訴諸一堆字符串連接?我甚至應該關心自己嗎?

作爲一個新手,我期待@Insert和@Update註釋模仿@Select註釋的結構。例如(請注意,以下是無效的MyBatis註釋):

@Insert("INSERT INTO CUSTOMERS (ID, FIRST_NAME, LAST_NAME)") 
@Params({ 
    @Param(property = CustomerDetail.ID, column = "ID"), 
    @Param(property = CustomerDetail.FIRST_NAME, column = "FIRST_NAME"), 
    @Param(property = CustomerDetail.LAST_NAME, column = "LAST_NAME") 
}) 
void insertCustomerDetail(final CustomerDetail customerDetail); 

我錯過了,將有如我上面的示例相同效果的選擇嗎?或者,是否可以對MyBatis映射進行單元測試,以確保沒有人使用我的域對象中不存在的屬性名稱?測試可能是更好的解決方案,因爲它也適用於基於XML的映射。思考?

回答

1

這是我應該甚至關注 我自己與?

我不這麼認爲。我瞭解你的擔憂,並且我看到這樣的功能對你有什麼好處,尤其是在開發早期,POJO傾向於經常改變。

我不認爲你的對象字段將被重構足以證明提供此功能所需的投資。

我建議你閱讀mybatis user guide中的@Param標籤。這不是你在這裏尋找的東西,但它是一種將對象字段名稱與mybatis sql map變量分離的方法。在我看來,我會採用你的方法,通過@Param傳遞個別場景。

關於單元測試你的SQL地圖,我相當肯定,如果你使用一個沒有對應的get方法的ognl表達式,你會得到一個異常。即,如果使用#{someField},並且傳入的對象沒有getSomeField()方法,則會發生異常。

+0

對於低於理想的重構,我很滿意,因爲正如您所指出的那樣,它在開發週期的後期會成爲一個小問題。你提到的關於單元測試的部分是我最關心的部分。非常感謝你的答覆。 – 2011-03-24 01:28:10

+0

很酷。它確實會拋出一個「NoSuchPropertyException」,我今天遇到了它。 – Andy 2011-03-24 03:21:56

相關問題