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

Luk*_*der 7 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)
Run Code Online (Sandbox Code Playgroud)

然后JDBC驱动程序将使用.回调我的自定义类型

SQLData.readSQL(SQLInput stream, String typeName)
Run Code Online (Sandbox Code Playgroud)

方法.我实现了这个方法并从SQLInput流中读取每个字段.最后,getObject()将返回一个正确初始化的SQLData实现实例,其中包含来自UDT的所有数据.

对我来说,这似乎是实现这种自定义映射的完美方式.走这条路的好理由:

  • 我可以使用标准API,而不是使用特定于供应商的类,如oracle.sql.STRUCT等.
  • 我可以使用适当的getter/setter和其他属性从我的UDT生成源代码

我的问题:

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

附录:

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

ric*_*chj 4

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

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