为什么我无法在GUI表中显示MySQL信息?

时间:2009-12-15 04:13:05

标签: java mysql user-interface

我有一个“经理”类和“BirthList”框架。在我的BirthList框架中,我有一个GUI表,显示mySQL表中的所有数据,但它确实如下:

当我打开这个框架时,我看到我添加的最后一个数据,当我点击关闭按钮时,首先将从我的表中删除最后一个数据,然后框架将关闭,如果我再次打开框架,我看到MySQL表格中的整个数据,我也会看到两次最后的数据。为什么呢?

我想在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);
        }
    }
}

2 个答案:

答案 0 :(得分: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
  5. 从1.您应该了解每种方式和时间()以使用static。从2.你应该学会如何在WHERE子句的帮助下学习如何执行特定的查询,这样你就不需要将整个数据库内容传递到Java的内存中,只是为了检查是否存在。从3.您应该了解如何以适当的方式获取和关闭资源以避免资源泄漏以及如何使用PreparedStatement从SQL注入中保存代码。从4开始,您应该了解如何将完整的JDBC图像完美地放在一起。

    希望这会有所帮助。祝你好运。

答案 1 :(得分:1)

对于您的isAddBirth请求,可以将其替换为

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

对于其他标准,然后在结果集中,您将没有结果,或者只有一个(假设您在表中有一种方式,不会根据他们的姓名,姓氏出生日期重复输入。 ..)

使用Java变量命名sql表和sql行名称可能对你有用,所以在修改的情况下不会出现连贯性问题。

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

然后你可以简单地看看结果集是否已经返回,并根据这个设置你的返回值。