2017-01-16 8 views
0

私は人名、電子メール、電話番号を持つ連絡先クラスを持っています。私は次に、ID、名前、連絡先のリストを持つアドレス帳クラスを持っています。だから私はmysqlデータベースにアドレス帳を追加したい。私はちょうどclass.Hereは、これまでの私のコードですadressbookからの連絡先のリストからの電子メール、電話番号、私は人物名を検索することによって、これを正しくやっていることを確認したい:オブジェクトのリストから値を取得する

アドレス帳クラス:

public class AddressBook{ 
    private int id; 
    private String name; 
    private List<Contact> contacts; 
    // getters and setters 
} 

Contactクラス:

public class Contact 
{ 
    private String firstName, lastName, email, phoneNum; 
    // getters and setters 
} 

DBクラス:

public boolean insert(AddressBook addressBook) 
    { 
     boolean success = false; 
     int executedValue = 0; 

     try 
     { 
      Connection conn = DBConnection.getConnection(); 
      String query = "INSERT INTO addressbook (id, firstname, lastname, email, phonenum)" 
        + "VALUEs (?,?,?,?,?)"; 
      PreparedStatement stmt = conn.prepareStatement(query); 
      stmt.setInt(1, addressBook.getId()); 

      List<Contact> contacts = addressBook.getContacts(); 

      for(Contact contact : contacts) 
      { 
       stmt.setString(2, contact.getFirstName()); 
       stmt.setString(3, contact.getLastName()); 
       stmt.setString(4, contact.getEmail()); 
       stmt.setString(5, contact.getPhoneNum()); 
      } 

      executedValue = stmt.executeUpdate(); 
      success = executedValue > 0; 
     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
     } 
     return success; 
    } 
+1

うん、それはうまくいくのですか? –

+1

自動増分列として扱うことができる場合は、手動でIDを設定したくない場合を除いて、コードは正常に見えます。しかしこれは設計上の決定であり、Javaの問題ではありません。 –

+1

IDを自動作成する必要があります。トランザクションはコミットする必要があり、例外でロールバックする必要があります。セッションを閉じて、最終的にブロックするために戻す必要があります。 –

答えて

0

なぜトン持っていますテーブルは1つだけですaddressbookテーブルがない場合、AddressBookクラスに名前が付いているのはなぜですか?

要するに、データベースが間違っています。多数の連絡先を持つ単一のアドレス帳を使用するには、contactテーブルへの1対多の関連付けを持つaddressbookテーブルが必要です。

自動生成キー/識別子について全体の議論になっていない、私はあなたのaddressbookが主キーとして有効なid列があり、そしてあなたのcontactは、独自のIDを持っていないということを前提としていますが、あるでしょうaddressbookのサブテーブル、例えば主キーがid, firstname, lastnameの場合、idはアドレス帳IDです。それは悪いデザインですが、多分あなたはそれをそうしたいと思っています。

もしそうなら、あなたのコードは次のようになります。executeUpdate()内部forループがどのように

// Insert AddressBook 
String sql1 = "INSERT INTO addressbook (id, name) VALUES (?,?)" 
try (PreparedStatement stmt = conn.prepareStatement(sql1)) { 
    stmt.setInt(1, addressBook.getId()); 
    stmt.setString(2, addressBook.getName()); 
    stmt.executeUpdate(); 
} 

// Insert Contacts 
String sql2 = "INSERT INTO contact" + 
      " (id, firstname, lastname, email, phonenum)" + 
      " VALUES (?,?,?,?,?)"; 
try (PreparedStatement stmt = conn.prepareStatement(sql2)) { 
    stmt.setInt(1, addressBook.getId()); 
    for (Contact contact : addressBook.getContacts()) { 
     stmt.setString(2, contact.getFirstName()); 
     stmt.setString(3, contact.getLastName()); 
     stmt.setString(4, contact.getEmail()); 
     stmt.setString(5, contact.getPhoneNum()); 
     stmt.executeUpdate(); 
    } 
} 

注意してください。パフォーマンスのために

、バッチ挿入を使用する方が良いでしょう:

// Insert Contacts 
String sql2 = "INSERT INTO contact" + 
      " (id, firstname, lastname, email, phonenum)" + 
      " VALUES (?,?,?,?,?)"; 
try (PreparedStatement stmt = conn.prepareStatement(sql2)) { 
    stmt.setInt(1, addressBook.getId()); 
    for (Contact contact : addressBook.getContacts()) { 
     stmt.setString(2, contact.getFirstName()); 
     stmt.setString(3, contact.getLastName()); 
     stmt.setString(4, contact.getEmail()); 
     stmt.setString(5, contact.getPhoneNum()); 
     stmt.addBatch(); 
    } 
    stmt.executeBatch(); 
} 

INSERT文は本当にすなわちので、更新回数が無意味であるチェック、0更新カウントを返すことによって、黙って失敗することはできません。もちろん、重複キー、バリューオーバーフロー、不良SQLなどで失敗することもありますが、すべてがSQLExceptionです。

+0

データベース設計を変更する –

関連する問題