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

如何将数据存入MySQL且不显示在JTable?解决数据匹配问题

解决方案

核心修改点

1. 解决JTable与MySQL表结构不匹配问题

  • 彻底从JTable的NAME字段拆分lastName和firstName,不再依赖文本框的txtLname、txtFname,避免数据混淆
  • 正确映射birthday字段,使用date_birthday的日期值,而非默认当前时间
  • 优化数据库操作:循环外创建PreparedStatement,循环内复用,提升效率

2. 解决合并姓名的空格问题

  • 使用正则表达式\\s*,\\s*拆分姓名,兼容逗号前后的任意空格
  • 拆分后对每个部分强制trim,确保无多余空格

3. 实现存入数据库时JTable不显示额外数据

  • JTable仅维护自身的6个字段,存入时从JTable提取这6个字段,结合其他输入控件的内容填充MySQL的10个字段,JTable不会显示middleName、address等额外字段

修改后的完整代码

DefaultTableModel tabolmodel = (DefaultTableModel) jTable4.getModel();
if (tabolmodel.getRowCount() == 0) {
    JOptionPane.showMessageDialog(this, "Table is Empty.");
} else {
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        try (java.sql.Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/shsgrading?useSSL=false", "root", "")) {

            // 预编译SQL,循环外创建一次,提升效率
            String query = "INSERT INTO instructor(lastName, firstName, middleName, username, password, email, gender, birthday, address, status) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            try (PreparedStatement prepstmt = con.prepareStatement(query)) {

                for (int i = 0; i < tabolmodel.getRowCount(); i++) {
                    String NAME = (String) tabolmodel.getValueAt(i, 0);
                    String USERNAME = (String) tabolmodel.getValueAt(i, 1);
                    String EMAIL = (String) tabolmodel.getValueAt(i, 2);
                    String PASS = (String) tabolmodel.getValueAt(i, 3);
                    String GENDER = (String) tabolmodel.getValueAt(i, 4);
                    String STATUS = (String) tabolmodel.getValueAt(i, 5);

                    // 处理姓名拆分,兼容逗号前后的任意空格
                    String lastName = "";
                    String firstName = "";
                    if (NAME.contains(",")) {
                        // 用正则拆分逗号前后的内容,忽略空格
                        String[] names = NAME.split("\\s*,\\s*", 2);
                        lastName = names[0].trim();
                        firstName = names.length > 1 ? names[1].trim() : "";
                    } else {
                        // 没有逗号时,默认全部作为firstName
                        firstName = NAME.trim();
                    }

                    // 从输入控件获取额外字段
                    String middleName = txtMname.getText().trim();
                    String address = txt_address.getText().trim();
                    java.sql.Date sqlBirthday = null;
                    java.util.Date utilBirthday = date_birthday.getDate();
                    if (utilBirthday != null) {
                        sqlBirthday = new java.sql.Date(utilBirthday.getTime());
                    }

                    // 处理status默认值
                    String defaultStatus = "Inactive";
                    final int STATUS_MAX_SIZE = 30;
                    String insertStatus = STATUS != null && !STATUS.isEmpty() ? STATUS.trim() : defaultStatus;
                    if (insertStatus.length() > STATUS_MAX_SIZE) {
                        insertStatus = insertStatus.substring(0, STATUS_MAX_SIZE);
                    }

                    // 绑定参数,严格对应MySQL表字段顺序
                    prepstmt.setString(1, lastName);
                    prepstmt.setString(2, firstName);
                    prepstmt.setString(3, middleName);
                    prepstmt.setString(4, USERNAME.trim());
                    prepstmt.setString(5, PASS.trim());
                    prepstmt.setString(6, EMAIL.trim());
                    prepstmt.setString(7, GENDER.trim());
                    if (sqlBirthday != null) {
                        prepstmt.setDate(8, sqlBirthday);
                    } else {
                        // 如果没有选择生日,使用当前时间(可根据需求调整)
                        prepstmt.setDate(8, new java.sql.Date(new java.util.Date().getTime()));
                    }
                    prepstmt.setString(9, address);
                    prepstmt.setString(10, insertStatus);

                    prepstmt.executeUpdate();
                }

                JOptionPane.showMessageDialog(this, "Data inserted successfully.");
                tabolmodel.setRowCount(0); // 清空JTable,仅清除已存入的数据
            } // 自动关闭PreparedStatement
        } // 自动关闭Connection
    } catch (Exception e) {
        e.printStackTrace();
        JOptionPane.showMessageDialog(this, "An error occurred: " + e.getMessage());
    }
}

额外说明

  • 使用try-with-resources自动关闭数据库连接和PreparedStatement,避免资源泄漏
  • 对所有输入字段进行trim()处理,避免多余空格存入数据库
  • 姓名拆分逻辑更健壮,兼容多种格式(如"Doe,John"、"Doe , John"、"Doe , John"等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:13:12