Какой лучший способ прочитать UDT из базы данных с Java? - PullRequest
6 голосов
/ 20 декабря 2010

Я думал, что знаю все о UDT и JDBC, пока кто-то на SO не указал на некоторые детали Javadoc java.sql.SQLInput и java.sql.SQLData JavaDoc для меня. Суть этой подсказки была (из SQLInput):

Входной поток, который содержит поток значений, представляющих экземпляр структурированный тип SQL или SQL Отличный тип. Этот интерфейс, используемый только для пользовательского сопоставления, используется водитель за кадром, и программист никогда не вызывает напрямую Методы SQLInput.

Это совершенно противоположно тому, что я привык делать (что также используется и стабильно в продуктивных системах при использовании с драйвером Oracle JDBC): внедрить SQLData и предоставить эту реализацию в настраиваемом отображении

ResultSet.getObject(int index, Map mapping)

Драйвер JDBC перезвонит моему пользовательскому типу, используя

SQLData.readSQL(SQLInput stream, String typeName)

метод. Я реализую этот метод и читаю каждое поле из потока SQLInput. В итоге getObject() вернет правильно инициализированный экземпляр моей реализации SQLData, содержащий все данные из UDT.

Мне кажется, это идеальный способ для реализации такого пользовательского отображения. Веские причины для этого:

  • Я могу использовать стандартный API вместо классов, специфичных для поставщика, таких как oracle.sql.STRUCT и т. Д.
  • Я могу генерировать исходный код из моих UDT с соответствующими методами получения / установки и другими свойствами

Мои вопросы :

  • Что вы думаете о моем подходе к реализации SQLData? Это жизнеспособно, даже если в Javadoc указано иное?
  • Какие еще способы чтения UDT в Java вы знаете? Например. что делает Spring? что делает Hibernate? Что делает JPA? Что ты делаешь?

Добавление

Поддержка UDT и интеграция с хранимыми процедурами - одна из основных функций jOOQ . jOOQ стремится скрыть более сложные «факты JDBC» от ​​клиентского кода, не скрывая базовой архитектуры базы данных. Если у вас есть похожие вопросы, подобные приведенным выше, jOOQ может дать вам ответ.

Ответы [ 3 ]

3 голосов
/ 29 декабря 2010

Преимущество настройки драйвера таким образом, чтобы он работал за кулисами, заключается в том, что программисту не нужно передавать карту типов в ResultSet.getObject (...) и, следовательно, он должен помнить одну деталь (большую часть времени)).Драйвер также может быть сконфигурирован во время выполнения с использованием свойств для определения отображений, поэтому код приложения может храниться независимо от деталей сопоставления типа SQL и объекта.Если приложение может поддерживать несколько разных баз данных, это позволяет поддерживать разные сопоставления для каждой базы данных.

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

В закулисном подходе метод ResultSet.getObject (int) будет использовать сопоставления типов, определенные для соединения, а не передаваемые кодом приложения в ResultSet.getObject (int index, Map mapping).В остальном подходы одинаковы.

Другие подходы

Я видел другой подход, используемый с JBoss 4 на основе этих классов:

org.jboss.ejb.plugins.cmp.jdbc.JDBCParameterSetter 
org.jboss.ejb.plugins.cmp.jdbc.JDBCResultSetReader.AbstractResultSetReader

Идея та же, но реализация нестандартная (вероятно, она предшествует версии стандарта JDBC, определяющей SQLData / SQLInput).

1 голос
/ 02 января 2011

Какие еще способы чтения UDT на Java вы знаете?Например, что делает Spring?что делает Hibernate?Что делает JPA?Что вы делаете?

Пример того, как нечто подобное можно сделать в Hibernate / JPA, показан в этом ответе на другой вопрос:

Java EnumsJPA и Postgres enums - Как мне заставить их работать вместе?

0 голосов
/ 20 декабря 2010

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

...