我以为我了解有关 UDT 和 JDBC 的一切,直到有人SO http://stackoverflow.com指出了Javadoc的一些细节java.sql.SQLInput http://download.oracle.com/javase/6/docs/api/java/sql/SQLInput.html and java.sql.SQLData http://download.oracle.com/javase/6/docs/api/java/sql/SQLData.htmlJavaDoc 给我。该提示的本质是(来自 SQLInput):
包含流的输入流
代表一个实例的值
SQL 结构化类型或 SQL
独特的类型。这个接口,用到了
仅用于自定义映射,用于
幕后司机和
程序员从不直接调用
SQL 输入方法。
这与我习惯做的事情完全相反(当与 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 生成源代码,并具有适当的 getter/setter 和其他属性
我的问题:
- 您对我的实施方法有何看法?
SQLData
?即使 Javadoc 另有说明,它是否可行?
- 您还知道哪些其他在 Java 中读取 UDT 的方法?例如。 Spring 做什么?休眠是做什么的? JPA 是做什么的?你做什么工作?
Addendum:
UDT支持以及与存储过程的集成是其主要特性之一jOOQ http://www.jooq.org。 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 标准版本)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)