2011-05-12 26 views
0

私は問題を抱えています。ユーザーを追加するシステムがあります。このユーザーが存在するかどうかを確認してから再度追加しません。データベースからすべての名前をarraylistに取得しました。配列リストが空の場合、私は他のユーザーを追加できるように、彼は が存在するかどう彼がチェックする最初のチェックここでは、コードデータベースに挿入

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 + "')"); 
    } 

問題があり、彼は私に言った前に、プログラムは名前が存在したときであります彼を追加してください、私はこの問題の原因を知っています。私はループ内のどこにいるのか知りたがっています。私は彼に、ユーザが存在していると私に言いたければ、もう一度それを加えないようにします。

+0

あなたはこれを指定していないが、['upsert'](http://en.wikipedia.org/wiki/Upsert)が必要かどうかを検討していることは知っています。 – onedaywhen

答えて

1

ユーザー名が存在するかどうかを確認するには、SQL WHERE句を使用します。 DBテーブル全体を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)ような方法で、次のようにあなたのコードの流れを並べ替え:PreparedStatement代わりにStatementのに使用されている

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

注こと。これにより、あなたのコードはSQL injection attacksになりません。

0
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 + "')"); 
    } 
} 
1

追加する各名前のデータベースを呼び出すだけです。

名前を挿入しようとします。キー違反が挿入されるか、スローされます(名前に一意の制約があると仮定します)。

キー違反が発生した場合、その名前はすでにデータベースに登録されています。

エラーが発生しない場合は、名前が挿入されています。

読み取り/決定/書き込みスタイルの処理は、この作業を行う方法ではありません。読み取りと書き込みの間に別のプロセスが新しい名前を挿入すると、問題が発生する可能性があります。これは、とにかくキーの違反をチェックする必要があることを意味します。とにかく鍵の違反をチェックしなければならない場合は、最初に正しく実行し、すべての名前を挿入してみてください。

+0

+1正しいアプローチ。 OPのアプローチが拡張された場合、「フロントエンド」コードですべてのデータベース制約が複製され、プロセスにバグを導入するリスクが(ほぼ確実に)増加します。 – onedaywhen

関連する問題