我最近一直在嘗試通過從 GUI 獲取用戶輸入來寫入資料庫,并且我想將來自 GUI 的用戶輸入存盤在 netbeans 上的 derby 資料庫中。目前,我有一些代碼,但它似乎不起作用,因為當我運行 GUI 并開始輸入應該存盤在資料庫中我的程式后端的資料時,它不存盤那個在 GUI 中輸入的資料。它不會將任何資料加載到資料庫中!
這是寫入資料庫的代碼:
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author Hammad
*/
public class WritePlayerDB
{
private final DBConnection dbc;
private final Connection conn;
private Statement stmt;
String insertQuery;
public WritePlayerDB()
{
dbc = new DBConnection();
conn = dbc.getConnection();
}
public void writeToPlayerDB()
{
try {
int playerID = 0;
insertQuery = "INSERT INTO 'PLAYERINFO' ('PLAYER_ID', 'PLAYER_NAME', 'PRIZE_WON', 'CORRECT_ANSWERS')" "VALUES(1,2,3,4)";
this.stmt = conn.createStatement();
this.checkExistedTable("PLAYERS");
PreparedStatement ps = conn.prepareStatement(insertQuery);
CorrectAnswers.correctAnswers[MillionaireGui.moneyCounter] = PrizeMoney.prizeLadder[MillionaireGui.moneyCounter];
ps.setInt(1, playerID );
ps.setString(2, MillionaireGui.nameField.getText());
ps.setInt(3, PrizeMoney.prizeLadder[MillionaireGui.moneyCounter]);
ps.setInt(4, CorrectAnswers.correctAnswers[MillionaireGui.moneyCounter]);
ps.executeUpdate();
ps.close();
}
catch (SQLException ex)
{
System.out.println(ex.getMessage());
}
}
public void checkExistedTable(String name)
{
try {
DatabaseMetaData dbmd = this.conn.getMetaData();
String[] types = {"TABLE"};
stmt = this.conn.createStatement();
ResultSet rs = dbmd.getTables(null, null, null, types);
while (rs.next()) {
String table_name = rs.getString("TABLE_NAME");
System.out.println(table_name);
if (table_name.equalsIgnoreCase(name)) {
stmt.executeUpdate("Drop table " name);
System.out.println("Table " name " has been deleted.");
break;
}
}
rs.close();
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
}
我正在writeToPlayerDB()為我的 GUI 的 JTextField 呼叫 actionListener 中的方法,如下所示:
nameField.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (nameField.getText().equals(""))
{
blankName.setVisible(true);
blankName.setText("PLEASE DON'T LEAVE NAME BLANK");
}
else
{
playerName.setPlayerName(nameField.getText().toUpperCase());
WritePlayerDB wdb = new WritePlayerDB();
wdb.writeToPlayerDB();
blankNamePanel.setVisible(false);
introRuleScreen();
}
}
});
如果我能幫上忙,我將不勝感激,因為我已經堅持了很長時間!
uj5u.com熱心網友回復:
沒有足夠的資訊來真正了解您的核心問題是什么,但是...
static這不是一個好主意,尤其是當您處理 UI 元素時,因為您可能有多個 UI 實體,然后您無法再確定您實際參考的元素實體。最好利用依賴注入并將資訊直接傳遞給方法。
"VALUES(1,2,3,4)"不是您如何使用PreparedStatement,請參閱
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.StringJoiner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
DatabaseManager db = new DatabaseManager();
db.open();
JFrame frame = new JFrame();
frame.add(new MainPane(db));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public class MainPane extends JPanel {
private JTextField nameField;
private JSpinner moneyCounter;
public MainPane(DatabaseManager database) {
setBorder(new EmptyBorder(32, 32, 32, 32));
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.insets = new Insets(4, 4, 4, 4);
add(new JLabel("Name: "), gbc);
gbc.gridy ;
add(new JLabel("Counter: "), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_START;
nameField = new JTextField(10);
moneyCounter = new JSpinner(new SpinnerNumberModel(0, 0, 100, 10));
add(nameField, gbc);
gbc.gridy ;
add(moneyCounter, gbc);
JButton btnSave = new JButton("Save");
btnSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = nameField.getText();
if (name.isBlank()) {
JOptionPane.showMessageDialog(MainPane.this, "Name can not be blank", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
try {
int playerId = database.savePlayer(name, (int) moneyCounter.getValue());
List<String> results = database.getPlayerById(playerId);
StringJoiner sj = new StringJoiner("<br>", "<html>", "</html>");
for (String text : results) {
sj.add(text);
}
JOptionPane.showMessageDialog(MainPane.this, sj.toString(), "Success", JOptionPane.PLAIN_MESSAGE);
} catch (SQLException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(MainPane.this, "Failed to create player record", "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
gbc.gridy ;
gbc.gridx = 0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.anchor = GridBagConstraints.CENTER;
add(btnSave, gbc);
}
}
public class DatabaseManager {
private Connection connection;
protected void createTables() throws SQLException {
String cmd = "create table IF NOT EXISTS PLAYERINFO ("
"PLAYER_ID bigint GENERATED BY DEFAULT AS IDENTITY(START WITH 0) PRIMARY KEY,"
"PLAYER_NAME varchar(255) not null,"
"PRIZE_WON int not null,"
"CORRECT_ANSWERS int not null"
")";
try (Statement stmt = connection.createStatement()) {
stmt.execute(cmd);
}
}
public void open() throws SQLException {
if (connection != null && !connection.isClosed()) {
try {
connection.close();
} catch (SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.WARNING, null, ex);
}
}
connection = DriverManager.getConnection("jdbc:h2:~/test");
createTables();
}
public void close() throws SQLException {
if (connection == null) {
return;
}
try {
if (connection.isClosed()) {
connection = null;
}
connection.close();
} finally {
connection = null;
}
}
public int savePlayer(String name, int counter) throws SQLException {
String cmd = "insert into PLAYERINFO (PLAYER_NAME, PRIZE_WON, CORRECT_ANSWERS) values (?, ?, ?)";
try (PreparedStatement stmt = connection.prepareStatement(cmd, Statement.RETURN_GENERATED_KEYS)) {
Random rnd = new Random();
stmt.setString(1, name);
stmt.setInt(2, rnd.nextInt(100) 1);
stmt.setInt(3, counter);
if (stmt.executeUpdate() != 1) {
throw new SQLException("Unexpectedly modified more then one row");
}
try (ResultSet rs = stmt.getGeneratedKeys()) {
if (rs.next()) {
return rs.getInt(1);
}
}
}
throw new SQLException("Failed to create player record");
}
public List<String> getPlayerById(int id) throws SQLException {
String cmd = "select * from playerinfo where PLAYER_ID = ?";
List<String> results = new ArrayList<>(8);
try (PreparedStatement stmt = connection.prepareStatement(cmd)) {
stmt.setInt(1, id);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString("PLAYER_NAME");
int prizeWon = rs.getInt("PRIZE_WON");
int correctAnswer = rs.getInt("CORRECT_ANSWERS");
results.add(name " won " prizeWon " with " correctAnswer " correct answers");
}
}
}
return results;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488157.html
