Пусто или нет, но выполнение следующих действий всегда неисправно :
resultSet = statement.executeQuery(sql);
string = resultSet.getString(1); // Epic fail. The cursor isn't set yet.
Это не ошибка. Это задокументированное поведение . Каждый приличный учебник по JDBC упоминает об этом. Вам нужно установить курсор ResultSet с помощью next()
, прежде чем вы сможете получить доступ к любым данным.
Если вам действительно интересно, существует ли предположительно уникальная строка или нет, просто проверьте результат next()
. Например в фиктивном UserDAO
классе:
public boolean exist(String username, String password) throws SQLException {
boolean exist = false;
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id FROM user WHERE username = ? AND password = MD5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (ResultSet resultSet = statement.executeQuery()) {
exist = resultSet.next();
}
}
return exist;
}
Если вы действительно ожидаете только ноль или одну строку, то просто сделайте что-то вроде:
public User find(String username, String password) throws SQLException {
User user = null;
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email, birthdate FROM user WHERE username = ? AND password = MD5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (resultSet = statement.executeQuery()) {
if (resultSet.next()) {
user = new User(
resultSet.getLong("id"),
resultSet.getString("username"),
resultSet.getString("email"),
resultSet.getDate("birthdate"));
}
}
}
return user;
}
, а затем просто обработайте его соответствующим образом в объекте business / domain, например,
User user = userDAO.find(username, password);
if (user != null) {
// Login?
}
else {
// Show error?
}
Если вы действительно ожидаете только ноль или много строк, то просто сделайте что-то вроде:
public List<User> list() throws SQLException {
List<User> users = new ArrayList<User>();
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email, birthdate FROM user");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
users.add(new User(
resultSet.getLong("id"),
resultSet.getString("username"),
resultSet.getString("email"),
resultSet.getDate("birthdate")));
}
}
return users;
}
, а затем просто обработайте его соответствующим образом в объекте business / domain, например,
List<User> users = userDAO.list();
if (!users.isEmpty()) {
int count = users.size();
// ...
}
else {
// Help, no users?
}