gpt4 book ai didi

java - 为数据库类创建通用 "getColumn"方法 (Java)

转载 作者:搜寻专家 更新时间:2023-10-30 22:25:14 24 4
gpt4 key购买 nike

我有一个数据库类,它封装了 java.sql.* 类的功能。基本上,您将其子类化以创建与特定数据库的连接,然后您可以使用其方法执行常见操作。

我想实现的一个操作是 getColumn() 方法。如果预期的数据库列是 String 数据类型,我可以执行以下操作:

public List<String> getColumn(String sql) throws SQLException
{
List<String> results = new ArrayList<>();
ResultSet rs = _stmt.executeQuery(sql);
while (rs.next())
{
results.add(rs.getString(1));
}
return results;
}

但我想使用模板参数泛化此方法,并使用适当的 ResultSet.get* 方法来填充 ArrayList

像这样:

public <T> List<T> getColumn(String sql) throws SQLException
{
List<T> results = new ArrayList<>();
ResultSet rs = _stmt.executeQuery(sql);
while (rs.next())
{
// if T is String, do:
// results.add(rs.getString(1));
// if T is Integer, do:
// results.add(rs.getInt(1));
// etc.
}
return results;

我相信一定有一种优雅的方式来做到这一点。想法?我会以错误的方式解决这个问题吗?

最佳答案

一个常见的错误是尝试使用如下签名的方法:

<T> T fn()

在 Java 中,无法在 fn 的调用中找出答案什么T .选择是 return null , 不安全地转换一个可能是也可能不是 T 的对象或抛出异常。如果您有类似的东西但返回类型为 List<T>您唯一可以存储在该列表中的是 null .

那怎么办。通常您会传入一个参数来创建所需的类型。例如,一个函数对象。 (我会使用 java.util.function.Function ,但检查异常会妨碍。)

List<String> names = getColumn(
"SELECT [...]",
(result, column) -> result.getString(column)
);
[...]

interface ResultFunction<T> {
T get(ResultSet results, int column) throws SQLException;
}

public <T> List<T> getColumn(
String sql, ResultFunction<T> function
) throws SQLException {
List<T> values = new ArrayList<>();
try (ResultSet result = _stmt.executeQuery(sql)) {
while (result.next()) {
values.add(function.get(result, 1));
}
}
return values;
}

您可能想要扩展 ResultFunction 的功能并可能使用枚举。

关于java - 为数据库类创建通用 "getColumn"方法 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492909/

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