Вставить в базу данных - PullRequest
0 голосов
/ 13 мая 2011

У меня проблема, у меня есть система для добавления пользователей, я должен проверить, существует ли этот пользователь раньше, чтобы я не мог добавить его снова, я извлек все имя из базы данных в массив. Сначала я проверяю, список массивов пуст, так что я могу добавить пользователя, иначе он проверит, существует он или нет вот код

    if(names.size() == 0){
        dbstatement.executeUpdate("
        insert into users (user_name,user_password,user_type) 
        values ('" + username + "','" + userpassword + "','" + type + "')");
        JOptionPane.showMessageDialog(rootPane, "user added successfully");
    }
    else{                   
        for (int i = 0; i < names.size(); i++) {
            if (username.equals(names.get(i))) {
                JOptionPane.showMessageDialog(rootPane, "Sorry, this name already exist");
                break;
            }
        }
        dbstatement.executeUpdate
        ("insert into users(user_name,user_password,user_type) 
        values ('" + username + "','" + userpassword + "','" + type + "')");
    }

проблема в том, что когда программа нашла имя, существовавшее до того, как он сказал мне, и добавила его, я знаю причину этой проблемы, все, что я хочу знать, где, но кроме того, если внутри цикла for, я хочу, чтобы он сказал мне пользователь существует только для того, чтобы не добавлять его снова

Ответы [ 3 ]

1 голос
/ 13 мая 2011

Просто позвоните в базу данных с каждым именем, чтобы добавить.

Пусть sql попытается вставить имя. Он либо вставит, либо сгенерирует нарушение ключа (при условии, что у вас есть уникальное ограничение на имя).

Если он выдает нарушение ключа, вы знаете, что имя уже есть в базе данных.

Если это не выдает ошибку, то имя было вставлено.

Обработка стилей чтения / выбора / записи - не способ заставить эту работу работать. У него все еще могут быть проблемы, когда другой процесс вставляет новое имя во время между чтением и записью. Это означает, что вам все равно придется проверять ключевые нарушения. Если вам все равно придется проверять наличие ключевых нарушений, с первого же раза сделайте это правильно и попробуйте ввести все имена.

1 голос
/ 13 мая 2011

Просто используйте предложение SQL WHERE, чтобы увидеть, существует ли имя пользователя.Абсолютно не нужно копировать всю таблицу БД в память Java.

preparedStatement = connection.prepareStatement("SELECT id FROM users WHERE user_name = ?");
preparedStatement.setString(1, username);
resultSet = preparedStatement.executeQuery();
boolean exist = resultSet.next();

Оберните это в метод, подобный boolean exist(String username), и переставьте поток кода следующим образом:

if (exist(username)) {
    // Show warning message.
} else {
    // Insert into DB.
}

Примечаниечто PreparedStatement используется вместо Statement.Это предотвращает ваш код от SQL-инъекций .

0 голосов
/ 13 мая 2011
 if(names.size() == 0){
    dbstatement.executeUpdate("
    insert into users (user_name,user_password,user_type) 
    values ('" + username + "','" + userpassword + "','" + type + "')");
    JOptionPane.showMessageDialog(rootPane, "user added successfully");
}
else{   
    if ( names.contains(username) ) {                
            JOptionPane.showMessageDialog(rootPane, "Sorry, this name already exist");
    }
    else {
            dbstatement.executeUpdate
             ("insert into users(user_name,user_password,user_type) 
                  values ('" + username + "','" + userpassword + "','" + type + "')");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...