如何将sql DATE映射到LocalDate

我想将一个LocalDate存储在DATE列中并保持不变.根据定义,DATE和LocalDate都是“本地”类型.因此,时区的概念不应以任何方式干涉.

下面的代码一个最小的示例,它在内存数据库中创建一个带有DATE列的表. maven artifact com.h2database:h2:1.4.192必须位于类路径中.

首先,定义方法insert和retrieve:

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方法在单引号中使用LocalDate的toString值,因此Java™没有机会创建时区歧义.现在调用insert一次然后多次检索,每次使用不同的timzone设置:

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-20
Retrieved: 2015-05-20
Retrieved: 2015-05-19
Retrieved: 2015-05-18

如何编写检索方法,以便它返回无条件插入的相同值,假设数据库表没有更改?

解决方法:

我刚刚对你的检索方法进行了以下修改,它对我有用:

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

相关文章

连接数据库的方式:第一种方式:ODBC:开放数据库连接是微软...
JDBCRequest 使用VariableNamesmysql:数据库连接池对象var...
 1.JDBCDBC(JavaDataBaseConnectivity):Java数据库连接技术...
1.需要jar包的支持:java.sqljavax.sqlmysql-conneter-java....
1.简介Activiti是一个业务流程管理(BPM)框架,它是覆盖了业务...
1.JDBC体系系统一组规范:接口JDBC接口(API)包括两个层次:...