Получение вставленного id

160
02 августа 2018, 20:00

День добрый. Вопрос такой. Значит есть таблица клиентов в бд. Нужно сразу после добавление новой записи получить ее id. Код привожу ниже. Метод которым пользуюсь не работает. Добавляет в таблицу запись

 public void addNewClient(Client client) {
    PreparedStatement preparedStatement = null;
    Connection connection = null;
    String sql = "INSERT INTO esteamerbase.client (FIO_CLIENT, DATE_BORN, TELEPHONE, SMS, STATUS_CLIENT) " +
            "VALUES (?,?,?,?,?)";
    try {
        connection = getConnection();
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,client.getFio_client());
        preparedStatement.setString(2,client.getDate_born());
        preparedStatement.setLong(3,client.getTelephone());
        preparedStatement.setBoolean(4, client.getSms());
        preparedStatement.setString(5, client.getStatus_client());
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        closeConnection(connection);
        closePreparedStatement(preparedStatement);
    }
}

Получает последний id

public int getLasId(){
    int id_user = 0;
    String sql = "SELECT LAST_INSERT_ID();";
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    try{
        connection = getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(sql);
        while (resultSet.next()){
            id_user = resultSet.getInt(1);
        }
    }catch (SQLException e){
        closeConnection(connection);
        closeStatement(statement);
    }
    return id_user;
}

Дело еще в том, что каждый раз я создаю новое подключение а затем его закрываю. Если его не закрывать то тогда все работает. Но мне не нравится то что они будут постоянно открыты.

Answer 1

В корне неверно понимаете как получать сгенерированные id - ваш способ даст сбой если параллельно к БД стучится несколько разных юзеров/коннектов.

Вам надо создавать стейтмент так:

preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

Далее после выполнения опрашивать сгенерированные ключи (их может быть несколько), через:

ResultSet generatedKeys = preparedStatement.getGeneratedKeys()) {
if (generatedKeys.next()) {
   //получаем имя и значение сгенерированного ключа из ResultSet
}
READ ALSO
Наползание блоков друг на друга

Наползание блоков друг на друга

есть проблема в выравнивании элементов, на данный момент, есть такое (лишнее в коде убрал, чтобы была видна только необходимая структура),...

184
Фильтрация списка элементов

Фильтрация списка элементов

Помогите реализовать фильтрацию имеющегося списка

155
Как осуществляется проверка в Vue?

Как осуществляется проверка в Vue?

Разрабатываю приложение на laravel+vue, и возникло пару вопросов:

138
Ошибка в PhantomJS

Ошибка в PhantomJS

Вот что я пишу, и что выводит

200