MyBatis отображает свойства в столбцы базы данных при вставке и обновлении (используя аннотации) - PullRequest
2 голосов
/ 20 марта 2011

Я только начинаю изучать MyBatis и мне интересно, когда я создаю запросы на вставку или обновление, есть ли способ сделать имена свойств более удобными для рефакторинга?Я объясню более подробно:

У меня есть константы во всех моих классах домена, которые можно использовать для ссылки на имена свойств.На мой взгляд, это сокращает количество опечаток и немного упрощает рефакторинг.

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

Когда я создаю оператор выбора MyBatis с использованием аннотаций, я могу сделать что-то вроде этого:

@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 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 Ответ

1 голос
/ 23 марта 2011

Это то, чем я должен заниматься?

Я так не думаю.Я понимаю вашу озабоченность и вижу, как такая функция может быть полезна для вас, особенно на ранних стадиях разработки, когда POJO имеют тенденцию меняться так часто.

Я не думаю, что поля ваших объектов будут подвергнуты рефакторингу достаточно, чтобы оправдатьинвестиции, необходимые для обеспечения этой функциональности.

Я предлагаю вам прочитать о теге @Param в руководстве пользователя mybatis .Это не совсем то, что вы ищете здесь, но это способ отделить имена полей объекта от переменных mybatis sql map.На мой взгляд, я бы взял ваш подход к передаче отдельных полей с помощью @ Param.

Что касается модульного тестирования ваших карт SQL, я совершенно уверен, что если вы используете выражение ognl, которое неиметь соответствующий метод get в объекте, вы получите исключения.то есть, если вы используете # {someField}, а объект, который вы передаете, не имеет метода getSomeField (), то вы получите исключение.

...