我已经做了一个gui,通过点击按钮将数据输入我的数据库,但它没有反映数据库中的更改。任何人都可以解决这个问题吗?
public class ExpenseManager implements ActionListener {
JFrame frame ;
JTextField t1 = new JTextField("");
JTextField t2 = new JTextField("");
void go(){
frame = new JFrame("Daily Expenses");
JButton b = new JButton("SUBMIT");
frame.add(t1);
t1.setBounds(50,50,200,30);
frame.add(t2);
t2.setBounds(50,100,200,30);
frame.add(b);
b.setBounds(50,150,200,30);
b.addActionListener(this);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.getContentPane().setBackground(Color.darkGray);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e){
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con= DriverManager.getConnection(
"jdbc:mysql://localhost:3306/try","root","root");
Statement stmt=con.createStatement();
String x = t1.getText();
int x1 = Integer.parseInt(x);
String y = t2.getText();
ResultSet rs=stmt.executeQuery("INSERT INTO data (amt, dis) VALUES (x1,y); ");
con.close();
}catch(Exception eX){ System.out.println(e);}
}
}```
INSERT
不是java中的查询,它是一个更新。因此,将stmt.executeQuery
改为stmt.executeUpdate
应该可以解决问题。这也不会创建ResultSet,在这种情况下您不需要。
另外,请注意,如果编写任何类似的查询,则会遇到内存泄漏的可能性,请尝试使用try-catch-finally语句进行数据库查询,并确保始终关闭连接,结果集和语句。您还需要在程序开头执行一次`Class.forName(“com.mysql.jdbc.Driver”)调用。
在你的情况下,最好通过使用PrparedStatment
而不是Statement
来遵循最佳实践,或者至少修复你的插入查询,因为你试图插入文字值x1,y
而不是变量x1
和y
。正确实施PreparedStatement
将是:
String sql = "INSERT INTO data (amt, dis) VALUES(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, x1);
pstmt.setDouble(2, y);
pstmt.executeUpdate();
如果你想继续使用Statement
,你应该将你的查询类型更改为executeUpdate
而不是executeQuery
,你应该追加变量的实际值,一个工作的例子可能是:
Statement stmt=con.createStatement();
String x = t1.getText();
int x1 = Integer.parseInt(x);
String y = t2.getText();
String query = String.format("INSERT INTO data (amt, dis) VALUES (%d,%s)",x1,y);
stmt.executeUpdate(query);
附注:
private Connection connect() {
// SQLite connection string
String url = "jdbc:mysql://localhost:3306/try";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, "root", "root");
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return conn;
}
ResultSet
变量将生成受影响的行的Integer
数。