gpt4 book ai didi

mysql - 从 Java 应用程序将时间戳插入 MySQL

转载 作者:行者123 更新时间:2023-11-29 09:37:47 25 4
gpt4 key购买 nike

我正在创建一个与 MySQL 数据库通信的 Java 应用程序。使用 XAMPP 5.6.33-0 和 phpMyAdmin。我有以下方法,除其他值外,将时间戳插入表 RATING 中:

PreparedStatement pst = myConn.prepareStatement("INSERT INTO RATING  
(ratingDate) VALUES(?)");
java.util.Date today = new java.util.Date();
Timestamp ts = new java.sql.Timestamp(today.getTime());
pst.setTimestamp(1, ts);
pst.executeUpdate();

RATING 关系的架构如下所示:

CREATE TABLE RATING
(cID INT,
rID INT,
stars INT,
ratingDate TIMESTAMP,
FOREIGN KEY(cID) REFERENCES CUSTOMER(cID) on delete cascade,
FOREIGN KEY(rID) REFERENCES ROOM(rID)
) ;

因此属性 ratingDate 被定义为时间戳。一切都很好,除了插入时间戳时,其值始终设置为全零:0000-00-00 00:00:00

我尝试使用 t.toString 将 Timestamp 转换为字符串,并且可以清楚地看到 Timestamp 对象已正确创建。看来问题出在 setTimestamp() 方法上。此外,将 ratingDate 的数据类型转换为 Date 并使用 setDate() 方法效果很好,但 setTimestamp() 函数始终将属性值设置为全零。

当然,有解决方法。我可以将日期声明为 varchar,将时间戳转换为字符串并使用 setString() 插入它,但我真的想知道问题可能是什么。使用 Tomcat 服务器运行 Eclipse。控制台中没有错误。

提前感谢您提供的任何帮助,我很乐意提供任何其他必要的信息。

最佳答案

避免遗留日期时间类

全零值是一个谜。但我可以告诉您,您正在使用糟糕的日期时间类,这些类在几年前已被采用 JSR 310 的 java.time 类所取代。这使您的工作比需要的更加复杂是。

我建议创建一个简单的虚拟表来缩小您的问题范围。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime ) ;

示例应用

我不使用 MySQL。但这里是一个使用 H2 Database Engine 的完整示例应用程序.

package work.basil.example;


import org.h2.jdbcx.JdbcDataSource;

import java.sql.*;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class H2DateTimeExample
{
public static void main ( String[] args )
{
H2DateTimeExample app = new H2DateTimeExample ();
app.demo ();
}

private void demo ( )
{
JdbcDataSource dataSource = new JdbcDataSource ();
dataSource.setURL ( "jdbc:h2:mem:offsetdatetime_example_db;DB_CLOSE_DELAY=-1" ); // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
dataSource.setUser ( "scott" );
dataSource.setPassword ( "tiger" );

// Create table.
String sql = "CREATE TABLE person_ ( \n" +
" pkey_ UUID NOT NULL DEFAULT RANDOM_UUID() PRIMARY KEY , \n" +
" name_ VARCHAR NOT NULL , \n" +
"first_contacted_ TIMESTAMP WITH TIME ZONE NOT NULL " +
") ;";
// System.out.println ( sql );
try (
Connection conn = dataSource.getConnection () ;
Statement stmt = conn.createStatement () ;
)
{
stmt.execute ( sql );
} catch ( SQLException e )
{
e.printStackTrace ();
}

// Insert row.
sql = "INSERT INTO person_ ( name_ , first_contacted_ ) \n";
sql += "VALUES ( ? , ? ) \n";
sql += ";";
try (
Connection conn = dataSource.getConnection () ;
PreparedStatement pstmt = conn.prepareStatement ( sql , Statement.RETURN_GENERATED_KEYS ) ;
)
{
OffsetDateTime odt = OffsetDateTime.now ( ZoneOffset.UTC );

pstmt.setString ( 1 , "Jesse Johnson" );
pstmt.setObject ( 2 , odt );
pstmt.executeUpdate ();

ResultSet rs = pstmt.getGeneratedKeys ();
// System.out.println( "INFO - Reporting generated keys." );
// while ( rs.next() ) {
// UUID uuid = rs.getObject( 1 , UUID.class );
// System.out.println( "generated keys: " + uuid );
// }

} catch ( SQLException e )
{
e.printStackTrace ();
}


// Query table.
sql = "TABLE person_ ;";
try (
Connection conn = dataSource.getConnection () ;
PreparedStatement pstmt = conn.prepareStatement ( sql ) ;
)
{
try ( ResultSet rs = pstmt.executeQuery () ; )
{
while ( rs.next () )
{
UUID pkey = rs.getObject ( "pkey_" , UUID.class );
String name = rs.getString ( "name_" );
OffsetDateTime firstContacted = rs.getObject ( "first_contacted_" , OffsetDateTime.class );
System.out.println ( "pkey: " + pkey + " | name: " + name + " | firstContacted: " + firstContacted );
}
}

} catch ( SQLException e )
{
e.printStackTrace ();
}

System.out.println ( "Done." );

}
}

运行时。

pkey: b14fd25f-1598-4f09-9475-83ac5967a338 | name: Jesse Johnson | firstContacted: 2019-07-28T02:10:07.731005Z

Done.

关于mysql - 从 Java 应用程序将时间戳插入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57236858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com