我以为我对UDTS和JDBC了解一切,直到有人在 所以 指出了一些有关Javadoc的细节 java.sql.sqlinputjava.sql.sqldata 贾瓦多克对我。该提示的本质是(来自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, , ETC。
  • 我可以从我的UDT中生成源代码,并具有适当的Getters/Setter和其他属性

我的问题:

  • 您如何看待我的方法,实施 SQLData?即使Javadoc否则说明,它是否可行?
  • 您知道其他哪些阅读UDT的方法?例如,春天做什么? Hibernate做什么? JPA做什么?你做什么工作?

附录:

UDT支持和与存储过程的集成是 Jooq. 。 JOOQ旨在将更复杂的“ JDBC事实”隐藏在客户端代码中,而无需隐藏基础数据库体系结构。如果您有类似的问题,则JOOQ可能会为您提供答案。

有帮助吗?

解决方案

配置驱动程序以使其在幕后工作的优点是,程序员无需将类型映射传递到ResultSet.getObject(...),因此要记住的细节较少(大多数情况下)。还可以使用属性在运行时配置驱动程序来定义映射,因此可以将应用程序代码独立于SQL类型的详细信息来对待映射。如果应用程序可以支持多个不同的数据库,则可以为每个数据库提供支持不同的映射。

您的方法是可行的,其主要特征是应用程序代码使用明确的类型映射。

在幕后方法中,resultset.getObject(int)方法将使用连接上定义的类型映射,而不是resultset.getObject中的应用程序代码(int index,map映射)中所传递的类型映射。否则方法是相同的。

其他方法

我已经根据这些类别看到了JBOSS 4使用的另一种方法:

org.jboss.ejb.plugins.cmp.jdbc.JDBCParameterSetter 
org.jboss.ejb.plugins.cmp.jdbc.JDBCResultSetReader.AbstractResultSetReader

这个想法是相同的,但实现是非标准化的(它可能预先预先定义SQLDATA/SQLINPUT的JDBC标准版)。

其他提示

您知道其他哪些阅读UDT的方法?例如,春天做什么? Hibernate做什么? JPA做什么?你做什么工作?

在此答案中显示了一个与此相似的示例:

Java Enums,JPA和Postgres Enums-如何使它们一起工作?

我知道春天的工作:您写下他们的实现 RowMapper 界面。我有 绝不 使用SQLDATA与Spring。您的帖子是我第一次听说或考虑过该界面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top