java - 传递 ResultSet 可以吗?

标签 java servlets jdbc

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

            //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/

相关文章:

java - JUnit 测试 : object not recreated between parameterized tests

java - 如何在Java中使用hashmap和arraylist

java - 使用tomcat7.0.30执行servlet程序时出现404状态错误

java搜索-从字符串preparedstatement中获取整数值

java - Oracle 10g 与 Java 的连接

java - LWJGL 自动本地选择器

java - 在匹配器组中获取比预期更多的字符

java - jsp ${pageContext.request.contextPath} 发送请求

java - Servlet 在过滤器中转发给出了意外结果

java - SQL 请求类型