使用JavaFX与mysql-connector-java-5.1.45-bin无法插入数据至patients表求助
排查JavaFX + MySQL插入数据失败的问题
嘿,我之前用JDBC做插入的时候也踩过类似的坑——程序跑起来没报错,但数据就是没进数据库,咱们一步步来拆解可能的原因:
1. 事务提交是头号嫌疑
JDBC默认autoCommit为true,但如果你手动设置过conn.setAutoCommit(false),或者你的连接工具类改了这个配置,那执行完插入后必须调用conn.commit()才能把数据写到数据库。要是忘了提交,事务会在连接关闭时自动回滚,数据自然就没了。
2. 检查SQL语句与字段匹配度
你的patients表有8个字段,一定要确认:
- INSERT语句里的字段数量和VALUES的占位符数量完全一致,顺序也严格对应
- 有没有必填(NOT NULL)的字段你没赋值?比如主键或其他非空字段漏传,数据库可能不会抛出明显错误,但会默默拒绝插入
- 字段名有没有写错?比如把数据库里的
patient_name写成了patientName,大小写或拼写不匹配都会导致插入无效
3. 别吞掉异常!这是关键
很多时候程序“没报错”只是因为你没捕获并打印异常。一定要在代码里加上异常输出,比如:
try { // 你的插入逻辑代码 } catch (SQLException e) { e.printStackTrace(); // 这行能帮你看到具体错误:比如字段类型不匹配、数据库权限不足等 }
我之前就碰到过因为数据库用户没有INSERT权限,程序没报错但数据插不进去,全靠打印异常才找到问题根源。
4. 确认连接的是正确数据库
有没有可能你连接的是测试环境的数据库,却一直在看生产环境的表?或者数据库地址、库名写错了?可以在插入前打印一下连接的数据库URL,确认是不是你要操作的那个库。
5. 驱动版本兼容性问题
你用的是mysql-connector-java-5.1.45,如果你的MySQL服务器是8.0及以上版本,这个旧驱动可能存在隐性兼容性问题。可以试试升级到8.x版本的驱动(比如8.0.33),同时注意:
- 驱动类名从
com.mysql.jdbc.Driver改成com.mysql.cj.jdbc.Driver - JDBC URL要加上时区参数,比如
jdbc:mysql://localhost:3306/your_db?serverTimezone=UTC
6. 参数绑定要仔细
用PreparedStatement绑定参数时,别踩这些小坑:
- 参数索引是从1开始的,不是0!
- 参数类型要和数据库字段匹配,比如把字符串绑到INT字段会导致插入失败
- 有没有漏绑某个参数?比如8个字段只绑了7个占位符
参考正确插入代码示例
package avicenna; import connectivity.Conn; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Timestamp; public class FXMLDocumentController { // 示例插入方法 public void insertPatient() { // 确保字段数和占位符数都是8个 String insertSql = "INSERT INTO patients (id, name, age, gender, phone, email, address, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; // 用try-with-resources自动关闭连接和Statement,避免资源泄漏 try (var conn = Conn.getConnection(); var pstmt = conn.prepareStatement(insertSql)) { // 按顺序绑定8个参数,类型与数据库字段对应 pstmt.setInt(1, 1002); pstmt.setString(2, "Jane Smith"); pstmt.setInt(3, 28); pstmt.setString(4, "Female"); pstmt.setString(5, "0987654321"); pstmt.setString(6, "jane@example.com"); pstmt.setString(7, "456 Oak Ave"); pstmt.setTimestamp(8, new Timestamp(System.currentTimeMillis())); // 执行插入并打印影响行数,确认是否成功 int rows = pstmt.executeUpdate(); System.out.println("成功插入 " + rows + " 条数据"); // 如果关闭了自动提交,手动提交事务 // conn.commit(); } catch (SQLException e) { // 务必打印异常信息 System.err.println("插入失败,错误详情:"); e.printStackTrace(); // 有事务的话记得回滚 // try { if (conn != null) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } } }
先从打印异常开始排查吧,大部分情况下异常信息会直接告诉你问题出在哪儿!
内容的提问来源于stack exchange,提问作者Ganz Alex
相关产品推荐
相关产品推荐

