通过JDBC向PostgreSQL插入日期数据出现类型错误如何解决?
问题原因
你现有代码存在几个明显的语法和类型匹配错误:
SimpleDateFormat.parse()方法未传入需要解析的日期输入字符串,调用逻辑本身不合法parse()方法返回的是java.util.Date类型,而PreparedStatement.setDate()要求传入java.sql.Date类型,你已经做了类型转换但未使用转换后的变量- 仅捕获了
SQLException,未处理日期解析必然会抛出的ParseException,会直接编译失败 - 额外提示:如果数据库中
cad_idade字段为数值类型,直接传递字符串也会触发类型报错,建议同步修正
修正后的代码
try { conecta.conn.setAutoCommit(false); PreparedStatement pst = conecta.conn.prepareStatement("INSERT INTO cad_pessoa(cad_cpf,cad_nome, cad_idade, cad_apelido, cad_data) values (?,?,?,?,?)"); pst.setString(1, jFormattedTextFieldCPF.getText()); pst.setString(2, jTextFieldNOME.getText()); // 如果数据库cad_idade是数值类型,替换为下面这行 // pst.setInt(3, Integer.parseInt(jTextFieldIDADE.getText())); pst.setString(3, jTextFieldIDADE.getText()); pst.setString(4, jTextFieldApelido.getText()); // 修正日期处理逻辑 SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); // 传入日期输入字符串,先解析为util.Date再转为sql.Date java.util.Date inputDate = formatter.parse(jFormattedTextFieldDATA.getText()); java.sql.Date data = new java.sql.Date(inputDate.getTime()); pst.setDate(5, data); pst.executeUpdate(); conecta.conn.commit(); // 后续清空字段、弹窗逻辑保持不变 jFormattedTextFieldCPF.setText(""); jTextFieldNOME.setText(""); jTextFieldIDADE.setText(""); jFormattedTextFieldDATA.setText(""); jTextFieldApelido.setText(""); jFormattedTextFieldCPF.setEnabled(false); jTextFieldNOME.setEnabled(false); jTextFieldIDADE.setEnabled(false); jFormattedTextFieldDATA.setEnabled(false); jTextFieldApelido.setEnabled(false); JOptionPane.showMessageDialog(null, "Salvo!"); } catch (SQLException ex) { JOptionPane.showMessageDialog(rootPane, "Erro!\n" +ex); } catch (ParseException ex) { // 处理日期格式错误场景,比如用户输入不符合dd/MM/yyyy格式 JOptionPane.showMessageDialog(rootPane, "日期格式错误,请按照日/月/年格式输入:\n" + ex); }
额外优化建议
如果使用Java 8及以上版本,建议用新的时间API替换SimpleDateFormat,避免线程安全问题和解析隐患:
- 用
DateTimeFormatter替换SimpleDateFormat - 用
LocalDate接收解析结果,再通过java.sql.Date.valueOf(localDate)转为数据库需要的日期类型
内容的提问来源于stack exchange,提问作者Luís Felipe Ambrozin
相关产品推荐
相关产品推荐

