我创建了一个 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来做这个程序。有什么想法可以解决这个问题吗?提前谢谢你
在 actionPerformed 方法中,也许您忘记在数据库中获取结果,或者会话关闭时没有任何变化。
public DatabaseConnector(String sqlQuery) {
this();
try {
this.preparedStatement = connection.prepareStatement(sqlQuery);
this.preparedStatement.executeUpdate();
也许您需要一行:
this.preparedStatement.commit();