我有一个Java方法,它使用JDBC将CLOB传递给PL / SQL过程。我能够使用createClob()
类的Connection
方法做到这一点。
这是Java Doc for the Connection class。如果您注意到createClob()
方法以外的方法,则此类中还有createBlob()
,createArrayOf()
,createNClob()
方法。
我很好奇为什么创建Blob
,Clob
,NClob
的实例是Connection
类的一部分?这似乎有点不合适。为什么数据类型及其创建应该与连接对象绑定?
为什么我们不能独立创建这些数据类型的实例?我计划在SOAP Web服务中使用以下签名公开此方法:
public String handleEmployeeReview(int empId , String fileName)
Web服务客户端首先必须创建Connection
实例来创建Clob
的实例,这似乎有些奇怪。 (除非有另一种创造和传递Clobs的方式,我不知道。)
这也让我想知道我为这个方法选择的Clob
数据类型是否正确。考虑将其暴露在网络服务中。
答案 0 :(得分:3)
JDBC旨在独立于数据库引擎。数据库类型INT
,VARCHAR
,TIMESTAMP
等可以在Java类型中实现更常见的实现:int
,String
,{{1} }从java.sql.Timestamp
延伸,然后在。
java.util.Date
,BLOB
,CLOB
等数据类型是更具体的字段,可以在数据库引擎中以非常不同的方式实现,某些数据库引擎甚至不支持数组作为数据表列的类型,但JDBC仍应提供透明的接口来传递客户端代码和数据库引擎。 JDBC接口的设计者认为这些对象的创建应该依赖于JDBC实现(这是NLOB
对象是特定于数据库引擎的),以及提供CLOB
对象创建的最佳位置(和类似的)将由CLOB
接口提供,因为您至少需要打开物理数据库连接来创建此类特定数据库引擎对象的实例。 IMO这是执行此操作的正确界面,因为它允许在不同的java.sql.Connection
和CLOB
中使用相同的PreparedStatement
对象而没有任何问题。
只有你的dao图层才能使用Connection#createClob
方法和类似物。其他数据源可能使用不同的方法来存储文件的二进制数据,例如存储在内存中的直接CallableStatement
,对于这种情况,数据源将是缓存系统,而不是直接数据库。