没有反映对数据库的更改代码有什么问题吗?

时间:2019-04-04 10:00:38

标签: java mysql jdbc

我创建了一个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);}
    }
}```

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

对于您而言,最好遵循最佳做法,使用PrparedStatment而不是Statement,或者至少在尝试插入文字值{{1}时修复您的插入查询},而不是变量x1,yx1y的正确实现是:

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数量的受影响的行。