繁体   English   中英

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

[英]What's the best way to read a UDT from a database with Java?

我以为我知道UDT和JDBC的一切,直到有人在SO上向我指出了java.sql.SQLInputjava.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实现实例,其中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阅读UDT的其他方法吗? 比如Spring做什么? Hibernate做了什么? JPA做什么? 你是做什么?

在另一个问题的答案中显示了如何在Hibernate / JPA中完成与此类似的操作的示例:

Java Enums,JPA和Postgres枚举 - 如何让它们协同工作?

我知道Spring的作用:你编写了RowMapper接口的实现。 从未在Spring中使用SQLData。 你的帖子是我第一次听说或想到这个界面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM