gpt4 book ai didi

java - java.sql.ResultSet、CallableStatement、SQLInput 没有通用接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:02 24 4
gpt4 key购买 nike

是这样的

jOOQ ,有很多需要对 JDBC 进行抽象。我希望 jOOQ 客户端代码不知道这样一个事实,即一些数据是从一个简单的 ResultSet 中检索的,一些数据是从 SQLInput(对于 UDT)或 CallableStatements(对于存储过程/函数)中检索的。因此,我想对这些 JDBC 类型添加抽象:

java.sql.ResultSet
java.sql.CallableStatement
java.sql.SQLInput
java.sql.SQLOutput

现在它们的工作方式几乎相同。对于 java.sql.Types 中的每种数据类型,它们通常都有一个 getset 方法。例如,他们附带了类似的方法

BigDecimal getBigDecimal(int index);
int getInt(int index);

而且他们都有类似的方法

boolean wasNull();

问题

不幸的是,这些 JDBC 接口(interface)没有扩展单个通用接口(interface),这让那些想要像这里的代码片段一样编写通用 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();

ResultSetCallableStatementSQLInput这三个都需要写上面的代码。还有很多类似的例子

我的问题是

  • 有谁知道可以优雅地解决这个问题的 JDBC 扩展库吗?
  • 或者我应该自己为所有这些类型编写一个简单的包装器类(或适配器)吗?
  • 或者您会接受这个事实并继续复制内部库代码吗?

您更喜欢哪种解决方案,为什么?感谢您的任何反馈

最佳答案

  • Does anyone know a JDBC extension library that solves this problem elegantly?

不,还得有人发明它。


  • Or should I write a simple wrapper class (or adapter) for all of these types myself?

我肯定会这样做。从通用包装器接口(interface)开始。

public interface DataProvider {
public BigInteger getBigInteger(int columnIndex);
// ...
}

让所有具体的包装器实现它。

public class ResultSetDataProvider implements DataProvider {
private ResultSet resultSet;

public ResultSetDataProvider(ResultSet resultSet) {
this.resultSet = resultSet;
}

public BigInteger getBigInteger(int columnIndex) {
BigDecimal bigDecimal = resultSet.getBigDecimal(columnIndex);
return bigDecimal != null ? bigDecimal.toBigInteger() : null;
}

// ...
}

并改用它。

try {
// Acquire ResultSet.
DataProvider dataProvider = new ResultSetDataProvider(resultSet);
// Process DataProvider.
} finally {
// Close ResultSet.
}

  • Or would you just accept that fact and keep duplicating internal library code?

不,我不会。保留您的代码 DRY .

关于java - java.sql.ResultSet、CallableStatement、SQLInput 没有通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482849/

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