我认为我知道有关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的所有数据。
对我来说,这似乎是实现这种自定义映射的完美方式。走这条路的好理由:
oracle.sql.STRUCT
等。我的问题:
SQLData
?即使Javadoc另有说明,它是否可行?附录:
UDT支持和与存储过程的集成是jOOQ的主要功能之一。 jOOQ旨在隐藏更复杂的JDBC事实"从客户端代码,不隐藏底层数据库架构。如果您有类似上述的类似问题,jOOQ可能会为您提供答案。
答案 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。你的帖子是我第一次听说或想到这个界面。