gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:40 24 4
gpt4 key购买 nike

我以为我知道关于 UDT 和 JDBC 的一切,直到有人在 SO 上指出了 java.sql.SQLInput 的 Javadoc 的一些细节和 java.sql.SQLData JavaDoc 给我。该提示的本质是(来自 SQLInput):

An input stream that contains a stream of values representing an instance of an SQL structured type or an SQL distinct type. This interface, used only for custom mapping, is used by the driver behind the scenes, and a programmer never directly invokes SQLInput methods.

这与我过去所做的完全相反(当与 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 的其他哪些方法?例如。 Spring 做什么? hibernate 是做什么的? JPA 是做什么的?你是做什么的?

附录:

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

最佳答案

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

关于java - 使用 Java 从数据库中读取 UDT 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4485746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com