将日期发送到 postgresql
Sending dates into postgresql
我对这个有一些疑问,我已经阅读了其他主题,但我仍然无法使代码正常工作。
我的意图是使用 JDBC 将日期插入到我的数据库中,我使用的是 jTextField(或 JformattedField,尝试两种方式),但我得到的只是来自数据库的错误。因为我发送的是文本而不是日期,所以,我该如何发送日期?
EDIT1:我正在尝试发送出生日期。
已经做了一些尝试,这就是为什么我有:
SimpleDateFormat formatter = new SimpleDateFormat ("dd/MM/yyyy");
java.sql.Date data = new java.sql.Date(formatter.parse().getTime());
代码:
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()); //pega o texto insirido e armazena no banco de dados
pst.setString(2, jTextFieldNOME.getText()); //pega o texto insirido e armazena no banco de dados
pst.setString(3, jTextFieldIDADE.getText()); //pega o texto insirido e armazena no banco de dados
pst.setString(4, jTextFieldApelido.getText());//pega o texto insirido e armazena no banco de dados
SimpleDateFormat formatter = new SimpleDateFormat ("dd/MM/yyyy");
java.sql.Date data = new java.sql.Date(formatter.parse().getTime());
pst.setDate(5, formatter.parse(jFormattedTextFieldDATA.getText())); //pega o texto insirido e armazena no banco de dados
pst.executeUpdate(); //executa o SQL
conecta.conn.commit();
jFormattedTextFieldCPF.setText(""); //deixa o campo vazio
jTextFieldNOME.setText(""); //deixa o campo vazio
jTextFieldIDADE.setText(""); //deixa o campo vazio
jFormattedTextFieldDATA.setText("");
jTextFieldApelido.setText(""); //deixa o campo vazio
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);
}
您使用的 setInt()
方法适用于整数值,它接受整数。要设置日期,请使用 PreparedStatement.setDate()
方法。
你从parse()
方法得到的java.util.Date
也应该转换为java.sql.Date
。
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date utilDate = formatter.parse(jFormattedTextFieldDATA.getText());
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
pst.setDate(5, sqlDate);
请参阅 PreparedStatement
class 上的文档:https://docs.oracle.com/javase/9/docs/api/java/sql/PreparedStatement.html
pst.setInt(5, formatter.parse(jFormattedTextFieldDATA.getText()));
这是罪魁祸首。看到您正在使用 setInt() 方法来设置日期。那是绝对不正确的。请改用 setDate() 方法。
例如:pst.setDate(5, formatter.parse(jFormattedTextFieldDATA.getText()));
避免遗留日期时间 类
切勿使用 java.until.Date
、java.sql.Date
、SimpleDateFormat
等。这些遗留日期时间 类 很糟糕 ,在设计上存在可悲的缺陷。
遗留 类 多年前被 JSR 310 中定义的现代 java.time 类 所取代。
java.time.LocalDate
将您的输入字符串解析为 LocalDate
。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.parse ( input , f ) ;
通过准备好的语句传递到您的数据库。
myPreparedStatement.setObject( … , ld ) ;
从数据库中检索:
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
在 Postgres 中,您可以将列定义为 DATE
.
类型
使用 JDBC driver compliant with version 4.2 or later of the JDBC specification.
所有这些都已在 Stack Overflow 上多次提及。搜索以了解更多信息。
我对这个有一些疑问,我已经阅读了其他主题,但我仍然无法使代码正常工作。
我的意图是使用 JDBC 将日期插入到我的数据库中,我使用的是 jTextField(或 JformattedField,尝试两种方式),但我得到的只是来自数据库的错误。因为我发送的是文本而不是日期,所以,我该如何发送日期?
EDIT1:我正在尝试发送出生日期。
已经做了一些尝试,这就是为什么我有:
SimpleDateFormat formatter = new SimpleDateFormat ("dd/MM/yyyy");
java.sql.Date data = new java.sql.Date(formatter.parse().getTime());
代码:
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()); //pega o texto insirido e armazena no banco de dados
pst.setString(2, jTextFieldNOME.getText()); //pega o texto insirido e armazena no banco de dados
pst.setString(3, jTextFieldIDADE.getText()); //pega o texto insirido e armazena no banco de dados
pst.setString(4, jTextFieldApelido.getText());//pega o texto insirido e armazena no banco de dados
SimpleDateFormat formatter = new SimpleDateFormat ("dd/MM/yyyy");
java.sql.Date data = new java.sql.Date(formatter.parse().getTime());
pst.setDate(5, formatter.parse(jFormattedTextFieldDATA.getText())); //pega o texto insirido e armazena no banco de dados
pst.executeUpdate(); //executa o SQL
conecta.conn.commit();
jFormattedTextFieldCPF.setText(""); //deixa o campo vazio
jTextFieldNOME.setText(""); //deixa o campo vazio
jTextFieldIDADE.setText(""); //deixa o campo vazio
jFormattedTextFieldDATA.setText("");
jTextFieldApelido.setText(""); //deixa o campo vazio
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);
}
您使用的 setInt()
方法适用于整数值,它接受整数。要设置日期,请使用 PreparedStatement.setDate()
方法。
你从parse()
方法得到的java.util.Date
也应该转换为java.sql.Date
。
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date utilDate = formatter.parse(jFormattedTextFieldDATA.getText());
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
pst.setDate(5, sqlDate);
请参阅 PreparedStatement
class 上的文档:https://docs.oracle.com/javase/9/docs/api/java/sql/PreparedStatement.html
pst.setInt(5, formatter.parse(jFormattedTextFieldDATA.getText()));
这是罪魁祸首。看到您正在使用 setInt() 方法来设置日期。那是绝对不正确的。请改用 setDate() 方法。
例如:pst.setDate(5, formatter.parse(jFormattedTextFieldDATA.getText()));
避免遗留日期时间 类
切勿使用 java.until.Date
、java.sql.Date
、SimpleDateFormat
等。这些遗留日期时间 类 很糟糕 ,在设计上存在可悲的缺陷。
遗留 类 多年前被 JSR 310 中定义的现代 java.time 类 所取代。
java.time.LocalDate
将您的输入字符串解析为 LocalDate
。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.parse ( input , f ) ;
通过准备好的语句传递到您的数据库。
myPreparedStatement.setObject( … , ld ) ;
从数据库中检索:
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
在 Postgres 中,您可以将列定义为 DATE
.
使用 JDBC driver compliant with version 4.2 or later of the JDBC specification.
所有这些都已在 Stack Overflow 上多次提及。搜索以了解更多信息。