gpt4 book ai didi

java - 传递 ResultSet 可以吗?

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

在我的情况下,我正在查询数据库以获得特定的返回(在本例中是基于用户名的注册信息)。

            //Build SQL String and Query Database.
if(formValid){
try {
SQL = "SELECT * FROM users WHERE username=? AND email=?";
Collections.addAll(fields, username, email);
results = services.DataService.getData(SQL, fields);
if (!results.next()){
errMessages.add("User account not found.");
} else {
user = new User();
user.fillUser(results); //Is it ok to pass ResultSet Around?
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
services.DataService.closeDataObjects(); //Does this close the ResultSet I passed to fillUser?
}
}

因此,一旦我查询数据库,如果找到结果,我将创建一个新的 User 对象并使用从数据库接收到的数据填充它。我曾经直接在将结果集拉入的方法中执行所有这些操作,但我意识到我在整个项目中进行了大量冗余编码,因此我将其全部移至一个位于实际用户 bean 中的中央方法中。

    public void fillUser(ResultSet data) throws SQLException{
setUserId(data.getInt("id"));
setFirstName(data.getString("first_name"));
setLastName(data.getString("last_name"));
setUsername(data.getString("username"));
setType(data.getString("type"));
setEmail(data.getString("email"));
}

我已经做了一些测试,据我所知,因为我在查询的 finally block 中关闭了原始结果集,所以我传递给 fillUser 方法的结果集也被关闭了。还是我错了,我是在严重泄露数据吗?这实际上是我第二次传递结果集(所以它是一个的两个实例),因为我用来查询数据库的 block 是

    public static ResultSet getData(String SQL, ArrayList fields) throws SQLException {
try{
connection = Database.getConnection();
preparedStatement = connection.prepareStatement(SQL);

for(int i=0; i<fields.size(); i++){
Integer num = i + 1;
Object item = fields.get(i);

if(item instanceof String){
preparedStatement.setString(num, (String) item); //Array item is String.
} else if (item instanceof Integer){
preparedStatement.setInt(num, (Integer) item); //Array item is Integer.
}
}

resultSet = preparedStatement.executeQuery();
return resultSet;
}finally{

}
}

所有这些代码片段都位于不同的类中,并在我的项目中多次重复使用。像这样传递结果集是否可以,还是我应该尝试另一种方法?我的目标是减少代码冗余,但我不确定我是否以合法的方式进行。

最佳答案

从技术上讲,传递结果集是可以的,只要您没有序列化并将其传递给不同的 JVM,并且您的 JDBC 连接和语句仍然打开。

但是,让数据库访问层以 Java 编码方式返回结果集(在您的示例中为 User 列表)可能是更好的软件工程师和编程实践。这样,您的代码会更清晰,您不必担心 ResultSet 是否已打开,或者您必须将其滚动到顶部,您可以命名...

关于java - 传递 ResultSet 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021043/

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