Свойства отображения mybatis в столбцы базы данных при вставке и обновлении (с помощью аннотаций)

StackOverflow https://stackoverflow.com/questions/5369884

  •  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 (), то вы получите исключение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top