2017-01-16 3 views
0

나는 사람 이름, 전자 메일 및 전화 번호가있는 대화 상대 클래스가 있습니다. 그런 다음 ID, 이름 및 연락처 목록이있는 주소록 클래스가 있습니다. 그래서 mysql 데이터베이스에 주소록을 추가하고 싶다.개체 목록에서 값 가져 오기

주소록 클래스 :

public class AddressBook{ 
    private int id; 
    private String name; 
    private List<Contact> contacts; 
    // getters and setters 
} 
난 그냥이 사람의 이름을 검색하여 제대로이 일을하고 있는지 확인하려면는 adressbook에서 연락처 목록에서 이메일과 전화 번호 class.Here 지금까지 내 코드입니다

연락 클래스 :

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

왜 t해야합니까 클래스가 하나만 있지만 테이블은 하나입니까? addressbook 테이블에없는 경우 AddressBook 클래스에 이름이있는 이유는 무엇입니까?

요약하면 데이터베이스가 잘못되었습니다. 연락처가 많은 단일 주소록을 사용하려면 contact 테이블에 일 대 다 연관이있는 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(); 
} 

삽입 문은 정말 그렇게 갱신 카운트가 무의미 확인, 0 갱신 카운트를 반환하여, 자동으로, 즉 실패 할 수 없습니다. 그들은 물론 중복 키, 값 오버 플로우, 잘못된 SQL 등에서는 실패 할 수 있지만 모두가 SQLException을 발생시킵니다.

+0

고마워요. 데이터베이스 디자인 변경 –

관련 문제