Заполнить класс из jdbc ResultSet - PullRequest
2 голосов
/ 07 октября 2011

Теперь я заполняю свои классы так:

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) и возвращает заполненный класс Part.

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

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

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

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

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

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

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

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

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

0 голосов
/ 07 октября 2011

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

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"));
0 голосов
/ 07 октября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...