使用JDBC和Postgres存储日期值

时间:2018-07-27 12:16:05

标签: java sql postgresql jdbc

我已经使用Java使用NetBeans制定了公式。

在那个公式中,我有一个JDateChooser字段。问题是当我尝试在Postgres数据库中插入该值时:

public void insertarDatos(Usuario u){

    try {
        String sql = "INSERT INTO usuario( dni, nombre, apellidos, correo, "
                + "telefono, usuario, clave, fecha, foto)\n"
                + "VALUES (?, ?, ?, ?, ?, ?, ?, '"+u.getFecha()+"', ?);";
        PreparedStatement ps=con.con.prepareStatement(sql);
        ps.setString(1, u.getDni());
        ps.setString(2, u.getNombre());
        ps.setString(3, u.getApellidos());
        ps.setString(4, u.getCorreo());
        ps.setString(5, u.getTelefono());
        ps.setString(6, u.getUsuario());
        ps.setString(7, u.getClave());

        ps.setBinaryStream(8, u.getFis(), u.getLongitudBytes());
        boolean ejecucion=con.ejecutarSQL(ps);
        if(ejecucion==true){
            JOptionPane.showMessageDialog(null, "usuario correctamente"
                    + "registrado");
        }else if(ejecucion==false){
            JOptionPane.showMessageDialog(null, "error insertar usuario");
        }

    } catch (Exception e) {
        System.out.println("error al insertar: " + e);
    }
}

然后Java给我这样的错误:

  

错误消息:org.postgresql.util.PSQLException:错误:sintaxis de entrada no esválidapara tipo日期:«null»

但是,如果我在Postgres编辑器中进行查询,则效果很好。

3 个答案:

答案 0 :(得分:0)

数据库中日期列的数据类型是什么?它是以日期格式还是字符串形式存储日期?如果它以日期格式存储日期,则应将从JDateChooser获得的日期转换为java.sql.Date。您必须这样做,因为JDateChooser返回java.util.Date,并且数据库应与java.sql.date一起使用。尝试像这样转换它:

java.util.Date datum = jDateChooser1.getDate();
java.sql.Date sqldate = new java.sql.Date(datum.getTime());

答案 1 :(得分:0)

java.time

避免麻烦的旧日期时间类,例如java.util.Datejava.util.Calendarjava.sql.Datejava.sql.Timestamp

仅使用 java.time 类。具体来说,Instant类将同时替换java.util.Datejava.sql.TimestampInstant解析为纳秒,对于Postgres的微秒分辨率来说已经足够了。

要与尚未更新为 java.time 的旧代码进行互操作,请进行转换。查看添加到旧类中的新方法。

Instant instant = myJavaUtilDate.toInstant() ;

…和…

java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;

JDBC 4.2

请勿在数据库中将日期时间值作为文本传递或获取。

从JDBC 4.2和更高版本开始,我们可以直接与数据库交换 java.time 对象。

呼叫PreparedStatement::setObjectResultSet::getObject

搜索堆栈溢出

该主题已在Stack Overflow上得到多次解决。搜索更多信息和示例。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

如果我写:  java.util.Date数据= jDateChooser1.getDate();  java.sql.Date sqldate = new java.sql.Date(datum.getTime());

然后返回:  错误提示:java.lang.NullPointerException

当我写的时候:LocalDate fec = jdateFecha.getDate();  它返回一个错误:  日期无法转换为LocaDate –