【发布时间】:2011-05-28 00:15:12
【问题描述】:
我以为我对 UDT 和 JDBC 了如指掌,直到 SO 上的某个人向我指出了 java.sql.SQLInput 和 java.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等。 - 我可以从我的 UDT 生成源代码,具有适当的 getter/setter 和其他属性
我的问题:
- 您如何看待我实施
SQLData的方法?即使 Javadoc 另有说明,它是否可行? - 您知道在 Java 中读取 UDT 的其他哪些方法?例如。春天做什么?休眠是做什么的? JPA 是做什么的?你是做什么的?
附录:
UDT 支持和与存储过程的集成是jOOQ 的主要功能之一。 jOOQ 旨在从客户端代码中隐藏更复杂的“JDBC 事实”,而不隐藏底层数据库架构。如果您有类似上述的问题,jOOQ 可能会为您提供答案。
【问题讨论】:
标签: java jdbc user-defined-types