Java Swing 中的表未从 mysql 数据库获取到 JTable

问题描述 投票:0回答:1

我创建了一个 DataConnector 类,它将我的程序连接到数据库。然后我创建了默认构造函数 DataConnector(),这将是其他参数化构造函数的公共部分。所以我使用参数化构造函数databaseConnector(String sqlQuery, JTable table)将表从mysql数据库获取到我的程序(类StaffLibraryTable)。问题是当我运行程序时,会获取数据库,但第二次将某项添加到表后,新行不会出现在屏幕上,但数据库中有一个新行。这是我的数据库连接器类:

package LibraryFiles;


import net.proteanit.sql.DbUtils;
import javax.swing.*;
import javax.swing.table.TableModel;
import java.sql.*;
public class DatabaseConnector {
    String url = "jdbc:mysql://localhost:3306/librarytest";
    String uname = "root";
    String password = "";
    Connection connection;
    Statement statement;
    PreparedStatement preparedStatement;
    ResultSet resultSet;
    TableModel tableModel;

    public DatabaseConnector(){
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            this.connection = DriverManager.getConnection(url, uname, password);
            this.statement = connection.createStatement();
        } catch (ClassNotFoundException | SQLException e) {
            System.out.println("error in DatabaseConnector()- first part");
            System.out.println(e.getMessage());

        }
    }
    public DatabaseConnector(String sqlQuery) {
        this();
        try {
            this.preparedStatement = connection.prepareStatement(sqlQuery);
            this.preparedStatement.executeUpdate();
        } catch (SQLException e) {
            System.out.println("error in DatabaseConnector(String sqlQuery)-first part");
            System.out.println(e.getMessage());
            System.out.println(e.getErrorCode());
        } finally {
            try {
                if (this.connection != null) {
                    this.connection.close();
                    this.statement.close();
                }
            } catch (SQLException e) {
                System.out.println("error in DatabaseConnector(String sqlQuery)- second part");
                System.out.println(e.getMessage());
            }
        }

    }
    public DatabaseConnector(String sqlQuery, TableModel tableModel) {
        this();
        try{
            resultSet = statement.executeQuery(sqlQuery);
            this.tableModel = tableModel;
        } catch (SQLException e) {
                System.out.println("error in DatabaseConnector(String sqlQuery, TableModel      tableModel)- first part");
            System.out.println(e.getMessage());
        } finally {
            try {
                if (this.connection != null) {
                    this.connection.close();
                    this.statement.close();
                }
            } catch (SQLException e) {
                System.out.println("error in DatabaseConnector(String sqlQuery, TableModel tableModel)- second part");
                System.out.println(e.getMessage());
            }
        }
    }
    public static  TableModel generateTableModelStaffTable(){
        TableModel tableModel1 = null;
        DatabaseConnector databaseConnector = new DatabaseConnector("select * from stafflist", tableModel1);
        return tableModel1;
    }


    public DatabaseConnector(String sqlQuery, JTable table) {
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection(url, uname, password);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sqlQuery);
            if (!resultSet.next()) System.out.println("result set is empty");
            tableModel = DbUtils.resultSetToTableModel(resultSet);
            table.setModel(tableModel);
        } catch (ClassNotFoundException | SQLException e) {
            System.out.println("error in DatabaseConnector(String sqlQuery, JTable table) - first part");
            System.out.println(e.getMessage());
        } finally {
            try {
                if (this.connection != null) {
                    this.connection.close();
                    this.statement.close();
                }
            } catch (SQLException e) {
                System.out.println("error in DatabaseConnector(String sqlQuery, JTable table) - second part");
                System.out.println(e.getMessage());
            }
        }
    }
    static boolean loginChecker (String providedLoggin){
        boolean wynik = true;
        try {
            DatabaseConnector databaseConnector = new DatabaseConnector();
            String sqlQuery = String.format("select * from loggintable where login = '%s'", providedLoggin);
            databaseConnector.resultSet = databaseConnector.statement.executeQuery(sqlQuery);
            if(databaseConnector.resultSet.next()) wynik = false;
        } catch (SQLException e) {
            System.out.println("error in LoginChecker");
            System.out.println(e.getMessage());
        }
        return wynik;
    }
    static boolean logginService(String providedLoggin,String providedPassword){
        boolean isValidPassword = false;
        DatabaseConnector databaseConnector = new DatabaseConnector();
        try {
            String sqlQuery = String.format("select * from loggintable where login = '%s' AND password = '%s'", providedLoggin, providedPassword);
            databaseConnector.resultSet = databaseConnector.statement.executeQuery(sqlQuery);
            if(databaseConnector.resultSet.next()) {
                isValidPassword = true;
            }
            else{
                JOptionPane.showMessageDialog(null, "Zły login lub hasło");
                isValidPassword = false;
            }
        } catch (SQLException e) {
            System.out.println("error in LoginService");
            System.out.println(e.getMessage());
        }finally {
            try {
                if (databaseConnector.connection != null) {
                    databaseConnector.connection.close();
                    databaseConnector.statement.close();
                }
            } catch (SQLException e) {
                System.out.println("error in DatabaseConnector(String sqlQuery, JTable table) - second part");
                System.out.println(e.getMessage());
            }
        }
        return isValidPassword;
    }

}

这是我创建 DatabaseConnector 对象来更新 myJTable 的类:

Package LibraryFiles;


import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class StaffLibraryTable {
    private JPanel mainPanel, leftBottomPanel, rightPanel, leftPanel;
    private JTable staffTable;
    private JTextField idWorkerTextField, nameTextField, surnameTextField, addressTextField, postcodeTextField, cityTextField, searchTextField, loginTextField;
    private JButton addButton, updateButton, deleteButton, clearButton;
    private JPasswordField passwordTextField;

    private JScrollPane scrolPane;
    private JComboBox statusComboBox;
    private JLabel searchLabel,loginLabel, passwordLabel;

    public StaffLibraryTable() {
        JFrame frame = new JFrame("Staff");
        frame.setContentPane(mainPanel);
        frame.setVisible(true);
        frame.setSize(900,800);
        new DatabaseConnector("select * from stafflist", staffTable);
        frame.pack();
        TableRowSorter rowSorter = new TableRowSorter(staffTable.getModel());
        staffTable.setRowSorter(rowSorter);

        searchTextField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                String text = searchTextField.getText();
                if(!text.trim().equals(0)){
                    rowSorter.setRowFilter(RowFilter.regexFilter(String.format(".*^%s.*$",text)));
                }
            }
            @Override
            public void removeUpdate(DocumentEvent e) {
                String text = searchTextField.getText();
                if(!text.trim().equals(0)){
                    rowSorter.setRowFilter(RowFilter.regexFilter(String.format(".*^%s.*$",text)));
                }
            }
            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });
        staffTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int selectedRow = staffTable.getSelectedRow();
                TableModel tableModel = staffTable.getModel();
                nameTextField.setText((String) tableModel.getValueAt(selectedRow,1));
                surnameTextField.setText((String) tableModel.getValueAt(selectedRow,2));
                addressTextField.setText((String) tableModel.getValueAt(selectedRow,3));
                postcodeTextField.setText((String) tableModel.getValueAt(selectedRow,4));
                cityTextField.setText((String) tableModel.getValueAt(selectedRow,5));
                loginTextField.setText((String) tableModel.getValueAt(selectedRow,6));
            }
        });

        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if (DatabaseConnector.loginChecker(loginTextField.getText())) {
                    if (idWorkerTextField.getText().equals(null) | idWorkerTextField.getText().equals("")){
                        String name = nameTextField.getText();
                        String surname = surnameTextField.getText();
                        String address = addressTextField.getText();
                        String postcode = postcodeTextField.getText();
                        String city = cityTextField.getText();
                        String login = loginTextField.getText();
                        String status = statusComboBox.getSelectedItem().toString();

                        String sqlQuery = String.format("insert into stafflist" +
                                "(`name`, `surname`, `address`, `postcode`, `city`,`login`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", name, surname, address, postcode,
                                city, login);
                        DatabaseConnector databaseConnector = new DatabaseConnector(sqlQuery);
                        JOptionPane.showMessageDialog(null, "Dodano pracownika");
                        idWorkerTextField.setText("");
                        nameTextField.setText("");
                        surnameTextField.setText("");
                        addressTextField.setText("");
                        postcodeTextField.setText("");
                        cityTextField.setText("");
                        loginTextField.setText("");
                        nameTextField.requestFocus();
                        new DatabaseConnector("select * from stafflist", staffTable);
                    }
                    else{
                        JOptionPane.showMessageDialog(null, "Wciśnij przycisk Clear żę przygotować miejsce na nowy wpis");
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Podany login jest już zajęty");

                }
            }
        });
        clearButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                idWorkerTextField.setText("");
                nameTextField.setText("");
                surnameTextField.setText("");
                addressTextField.setText("");
                postcodeTextField.setText("");
                cityTextField.setText("");
                loginTextField.setText("");
                nameTextField.requestFocus();
            }
        });
        addButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

            }
        });
    }
        public static void main (String[]args){
            new StaffLibraryTable();
        }

我希望我的程序在点击“添加”按钮后直接向 JTable 添加新行,这样我就可以看到屏幕上 JTable 的变化。我用Intelij来做这个程序。有什么想法可以解决这个问题吗?提前谢谢你

java swing oop jdbc jtable
1个回答
0
投票

在 actionPerformed 方法中,也许您忘记在数据库中获取结果,或者会话关闭时没有任何变化。

public DatabaseConnector(String sqlQuery) {
        this();
        try {
            this.preparedStatement = connection.prepareStatement(sqlQuery);
            this.preparedStatement.executeUpdate();

也许您需要一行:

this.preparedStatement.commit();

另请参阅: Java 8 中回滚()语句执行失败的最佳方法是什么?

© www.soinside.com 2019 - 2023. All rights reserved.