将Scene Builder文本框数据插入MySQL表时EventHandler报错排查
问题分析与修复方案
核心错误点
- 提前执行SQL语句:在绑定任何参数前就调用了
prepare.executeUpdate();,此时PreparedStatement的参数都未设置,必然触发SQL执行异常。 - 日期类型处理错误:直接将日期对象转为String存入数据库,容易出现格式不匹配MySQL DATE类型的问题,应该用
setDate方法直接传入数据库兼容的日期对象。 - 数据库资源未释放:操作完成后未关闭PreparedStatement和Connection,可能导致连接泄漏。
修复后的完整代码
public void myPlanADDbtn() { Connection connect = null; PreparedStatement prepare = null; try { connect = Database.connectDB(); if (myPlan_PlanTexField.getText().isEmpty() || myPlan_StartDateSet.getValue() == null || myPlan_EndDateSet.getValue() == null) { showAlert("请填写所有必填项"); } else if (myPlan_StartDateSet.getValue().isAfter(myPlan_EndDateSet.getValue())) { showAlert("日期无效!开始日期不能晚于结束日期"); } else { String insertData = "INSERT INTO plan (plan,startDate,endDate,createdDate,status,planner) VALUES(?,?,?,?,?,?)"; prepare = connect.prepareStatement(insertData); // 按顺序绑定参数 prepare.setString(1, myPlan_PlanTexField.getText()); // 将LocalDate转换为数据库兼容的java.sql.Date prepare.setDate(2, java.sql.Date.valueOf(myPlan_StartDateSet.getValue())); prepare.setDate(3, java.sql.Date.valueOf(myPlan_EndDateSet.getValue())); // 直接设置当前日期 prepare.setDate(4, new java.sql.Date(System.currentTimeMillis())); prepare.setString(5, "Not Finished"); prepare.setString(6, page_userName.getText()); // 执行插入操作 prepare.executeUpdate(); myPlansShowData(); } } catch (Exception e) { e.printStackTrace(); showAlert("数据插入失败:" + e.getMessage()); } finally { // 确保数据库资源被关闭 try { if (prepare != null) prepare.close(); if (connect != null) connect.close(); } catch (SQLException e) { e.printStackTrace(); } } }
补充说明
- 假设
myPlan_StartDateSet.getValue()返回LocalDate类型,若为其他日期类型,需对应调整转换逻辑。 - 新增finally块强制关闭资源,避免连接池耗尽。
- 在catch块中添加具体错误提示,便于排查问题。
内容的提问来源于stack exchange,提问作者Ahmadullah Ahmadi
相关产品推荐
相关产品推荐

