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