如何将数据存入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
相关产品推荐
相关产品推荐

