Можно ли передавать ResultSet?

В моей ситуации я запрашиваю конкретный результат в базе данных (в данном случае регистрационная информация основана на имени пользователя).

            //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 запроса, набор результатов, который я передаю в метод fillUser, также закрывается. Или я ошибаюсь и серьезно сливаю данные? На самом деле это второй раз, когда я передаю набор результатов (то есть два экземпляра одного), потому что блок, который я использую для запроса моей базы данных, - это

    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{

    }
}

. Все эти фрагменты кода находятся в отдельных классах и многократно используются в моем проекте. Можно ли передавать набор результатов таким образом, или мне следует попробовать другой метод? Моя цель - уменьшить избыточность кодов, но я не уверен, что собираюсь делать это законным образом.

10
задан BalusC 5 November 2011 в 20:13
поделиться