2009-12-15 88 views
-1

我有一個「經理」類和「BirthList」框架。在我的BirthList框架中,我有一個顯示mySQL表中所有數據的GUI表,但它的確如此:爲什麼我不能在我的GUI表中顯示我的MySQL信息?

當我打開這個框架時,我看到最後添加的數據,當我點擊關閉按鈕,首先最後的數據將從我的表中刪除,然後框架將被關閉,如果我再次打開框架,我會看到在MySQL tabel中的整個數據,我也會看到最後兩次數據。爲什麼?

我想表明我的GUI表從MySQL表我的數據。如果我關閉框架然後打開它,我希望看到之前添加的所有那些數據+我最近添加的新數據。

用戶類:

public class Manager { 
    Logger logger = Logger.getLogger(this.getClass().getName()); 
    private static Connection conn = DBManager.getConnection(); 
    public static Admin admin; 
    private static List<Birth> birthList; 

    public static void addBirth(String name, String family, String fatherName, String mName, String dOfBirth, String pOfBirth) { 
     try { 
      Statement stmt = conn.createStatement(); 
      stmt.executeUpdate("INSERT INTO birthtable(name,family,fatherName,motherName,dateOfBirth,placeOfBirth)" + "VALUES('" + name + "','" + family + "','" + fatherName + "','" + mName + "','" + dOfBirth + "','" + pOfBirth + "')"); 
     } catch (SQLException ex) { 
      Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    public static boolean isAddBirth(String name, String family, String fatherName, String mName, String dOfBirth, String pOfBirth) { 
     boolean bool = true; 
     Statement stmt = null; 
     try { 
      stmt = conn.createStatement(); 
     } catch (SQLException ex) { 
      Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     ResultSet rst = null; 
     try { 
      rst = stmt.executeQuery("SELECT * FROM birthtable"); 
     } catch (SQLException ex) { 
      Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     try { 
      while (rst.next()) { 
       if (rst.getString(2).equals(name) && rst.getString(3).equals(family) && rst.getString(4).equals(fatherName) && rst.getString(5).equals(mName) && rst.getString(6).equals(dOfBirth) && rst.getString(7).equals(pOfBirth)) { 
        bool = false; 
       } else { 
        bool = true; 
       } 
      } 
     } catch (SQLException ex) { 
      Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return bool; 
    } 

    public static void addToBirthListFromMySQL() throws SQLException { 
     Birth list1 = null; 
     Statement stmt = conn.createStatement(); 
     ResultSet rs = stmt.executeQuery("SELECT * FROM birthtable"); 

     while (rs.next()) { 
      String s1 = rs.getString(2); 
      if (rs.wasNull()) { 
       s1 = null; 
      } 
      String s2 = rs.getString(3); 
      if (rs.wasNull()) { 
       s2 = null; 
      } 
      String s3 = rs.getString(4); 
      if (rs.wasNull()) { 
       s3 = null; 
      } 
      String s4 = rs.getString(5); 
      if (rs.wasNull()) { 
       s4 = null; 
      } 
      String s5 = rs.getString(6); 
      if (rs.wasNull()) { 
       s5 = null; 
      } 
      String s6 = rs.getString(7); 
      if (rs.wasNull()) { 
       s6 = null; 
      } 
      list1 = new Birth(s1, s2, s3, s4, s5, s6); 
      birthList = admin.getBirthList(); 
      if (birthList == null) { 
       birthList = new ArrayList<Birth>(); 
      } 
      birthList.add(list1); 
     } 
     admin.setBirthList(birthList); 
    } 
} 

BirthList幀:

public class BirthList extends javax.swing.JFrame { 

    private Admin admin; 
    List<Birth> list; 
    DefaultTableModel model; 

    /** Creates new form BirthList */ 
    public BirthList(Admin admin) { 
     initComponents(); 
     this.admin = admin; 
     Manager.admin = admin; 
     try { 
      Manager.addToBirthListFromMySQL(); 
     } catch (SQLException ex) { 
      Logger.getLogger(BirthList.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     fillTable(); 
    } 

    private void cancleBActionPerformed(java.awt.event.ActionEvent evt) {           
     for(int i=0;i<jTable1.getRowCount();i++){ 

      model.removeRow(i); 
      model.fireTableDataChanged(); 
     } 

     int r = JOptionPane.showConfirmDialog(this, "Are you sure?", "Message", JOptionPane.YES_NO_CANCEL_OPTION); 
     if(r==JOptionPane.YES_OPTION) 
      this.dispose(); // TODO add your handling code here: 
    }  

    public void fillTable() { 
     String[] columNames = {"name", "family", "father's name", "mother's name", "date of birth", "place of birth"}; 
     List<Birth> birth = admin.getBirthList(); 
     if (birth==null) { 
      JOptionPane.showMessageDialog(this, "Death list is empty! at first ,add a person.", "Error", JOptionPane.ERROR_MESSAGE); 
     }else{ 
      Object[][] data = new Object[birth.size()][columNames.length]; 
      for (int i = 0; i < data.length; i++) { 
       Birth birth1 = birth.get(i); 

       data[i][0] = birth1.getName(); 
       data[i][1] = birth1.getFamily(); 
       data[i][2] = birth1.getFatherName(); 
       data[i][3] = birth1.getMotherName(); 
       data[i][4] = birth1.getDateOfBirth(); 
       data[i][5] = birth1.getPlaceOfBirth(); 
      } 
      model = new DefaultTableModel(data, columNames); 
      jTable1.setModel(model); 
     } 
    } 
} 
+0

你的函數「isAddBirth」的那種,怎麼說...爲什麼沒有做一個真正的SQL請求而不是大量迭代與結果集?至少在找到結果集時添加一箇中斷... – 2009-12-15 04:23:21

+0

我該怎麼做? – Johanna 2009-12-15 04:29:33

+0

你能給我舉個例子嗎? – Johanna 2009-12-15 04:30:07

回答

1

爲了您isAddBirth請求時,它可以通過

SELECT * 
FROM birthtable 
WHERE fatherName LIKE \"pFatherName\" 
AND name LIKE \"pName\"; 

等等的其它標準,則替換在結果集中你不會有結果,或者只有一個結果(假設你在表中有一個不重複條目的方法根據他們的名字,姓氏的出生日期...)

也許它可能是有用的你的名字你的sql表和SQL行名稱與Java變量,所以在修改的情況下不會有一致性問題。

final String birthTable = "birthtable"; 
final String fatherName = "fatherName"; 

然後你可以簡單地看看結果集是否已經返回了一些東西,並根據這個設置你的返回值。

+1

雖然我同意,但代碼非常非常難過 – 2009-12-15 05:01:22

2

老實說說,我要聽起來刺耳,但就是這個道理。發佈的代碼是可怕的。我知道這應該是一個評論,但這不適合評論。我只是想強烈建議您採取以下步驟:

  1. 這裏學習Java:http://java.sun.com/docs/books/tutorial/
  2. 瞭解SQL這裏:http://www.w3schools.com/sql/
  3. 這裏瞭解JDBC:http://java.sun.com/docs/books/tutorial/jdbc/
  4. 這裏瞭解DAO:http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html

從1.你應該學習如何以及何時(不是)使用static。從2.你應該學習如何在WHERE條款的幫助下執行特定的查詢,這樣你就不需要將整個數據庫內容拖入Java的內存中,並循環遍歷它,只是爲了檢查是否存在某些內容。從3開始,您應該瞭解如何以合適的方式獲取和關閉資源,以避免資源泄漏,以及如何使用PreparedStatement從SQL注入中保存代碼。從4.你應該學習如何把完整的JDBC圖片很好地結合在一起。

希望這會有所幫助。祝你好運。

+0

謝謝!我會按照以下步驟操作: ) – Johanna 2009-12-15 05:12:12

+0

我希望我可以upvote這個答案1,000倍,1,000多次。 – delfuego 2009-12-15 15:00:30

相關問題