没有反映数据库的变化代码有什么问题吗?

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

我已经做了一个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);}
    }
}```

java mysql jdbc
2个回答
1
投票

INSERT不是java中的查询,它是一个更新。因此,将stmt.executeQuery改为stmt.executeUpdate应该可以解决问题。这也不会创建ResultSet,在这种情况下您不需要。

另外,请注意,如果编写任何类似的查询,则会遇到内存泄漏的可能性,请尝试使用try-catch-finally语句进行数据库查询,并确保始终关闭连接,结果集和语句。您还需要在程序开头执行一次`Class.forName(“com.mysql.jdbc.Driver”)调用。


0
投票

在你的情况下,最好通过使用PrparedStatment而不是Statement来遵循最佳实践,或者至少修复你的插入查询,因为你试图插入文字值x1,y而不是变量x1y。正确实施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数。
© www.soinside.com 2019 - 2024. All rights reserved.