1 回答
TA贡献2036条经验 获得超8个赞
myPreparedStatement.setObject( … , LocalDate.parse( "2018-11-20")) ;
细节
您正在使用设计非常糟糕的java.sql.Date
课程。不幸的是,这个类是一个子类,java.util.Date
尽管文档奇怪地告诉我们忽略继承这一事实。因此,虽然java.sql.Date
假装仅代表一个日期,但它实际上是一个时刻,在某个区域将一天中的时间设置为午夜,然后调整为 UTC。这是一个糟糕的设计,也是从不使用遗留日期时间类的众多原因之一。
对于DATE
SQL 中的列,请改用现代LocalDate
类。
LocalDate
在LocalDate
类真正代表一个日期,只值,没有时间的天,没有时区或偏移从-UTC。
对于类型类似于 SQL 标准DATE
类型的数据库列,请使用LocalDate
Java 中的 类。
LocalDate ld = LocalDate.parse( "2018-11-20" );
JDBC 4.2
从 JDBC 4.2 开始,我们可以直接与数据库交换java.time对象。
myPreparedStatement.setObject( … , ld ) ;
恢复:
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
由于不涉及时区,您检索到的值将与2018-11-20
您存储的值相同。
示例应用
这是一个使用H2 数据库引擎的完整示例应用程序。作为演示,我将它设置为写入内存数据库,而不是持久存储到实际存储中。
我们创建一个只有一个表的数据库,有两列:
一个名为的序号主键
pkey_
DATE
名为的列when_
我们插入几个LocalDate
对象,然后检索要转储到控制台的行。
package com.basilbourque.example;
import java.sql.*;
import java.time.LocalDate;
import java.util.List;
public class EventDate {
public static void main ( String[] args ) {
EventDate app = new EventDate();
app.doIt();
}
private void doIt ( ) {
final String driverName = "org.h2.Driver";
final String catalogName = "event_demo_db";
final String jdbcPath = "jdbc:h2:mem:" + catalogName + ";DB_CLOSE_DELAY=-1"; // Set delay to keep in-memory database even after last connection closed.
// Verify JDBC driver.
try {
Class.forName( driverName );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
// Connect, and create database.
try (
Connection conn = DriverManager.getConnection( jdbcPath ) ;
) {
String sql = null;
// Create table.
try ( Statement stmt = conn.createStatement() ; ) {
sql = "CREATE TABLE " + "event_" + " ( \n" +
" pkey_ IDENTITY PRIMARY KEY , \n" +
" when_ DATE NOT NULL \n" +
") ; \n";
System.out.println( "TRACE - SQL:\n" + sql );
stmt.execute( sql );
}
System.out.println( "TRACE - Created table `event_`." );
// Add rows
sql = "INSERT INTO event_ ( when_ ) \n" +
"VALUES ( ? ) " +
"; ";
List < LocalDate > dates = List.of( LocalDate.parse( "2018-11-10" ) , LocalDate.parse( "2018-12-31" ) );
System.out.println( "Inserting list of LocalDate objects: " + dates );
try (
PreparedStatement ps = conn.prepareStatement( sql ) ;
) {
for ( LocalDate localDate : dates ) {
ps.setObject( 1 , localDate );
ps.executeUpdate();
}
}
// Retrieve rows
sql = "SELECT * FROM " + "event_" + " ;";
try (
Statement stmt = conn.createStatement() ;
ResultSet rs = stmt.executeQuery( sql ) ;
) {
while ( rs.next() ) {
int pkey = rs.getInt( "pkey_" );
LocalDate when = rs.getObject( "when_" , LocalDate.class );
System.out.println( "Row pkey_: " + pkey + " when_: " + when );
}
}
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
跑的时候。
插入 LocalDate 对象列表:[2018-11-10, 2018-12-31]
行 pkey_: 1 when_: 2018-11-10
行 pkey_: 2 when_: 2018-12-31
添加回答
举报