使用Java从数据库读取UDT的最佳方法是什么?

时间:2010-12-19 23:26:17

标签: java jdbc user-defined-types

我认为我知道有关UDT和JDBC的所有内容,直到SO上有人向我指出了java.sql.SQLInputjava.sql.SQLData JavaDoc的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等。
  • 我可以使用适当的getter / setter和其他属性从我的UDT生成源代码

我的问题

  • 您如何看待我的方法,实施SQLData?即使Javadoc另有说明,它是否可行?
  • 你知道用Java阅读UDT的其他方法吗?例如。春天做什么? Hibernate做了什么? JPA做什么?你做什么的?

附录

UDT支持和与存储过程的集成是jOOQ的主要功能之一。 jOOQ旨在隐藏更复杂的JDBC事实"从客户端代码,不隐藏底层数据库架构。如果您有类似上述的类似问题,jOOQ可能会为您提供答案。

3 个答案:

答案 0 :(得分:3)

配置驱动程序使其在幕后工作的优点是程序员不需要将类型映射传递到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

这个想法是一样的,但实现是非标准的(它可能早于定义SQLData / SQLInput的JDBC标准的版本)。

答案 1 :(得分:1)

  

你知道用Java阅读UDT的其他方法吗?例如。春天做什么? Hibernate做了什么? JPA做什么?你做什么的?

在另一个问题的答案中显示了如何在Hibernate / JPA中完成与此类似的事情的示例:

Java Enums, JPA and Postgres enums - How do I make them work together?

答案 2 :(得分:-2)

我知道Spring做了什么:你编写了RowMapper接口的实现。我永远不会在Spring中使用SQLData。你的帖子是我第一次听说或想到这个界面。