Свойства отображения mybatis в столбцы базы данных при вставке и обновлении (с помощью аннотаций)
-
27-10-2019 - |
Вопрос
Я только начинаю выучить 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 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. Мысли?
Решение
Это то, с чем я даже должен беспокоиться?
Я так не думаю. Я понимаю вашу озабоченность и вижу, как такая функция может быть полезна для вас, особенно в начале развития, когда POJO склонны меняться так часто.
Я не думаю, что ваши объекты поля будут достаточно рефакторированы, чтобы оправдать инвестиции, необходимые для предоставления этой функции.
Я предлагаю вам прочитать о теге @param в Руководство пользователя mybatis. Анкет Это не совсем то, что вы здесь ищете, но это способ отделить имена поля объектов с переменными Mybatis SQL Map. На мой взгляд, я бы принял ваш подход к прохождению в отдельных фейлде с @param.
Что касается модульного тестирования ваших карт SQL, я совершенно уверен, что если вы используете выражение ognl, которое не имеет соответствующего метода получения в объекте, вы получите исключения. т.е. Если вы используете #{somefield}, а объект, который ваш прохождение не имеет метода getoMefield (), то вы получите исключение.