0

如何将 java Date 对象插入 Postgresql DATE 单元格?

当我按照自己的方式做时,这是错误的:

Calendar date = Calendar.getInstance(); // wrong
Date date = new Date(); // wrong         

String addRecord = "INSERT INTO " + GlobalFields.PACJENCI_TABLE +
                                "VALUES (" + date + ");";
stat.executeUpdate(addRecord)

我没有更多的想法...

PS:

public static void CreatePacjenciTable()
{
    try
    {
        Connection conn = DataBase.Connect();

        try
        {
            Statement stat = conn.createStatement();

            String createTable = "CREATE TABLE " + GlobalFields.PACJENCI_TABLE 
                + "(dataUrodzenia DATE);";

            stat.executeUpdate(createTable);
        }
        finally
        {
            conn.close();
        }
    }
    catch(SQLException e)
    {
        e.printStackTrace();
    } 
}
4

3 回答 3

5

你根本不应该那样做!

永远不要构造带有参数的 SQL 字符串。相反,创建一个PreparedStatement并在其上设置参数。像这样:

    String addRecord = "INSERT INTO " + GlobalFields.PACJENCI_TABLE + "VALUES (?);";
    PreparedStatement stmt = conn.prepareStatement(addRecord);
    stmt.setDate(1, new Date(System.currentTimeMillis()));
    stmt.executeUpdate();

请注意,Date有一个java.sql.Date,它是 normal 的子类,java.util.Date其中一天中的时间始终是午夜 UTC;它用于表示实际日期,而不是某个时刻。您也可以使用 a java.sql.Timestamp,它代表一个时刻。

于 2012-08-29T16:53:27.920 回答
4

这就是问题:

String addRecord = "INSERT INTO " + GlobalFields.PACJENCI_TABLE +
                   "VALUES (" + date + ");";

您正在将其Date转换为字符串并将其包含在 SQL 中。不要那样做。这里根本不需要使用字符串转换。

相反,使用 aPreparedStatement并将值作为 ajava.sql.Date或可能java.sql.Timestamp通过参数插入。

您几乎应该始终避免将 SQL 中的值作为字符串包含 - 改用参数化 SQL,并在语句中设置值。这使您的 SQL(代码)与参数(数据)分离,避免了数据转换问题的风险,也避免了SQL 注入攻击

于 2012-08-29T16:49:03.623 回答
1

不要通过连接字符串来创建 SQL(这是这里的问题,因为 Postgres 肯定不理解 Java 的日期字符串表示),而是使用PreparedStatement并将日期作为参数传递。除了其他优点(预编译语句,...)之外,它还允许您传递日期Date并让 JDBC 和底层数据库驱动程序为您完成所有必要的数据转换工作。

于 2012-08-29T16:52:25.750 回答