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