Если вы можете жить с Spring, я предложу следующие улучшения:
- Пусть Spring выполнит обработку исключений.
- Используйте JdbcTemplate вместо самостоятельного создания готовых операторов.
Независимо от использования Spring, я рекомендую следующее:
- Не отправлять имя таблицы в качестве параметра. Это следует сделать на этапе инициализации.
- Используйте String для параметра id, так как это гораздо более обобщенно.
- Рассмотрите возможность возврата универсального объекта вместо коллекции, поскольку коллекция всегда должна содержать только один объект.
Улучшенный AbstractDao с Spring:
import java.util.Collection;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public abstract class AbstractDao<T> {
protected final RowMapper<T> rowMapper;
protected final String findByIdSql;
protected final JdbcTemplate jdbcTemplate;
protected AbstractDao(RowMapper<T> rowMapper, String tableName,
JdbcTemplate jdbcTemplate) {
this.rowMapper = rowMapper;
this.findByIdSql = "SELECT * FROM " + tableName + "WHERE id = ?";
this.jdbcTemplate = jdbcTemplate;
}
public Collection<T> findById(final String id) {
Object[] params = {id};
return jdbcTemplate.query(findByIdSql, params, rowMapper);
}
}
Как видите, нет обработки исключений или взлома примитивными классами SQL. Этот шаблон закрывает ResultSet для вас, чего я не вижу в вашем коде.
И UserDao:
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class UserDao extends AbstractDao<User> {
private final static String TABLE_NAME = "USERS";
public UserDao(JdbcTemplate jdbcTemplate) {
super(new UserRowMapper(), TABLE_NAME, jdbcTemplate);
}
private static class UserRowMapper implements RowMapper<User> {
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setUserName(rs.getString("username"));
user.setFirstName(rs.getString("fname"));
user.setLastName(rs.getString("lname"));
return user;
}
}
}
Обновлен:
Когда вы знаете, что идентификатор и идентификатор соответствуют одной строке в базе данных, вам следует рассмотреть возможность возврата универсального объекта вместо коллекции.
public T findUniqueObjectById(final String id) {
Object[] params = {id};
return jdbcTemplate.queryForObject(findByIdSql, params, rowMapper);
}
Это делает ваш сервисный код более читабельным, поскольку вам не нужно извлекать пользователя из списка, а только:
User user = userDao.findUniqueObjectById("22");