【发布时间】:2011-05-27 20:08:58
【问题描述】:
情况是这样的
在jOOQ 中,非常需要对 JDBC 进行抽象。我希望 jOOQ 客户端代码不知道这样一个事实,即一些数据是从简单的 ResultSet 中检索的,一些数据是从 SQLInput(对于 UDT)或 CallableStatements(对于存储过程/函数)中检索的。因此,我想对这些 JDBC 类型添加抽象:
java.sql.ResultSet
java.sql.CallableStatement
java.sql.SQLInput
java.sql.SQLOutput
现在它们的工作方式几乎相同。对于java.sql.Types 中的每种数据类型,它们通常都有一个get 和set 方法。例如,他们提供了类似
BigDecimal getBigDecimal(int index);
int getInt(int index);
它们都有类似的方法
boolean wasNull();
问题
不幸的是,这些 JDBC 接口没有扩展单个通用接口,这让那些想要在这里编写像 sn-p 这样的通用 JDBC 代码的人的生活更轻松(只是一个支持我的问题的示例):
// As JDBC has no support for BigInteger types directly,
// read a BigDecimal and transform it to a BigInteger
BigDecimal result = null;
if (source instanceof ResultSet) {
result = ((ResultSet) source).getBigDecimal(index);
}
else if (source instanceof CallableStatement) {
result = ((CallableStatement) source).getBigDecimal(index);
}
else if (source instanceof SQLInput) {
result = ((SQLInput) source).readBigDecimal();
}
return result == null ? null : result.toBigInteger();
上面的代码需要为他们三个都写,ResultSet,CallableStatement,SQLInput。而且类似的例子还有很多
我的问题是
- 有人知道优雅地解决这个问题的 JDBC 扩展库吗?
- 或者我应该自己为所有这些类型编写一个简单的包装类(或适配器)?
- 或者您会接受这个事实并继续复制内部库代码?
您更喜欢哪种解决方案以及为什么?感谢您提供任何反馈
【问题讨论】:
-
这不是适配器设计模式的用途吗?
-
@Skaffman,你可能和我说“包装类”时的意思一样......