Реализую регистрацию и авторизацию пользователей для дальнейшего использования, с регистрацией проблем нем, все данные уходят в БД, а вот с авторизацией у меня проблемы, компилятор выдает исключение - java.sql.SQLException: Operation not allowed after ResultSet closed, может кто подскажет кто в чем проблема, ибо я не понял.
Это класс где происходит подключение к БД и SQL запросы
public class DatabaseHandler {
public static Connection getConnection() throws SQLException, IOException {
Properties props = new Properties();
try(InputStream in = Files.newInputStream(Paths.get("files/database.properties.txt"))){
props.load(in);
}
String url = props.getProperty("url");
String username = props.getProperty("username");
String password = props.getProperty("password");
return DriverManager.getConnection(url, username, password);
}
static public void singUpUser (User user) {
String sqlCommand = "INSERT INTO "+ Const.TABLE + "(" + Const.USERS_FIO + "," + Const.USERS_PASS + ","
+ Const.USERS_MAIL + ")" + " VALUES (?,?,?);";
try {
Class.forName("com.mysql.jdbc.Driver").getDeclaredConstructor().newInstance();
try (Connection conn = getConnection()) {
System.out.println("Подключение успешно");
PreparedStatement preparedStmt = conn.prepareStatement(sqlCommand);
preparedStmt.setString (1, user.getFioField());
preparedStmt.setString (2, user.getPassword());
preparedStmt.setString (3, user.getMail());
preparedStmt.execute();
System.out.println("Данные внесены");
}
} catch (Exception ex) {
System.out.println("Ошибка подключения");
System.out.println(ex);
}
}
public ResultSet getUser (User user){
ResultSet resultSet = null;
String sqlCommand2 = "SELECT * FROM "+ Const.TABLE + " WHERE " + Const.USERS_MAIL + "=? AND " +
Const.USERS_PASS + "=?";
try {
Class.forName("com.mysql.jdbc.Driver").getDeclaredConstructor().newInstance();
try (Connection conn = getConnection()) {
System.out.println("Подключение успешно");
PreparedStatement preparedStmt = conn.prepareStatement(sqlCommand2);
preparedStmt.setString (1, user.getPassword());
preparedStmt.setString (2, user.getMail());
resultSet = preparedStmt.executeQuery();
System.out.println("OK!");
}
} catch (Exception ex) {
System.out.println("Ошибка подключения");
System.out.println(ex);
}
return resultSet;
}
}
Это класс контроллера (пишу на javaFX)
public class Controller {
@FXML
private TextField passField;
@FXML
private TextField passwordField;
@FXML
private TextField fioField;
@FXML
private Button registrButton;
@FXML
private TextField mailField;
@FXML
private Button enter;
@FXML
private TextField loginField;
@FXML
void initialize() {
enter.setOnAction(event -> {
String loginText = loginField.getText().trim();
String passwordText = passField.getText().trim();
if (!loginText.equals("") && !passwordText.equals("")) {
loginUser(loginText, passwordText);
} else System.out.println("введите данные");
});
registrButton.setOnAction(event -> {
signUpNewUser();
});
}
private void signUpNewUser() {
DatabaseHandler databaseHandler = new DatabaseHandler();
String fio = fioField.getText();
String pass = passwordField.getText();
String mail = mailField.getText();
User user = new User(fio, pass, mail);
databaseHandler.singUpUser(user);
}
private void loginUser(String loginText, String passwordText) {
DatabaseHandler databaseHandler = new DatabaseHandler();
User user = new User();
user.setMail(loginText);
user.setPassword(passwordText);
ResultSet resultSet = databaseHandler.getUser(user);
int counter = 0;
try {
while (resultSet.next()){
counter++;
}
} catch (SQLException ex){
ex.printStackTrace();
}
if (counter >= 1 ) {
System.out.println("OK");
}
}
}
тут собственно геттеры и сеттеры
package server;
public class User {
private String fioField;
private String password;
private String mail;
public User(String fioField, String password, String mail) {
this.fioField = fioField;
this.password = password;
this.mail = mail;
}
public User() {
}
public String getFioField() {
return fioField;
}
public void setFioField(String fioField) {
this.fioField = fioField;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
}
Вроде бы все необходимое указал, если поможете - буду признателен. Заранее благодарю.
Скорее всего это потому, что у вас try (Connection conn = getConnection()) то есть try with resourses.
После выполнения которого сам Connection закрывается, и, соответсвенно, нечего фетчить в цикле while (resultSet.next()).
Лучше сделайте сразу фетч там же и верните не ResultSet, а List<User>. А в самом методе уже проверяйте количество в списке
Для формирования List нечто подобное(предполагается, что поля в вашем SQL запросе FIO, PASSWORD и MAIL):
........
List<User> users = new ArrayList<>();
........
while (resultSet.next()){
User user = new User(resultSet.getString('FIO'), resultSet.getString('PASSWORD'), resultSet.getString('MAIL'));
users.add(user);
}
.....
return users;
Это все вы делаете в методе getUser
То есть, мы бежим по ResultSet(листаем его через next()) и маппим данные в класс User. Собираем по нему список и возвращаем.
P.S. вот подобный фетч нашел на enSO
P.P.S перестроенный метод loginUser
private void loginUser(String loginText, String passwordText) {
DatabaseHandler databaseHandler = new DatabaseHandler();
User user = new User();
user.setMail(loginText);
user.setPassword(passwordText);
try {
List<User> users = databaseHandler.getUser(user);
if(null != users && users.size() > 0){
System.out.println("OK");
}
} catch (SQLException ex){
ex.printStackTrace();
}
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости