Java 单击按钮时使用静态方法将值插入数据库表

Java 单击按钮时使用静态方法将值插入数据库表,java,sql,Java,Sql,我正在从事一个项目,该项目用于收集客户信息并将其存储到一个名为“BOOKINGS”的表中。该表有“CUSTOMERNAME”、“HOLIDAYNAME”、“魔术师”和“TIMESTAMP”列 我有一个名为“DatabaseConnection”的类,它建立了到包含bookings表的数据库的连接。该类在项目的其他领域中发挥了预期的作用。在类中,我有一个名为“addBooking”的静态方法 我有一个GUI类(使用Netbeans GUI生成器),它有一个actionperformed方法。下面是

我正在从事一个项目,该项目用于收集客户信息并将其存储到一个名为“BOOKINGS”的表中。该表有“CUSTOMERNAME”、“HOLIDAYNAME”、“魔术师”和“TIMESTAMP”列

我有一个名为“DatabaseConnection”的类,它建立了到包含bookings表的数据库的连接。该类在项目的其他领域中发挥了预期的作用。在类中,我有一个名为“addBooking”的静态方法

我有一个GUI类(使用Netbeans GUI生成器),它有一个actionperformed方法。下面是actionperformed方法和addBooking方法的代码

private void bookButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           


    String customerName = customerNameText.getText();
    String magician = (String)magicianCombo.getSelectedItem();
    String holiday = (String)holidayCombo.getSelectedItem();

    customerNameText.setText(null);

    try {
        DatabaseConnection.addBooking(customerName, holiday, magician);
    } catch (SQLException ex) {
        Logger.getLogger(GUI1Frame.class.getName()).log(Level.SEVERE, null, ex);
    }
}        
我没有发送任何关于时间戳的信息,因为我还没有弄清楚那个部分。下面是DatabaseConnection类中addBooking方法的代码

public static void addBooking(String name, String holiday, String employee) throws SQLException { 
    stmt.execute("INSERT INTO BOOKINGS (CUSTOMERNAME, HOLIDAYNAME, MAGICIAN) VALUES ('"+name+"','"+holiday+"','"+employee+"')");
}          
单击该按钮可以从文本框(客户名称)获取信息,从组合框(假日)获取信息,从另一个组合框(员工)获取信息。我不明白为什么它不工作,但每当点击按钮时,程序就会冻结10-15秒,然后继续,但表中没有输入任何信息。任何帮助都将不胜感激,谢谢

编辑:为DatabaseConnection类的其余部分添加了代码

public class DatabaseConnection {
String host = "jdbc:derby://localhost:1527/MagicianAgent";
String username = "java";
String password = "java";

static Connection con = null;
ResultSet rs = null;
static Statement stmt;

DatabaseConnection() { 
    try { 
        con = DriverManager.getConnection(host, username, password);
        stmt = con.createStatement();
    }
    catch(SQLException err) { 
        System.out.println(err.getMessage());
    }
}

public ResultSet getRS(String sql) { 
    try {
        rs = stmt.executeQuery(sql);
    }
    catch(SQLException err) { 
        System.out.println(err.getMessage());
    }
    return rs;
}
编辑2:这是我在main方法中的一些代码

    Holiday holidayList = new Holiday();
    Magician magicianNames = new Magician();
    arrays = magicianNames.getMagicianNames();
    for(int e = 0; e < arrays.size(); e++ ) { 
        magicianCombo.addItem(arrays.get(e));
    }
    arrays = holidayList.getHolidayList();
    for(int e = 0; e < arrays.size(); e++) { 
        holidayCombo.addItem(arrays.get(e));
    }
holidayList=新假日();
魔术师魔术师名称=新魔术师();
数组=魔术师名称。Get魔术师名称();
对于(int e=0;e

在假日和魔术师构造函数中,它们通过DatabaseConnection访问数据库,并将假日名称和魔术师名称的值存储在ArrayList中。然后将ArrayList项添加到组合框中,直到到达ArrayList的末尾。我不确定这是否会改变任何行为,但我认为我应该添加它

不要预先创建
语句
对象,并使用
PrepareStatement
防止SQL语法错误和攻击

因此,您的代码应该是:

public static void addBooking(String name, String holiday, String employee) throws SQLException {
    String sql = "INSERT INTO BOOKINGS (CUSTOMERNAME, HOLIDAYNAME, MAGICIAN) VALUES (?,?,?)";
    try (PreparedStatement stmt = con.prepareStatement(sql)) {
        stmt.setString(1, name);
        stmt.setString(2, holiday);
        stmt.setString(3, employee);
        stmt.executeUpdate();
    }
}  

向我们展示有关
DatabaseConnection
的更多信息除了其他内容之外,您的
addBooking
方法应该被修复为使用参数化SQL。在处理SQL注入攻击可能威胁业务的任何实际代码之前,现在就养成这样的习惯……通常情况下,使用查询准备一条语句,然后执行—什么是
stmt
?此外,您的代码容易受到以下攻击:如果输入
,“”,”;在customerName字段中删除表预订--
。。您正在EDT上执行数据库操作,这就是GUI冻结的原因,而且,您似乎没有在您发布的代码中的任何位置创建或关闭
stmt
。@JonSkeet谢谢,我会研究一下。谢谢,我尝试使用PreparedStatement,但它仍然冻结,并且不更新数据库。我补充了一些信息。“我不确定这是否会有帮助。”克里斯说,这句话对我来说毫无意义。您没有显示任何
main
方法。您没有使用
PrepareStatement
。“不工作”是一个无用的评论。具体点。或者更确切地说,创建一个新问题。请每个问题一个问题。@Chris和read”“我在问题中添加了一个编辑,这是我在main方法中的代码。我没有显示PreparedStatement的用法,因为它与您在回复中的代码完全相同。我告诉过你问题是它会冻结,不会更新数据库。我问的问题仍然是同一个问题。@Chris你的错误处理真糟糕。由于这是一个GUI程序,您认为下面的语句做什么?它不打印任何内容,然后忽略错误并继续。如果您确实看到了错误,您可能会发现数据库连接没有工作,因为localhost:1527上没有Derby数据库,而您的“冻结”是连接超时。不要忽略错误!!!!当然,把它们记录下来,但不要像没发生什么坏事一样继续。