2017-01-16 3 views
0

У меня есть контактный класс, который имеет имя, адрес электронной почты и номер телефона. Затем у меня есть класс адресной книги, который имеет идентификатор, имя и список контактов. Поэтому я хочу добавить адресную книгу в базу данных mysql. Я просто хочу, чтобы убедиться, что я делаю это правильно, извлекая имена людей, адрес электронной почты и номер телефона из списка контактов с adressbook class.Here мой код до сих пор:Получить значения из списка объектов

AddressBook Класс:

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

Контакт Класс:

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

Код выглядит отлично, за исключением того, что вы не хотите вручную устанавливать идентификатор, если это можно было бы рассматривать как столбец автоматического увеличения. Но это дизайнерское решение, а не проблема Java. –

+1

ID должен быть автоматически создан. Транзакции должны быть совершены и должны быть отменены в порядке исключения. Сеансы должны быть закрыты или возвращены, чтобы втянуть блок finally. –

ответ

0

Почему у вас есть т wo, но только одна таблица? Почему класс AddressBook имеет имя, если нет таблицы addressbook?

Короче говоря, ваша база данных неверна. Чтобы иметь одну адресную книгу с большим количеством контактов, вам нужна таблица addressbook со связью «один ко многим» с таблицей contact.

Не клеится на всю дискуссию о автоматически сгенерированных ключей/идентификаторов, я буду считать, что ваш addressbook имеет действительный id столбец в качестве первичного ключа, и что ваш contact не имеет идентификатор своей собственной, но подтаблицу addressbook, например с первичным ключом id, firstname, lastname, где id является идентификатором адресной книги. Это плохой дизайн, но, возможно, вы так хотите.

Если да, то ваш код может быть:

// 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(); 
    } 
} 

Обратите внимание, как executeUpdate() является внутриfor петли.

Для повышения производительности, было бы лучше использовать пакетные вставки:

// 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

Спасибо за вашу помощь. Я собираюсь изменить дизайн базы данных –

Смежные вопросы