我剛開始學習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的映射。思考?
對於低於理想的重構,我很滿意,因爲正如您所指出的那樣,它在開發週期的後期會成爲一個小問題。你提到的關於單元測試的部分是我最關心的部分。非常感謝你的答覆。 – 2011-03-24 01:28:10
很酷。它確實會拋出一個「NoSuchPropertyException」,我今天遇到了它。 – Andy 2011-03-24 03:21:56