gpt4 book ai didi

java - 如何将 sql DATE 映射到 LocalDate

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:36 24 4
gpt4 key购买 nike

我想在 DATE 列中存储一个 LocalDate 并在不改变的情况下检索它。根据定义,DATELocalDate 都是“本地”类型。因此,时区 的概念不应以任何方式干扰。

下面的代码是一个最小的示例,它在内存数据库中创建一个包含 DATE 列的表。 Maven 工件 com.h2database:h2:1.4.192 必须在类路径中。

首先,定义方法insertretrieve:

static void insert(DataSource ds, String date) throws SQLException {
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement()) {
stmt.execute("CREATE TABLE people (id BIGINT NOT NULL AUTO_INCREMENT"
+ ", born DATE NOT NULL, PRIMARY KEY (id) );");
stmt.execute("INSERT INTO people (born) VALUES ('" + date + "')");
}
}

static LocalDate retrieve(DataSource ds) throws SQLException {
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM people limit 1")) {
if (rs.next()) {
java.sql.Date retrieved = java.sql.Date.valueOf(rs.getString("born"));
return retrieved.toLocalDate();
}
throw new IllegalStateException("No data");
}
}

请注意,insert 方法在单引号中使用 LocalDatetoString 值,因此 Java™ 没有机会创建时区歧义。现在调用 insert 一次,然后多次调用 retrieve,每次使用不同的时区设置:

public static void main(String[] args) throws Exception {
DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "sa", "sa");
LocalDate born = LocalDate.parse("2015-05-20");
insert(ds, born.toString());
System.out.println("Inserted: " + born);
for (int i : new int[]{-14, 0, 12}) {
TimeZone z = TimeZone.getTimeZone(String.format("Etc/GMT%+02d", i));
TimeZone.setDefault(z);
System.out.println("Retrieved: " + retrieve(ds));
}
}

然后打印如下:

Inserted:  2015-05-20Retrieved: 2015-05-20Retrieved: 2015-05-19Retrieved: 2015-05-18

假设数据库表未更改,如何编写retrieve 方法以使其返回无条件插入的相同值?

最佳答案

我刚刚尝试对您的 retrieve 方法进行以下修改,它对我有用:

H2 documentation for the DATE Type说是

The date data type. The format is yyyy-MM-dd.

所以,而不是你的......

java.sql.Date retrieved = (java.sql.Date) rs.getObject("born");
return retrieved.toLocalDate();

...我刚刚用过...

return LocalDate.parse(rs.getString("born"));

...以及我生成的代码

Inserted:  2015-05-20
Retrieved: 2015-05-20
Retrieved: 2015-05-20
Retrieved: 2015-05-20

关于java - 如何将 sql DATE 映射到 LocalDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779418/

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