JavaFX как получить из определенной строки значение определенного столбца
Возникла проблема во время написания программы. Суть в том, что я отдаю запрос в базу данных(SELECT subscribe FROM users WHERE username="ZabSanek"). Выполняя запрос в MySQL я получаю нужное значение. А вот как организовать это в Java коде? Вот код из класса DataBaseHandler(метод getSubscribe должен возвращать значение из столбца базы данных, то есть значение подписки(оно типа int)):
public int getSubscribe(User user) {
ResultSet resSet = null;
String select = "SELECT subscribe FROM " + Const.USER_TABLE + " WHERE " +
Const.USERS_USERNAME + "=?";
try {
PreparedStatement prSt = getDbConnection().prepareStatement(select);
prSt.setString(1, user.getUserName());
resSet = prSt.executeQuery();
user.setSubscribe(resSet.getInt("subscribe"));
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return user.getSubscribe();
}
Ответы (2 шт):
В любом из тысяч туториалов по работе с JDBC вообще и чтением данных из ResultSet в частности указывается, что перед обращением к данным следует проверить их наличие, вызвав метод ResultSet::next.
Также с момента выпуска Java 7 летом 2011 года следует использовать try-with-resources для корректного закрытия ресурсов.
public int getSubscribe(User user) {
String select = "SELECT subscribe FROM " + Const.USER_TABLE + " WHERE " +
Const.USERS_USERNAME + "=?";
try (PreparedStatement prSt = getDbConnection().prepareStatement(select)) {
prSt.setString(1, user.getUserName());
try (ResultSet resSet = prSt.executeQuery()) {
if (resSet.next()) {
user.setSubscribe(resSet.getInt("subscribe"));
}
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return user.getSubscribe();
}
Ответ человеку выше: Я полностью изменил код метода на Ваш. Но при проверке, значение неверно выдает. Как я понимаю, он неверно берет значение из БД, и передает просто ноль. Код DataBaseHandler класса:
public int getSubscribe(User user) {
String select = "SELECT subscribe FROM " + Const.USER_TABLE + " WHERE " +
Const.USERS_USERNAME + "=?";
try (PreparedStatement prSt = getDbConnection().prepareStatement(select)) {
prSt.setString(1, user.getUserName());
try (ResultSet resSet = prSt.executeQuery()) {
if (resSet.next()) {
user.setSubscribe(resSet.getInt("subscribe"));
}
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return user.getSubscribe();
}
Пользователь сам вводит логин и пароль, и по базе данных в методе проверяется наличие пользователя с таким паролем, после чего я ввёл переменную subscribeValue, куда присваиваю значение из БД: subscribeValue = dbHandler.getSubscribe(user); - Это уже внутри условия, когда в БД найден пользователь с таким логином и паролем, и он берет значение из этой строки найденной. после чего создаётся пользователь, в которого вбиваются данные, которые я получал:
User user = new User();
user.setUserName(loginText);
user.setPassword(loginPassword);
user.setSubscribe(subscribeValue);
AppController.setAuthedUser(user);
loginUser(loginText, loginPassword);
Потом пользователя с такими данными он передает в другой класс. По итогу, логин и пароль передаются правильно, а при выводе subscribeValue я всегда получаю "0", когда в Базе данных вбито значение 111, а тип в БД стоит tinyint, с галочкой на zerofill notnull(Просто для подробности написал)