Класс заполнения из результирующего набора jdbc

#jdbc #java

#jdbc #java

Вопрос:

Теперь я заполняю свои классы следующим образом:

 Part part = new Part();

ResultSet rs = statement.executeQuery();
part.setBrand(rs.getString("P_BRAND"));
part.setComment(rs.getString("P_COMMENT"));
part.setContainer(rs.getString("P_CONTAINER"));
part.setMfgr(rs.getString("P_MFGR"));
part.setName(rs.getString("P_NAME"));
  

Есть ли другой и быстрый способ заполнить объект части?
Что-то вроде этого метода (Part.class , part, rs) и возвращает заполненный класс детали.

Ответ №1:

Короткий ответ: Да

Более длинный ответ:

Существует несколько путей к ответу:

  1. Используйте пакет ORM, такой как MyBatis или Hibernate. Вы можете написать метод для заполнения объекта из результирующего набора в общем случае с использованием отражения, но зачем изобретать велосипед. И MyBatis, и Hibernate уже делают это.
  2. Напишите конструктор деталей, который принимает результирующий набор и извлекает значения столбцов.
  3. Напишите конструктор деталей, который принимает все значения, которые есть в вашем результирующем наборе, и вызовите его со значениями в результирующем наборе (см. Ответ Денниса на это).
  4. Напишите объект конструктора деталей, который принимает результирующий набор и создает деталь на основе содержащихся в ней значений.
  5. что-то, о чем я не думал.

Ответ №2:

Если вы напишете метод для создания своего part объекта, вы проделаете ту же работу, чтобы скопировать в него данные.

Однако, если вы выполняете эту конструкцию part объекта повторно, то наличие метода делает его более удобным для обслуживания и организованным кодом.

Наличие метода не обязательно сделает его быстрым, это просто сделает код более кратким и позволит избежать повторения кода (т. Е. принцип DRY). Вы также можете использовать шаблон Builder здесь.

Другой вариант — использовать Apache BeanUtils — он предоставляет вам множество полезных служебных методов.

Однако, если вы говорите конкретно о том, чтобы всегда копировать из набора результатов JDBC во внутренний объект DTO и хотите использовать spring framework, тогда вы можете использовать RowMapper() из него. Также существует маршрут ORM с гибернацией, iBatis и т. Д.

Ответ №3:

Короткий ответ: Нет.

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

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

Короче говоря, вам действительно лучше копировать поля из результирующего набора одно за другим. Обычно это не имеет большого значения. Для каждого поля требуется одна строка кода. Я полагаю, если у вас в таблице будет сто полей, это будет больно.

Ответ №4:

Если я правильно понимаю ваш вопрос, вы можете отредактировать конструктор класса Part, чтобы принять значения…

 Part part;

ResultSet rs = statement.executeQuery();
part = new Part(rs.getString("P_BRAND"), rs.getString("P_COMMENT"), rs.getString("P_CONTAINER"), 
   rs.getString("P_MFGR"), rs.getString("P_NAME"));