Как лучше всего прочитать UDT из базы данных с помощью Java?

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

  •  11-10-2019
  •  | 
  •  

Вопрос

Я думал, что знаю все о UDT и JDBC, пока кто-то не ТАК указал на некоторые детали 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 вы знаете?Например.что делает весна?что делает спящий режим?Что делает JPA?Что вы делаете?

Приложение:

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

Это было полезно?

Решение

Преимущество настройки драйвера так, чтобы он работал «за кулисами», заключается в том, что программисту не нужно передавать карту типов в 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).

Другие советы

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

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

Перечисления Java, перечисления JPA и Postgres. Как заставить их работать вместе?

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

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