не отрабатывает авторизацию

220
16 апреля 2019, 05:40

Реализую регистрацию и авторизацию пользователей для дальнейшего использования, с регистрацией проблем нем, все данные уходят в БД, а вот с авторизацией у меня проблемы, компилятор выдает исключение - 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;
    }
}

Вроде бы все необходимое указал, если поможете - буду признателен. Заранее благодарю.

Answer 1

Скорее всего это потому, что у вас 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();
    }
}
READ ALSO
Java Selenium запись видео

Java Selenium запись видео

На сайте есть анимационный блок, анимация которого производится с применением html5, css, и jsМожно ли как то записать эту анимацию в gif? Использую...

201
RemoteServiceException: Bad notification for startForeground

RemoteServiceException: Bad notification for startForeground

Сейчас для того чтобы опубликовать обновление приложения в PlayМаркет, требуется API не ниже 26Иначе выдает ошибку:

282
SQLException при работе с БД

SQLException при работе с БД

Есть такие методы:

256
Написание текста снизу вверх

Написание текста снизу вверх

Есть JtextArea в него вводится текст справа налево посредством:

206