You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IntelliJ开发GUI应用时数据无法存入SQL数据库问题求助

注册按钮无报错但数据未存入MySQL数据库的解决方案

看起来你遇到了典型的"程序无异常但数据没落地"的问题,我帮你梳理几个关键问题点和对应的修复方案:

1. 数据库连接字符串的转义错误

在DBHandler.java里,你的连接字符串用了&(HTML转义字符),但Java字符串中直接使用&即可,这个错误会导致JDBC无法正确解析连接URL,可能数据库连接根本没建立成功,但因为代码没做连接检查,所以没抛出明显异常。

修复代码:

// DBHandler.java 中修改连接字符串
String connectionString = "jdbc:mysql://" + Configs.dbhost + ":" + Configs.dbport + "/" + dbname + "?autoReconnect=true&useSSL=false";

2. 未检查数据库连接状态

你的getConnection()方法如果连接失败会返回null,但SignUpController里直接用这个连接去创建PreparedStatement,如果连接为null,后续操作会静默失败(或者抛出异常被catch但你没注意到)。

修复方案:在使用连接前添加检查:

// SignUpController.java 的 signUP 方法中
connection = handler.getConnection();
if (connection == null) {
    System.err.println("数据库连接失败,请检查配置!");
    progress.setVisible(false);
    return;
}

同时优化DBHandler的连接方法,添加明确的日志提示:

// DBHandler.java 的 getConnection 方法
public Connection getConnection() {
    String connectionString = "jdbc:mysql://" + Configs.dbhost + ":" + Configs.dbport + "/" + dbname + "?autoReconnect=true&useSSL=false";
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        System.err.println("找不到MySQL驱动!");
        e.printStackTrace();
        return null;
    }
    try {
        dbconnection = DriverManager.getConnection(connectionString, Configs.dbuser, dbpass);
        System.out.println("数据库连接成功!");
        return dbconnection;
    } catch (SQLException e) {
        System.err.println("数据库连接失败,请检查账号密码和数据库状态!");
        e.printStackTrace();
        return null;
    }
}

3. 资源未关闭 + 事务显式处理

虽然JDBC默认开启自动提交,但显式提交事务能确保数据写入,同时用完PreparedStatement和Connection后必须关闭,避免连接泄漏和数据丢失。

修复后的signUP方法:

@FXML
public void signUP() {
    progress.setVisible(true);
    PauseTransition pt = new PauseTransition(Duration.seconds(3));
    pt.setOnFinished(e -> System.out.println("注册流程完成!"));
    pt.play();

    String insert = "INSERT INTO youtubers(names,password,gender,locationField) VALUES (?,?,?,?)";
    connection = handler.getConnection();

    // 检查连接是否有效
    if (connection == null) {
        System.err.println("数据库连接失败!");
        progress.setVisible(false);
        return;
    }

    try {
        pst = connection.prepareStatement(insert);
        pst.setString(1, name.getText());
        pst.setString(2, password.getText());
        
        String selectedGender = getGender();
        // 检查性别是否选择(如果数据库gender字段不允许为空的话)
        if (selectedGender.isEmpty()) {
            System.err.println("请选择性别!");
            progress.setVisible(false);
            return;
        }
        pst.setString(3, selectedGender);
        pst.setString(4, locationField.getText());

        // 执行插入并检查影响行数
        int rowsAffected = pst.executeUpdate();
        if (rowsAffected > 0) {
            System.out.println("数据插入成功,共影响" + rowsAffected + "行");
            // 显式提交事务(保险起见)
            connection.commit();
        } else {
            System.err.println("没有数据被插入,请检查字段是否匹配!");
        }
    } catch (SQLException e) {
        e.printStackTrace();
        // 发生错误时回滚事务
        try {
            if (connection != null) {
                connection.rollback();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    } finally {
        // 关闭资源,释放连接
        try {
            if (pst != null) pst.close();
            if (connection != null) connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        progress.setVisible(false);
    }
}

4. 额外检查项

  • 确认数据库表youtubers的字段名和你的insert语句完全匹配(比如locationField是否真的是表中的字段名);
  • 检查表字段是否允许为空(比如如果gender字段是NOT NULL,那么用户没选性别时插入会失败);
  • 统一包结构:你的DBConnection.java在com.Ashmal包,而Configs和DBHandler在DBConnection包,建议把所有数据库相关类移到同一个包下(比如com.Ashmal.DBConnection),避免类加载问题。

按以上步骤修改后,应该就能解决数据不入库的问题了,如果还有问题,可以查看控制台的错误日志,定位具体原因。

内容的提问来源于stack exchange,提问作者Ashmal Shoukat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:13:11