我创建了一个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);}
}
}```
答案 0 :(得分:1)
INSERT
不是Java中的查询,而是更新。因此,将stmt.executeQuery
更改为stmt.executeUpdate
应该可以解决问题。这也不会创建ResultSet,在这种情况下,您将不需要它。
另外,请注意,如果您对这样的查询进行编程,则会遇到内存泄漏的可能性,请尝试对数据库查询使用try-catch-finally语句,并确保始终关闭连接和结果集和声明。 您还只需在程序开始时执行一次Class.forName(“ com.mysql.jdbc.Driver”)调用。
答案 1 :(得分:0)
对于您而言,最好遵循最佳做法,使用PrparedStatment
而不是Statement
,或者至少在尝试插入文字值{{1}时修复您的插入查询},而不是变量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
数量的受影响的行。