欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql

程序员文章站 2024-02-28 09:16:28
前言 相信大家应该都知道,在实体entity里面,可以使用java.sql.date、java.sql.timestamp、java.util.date来映射到数据库的d...

前言

相信大家应该都知道,在实体entity里面,可以使用java.sql.date、java.sql.timestamp、java.util.date来映射到数据库的date、timestamp、datetime等字段

但是,java.sql.date、java.sql.timestamp、java.util.date这些类都不好用,很多方法都过时了。

java8里面新出来了一些api,localdate、localtime、localdatetime 非常好用

如果想要在jdbc中,使用java8的日期localdate、localdatetime,则必须要求数据库驱动的版本不能低于4.2

下面将分别演示如何在jdbc中使用java8的日期localdate、localdatetime来操作mysql,postgresql,话不多说了,来一看看详细的介绍吧。

一:mysql

首先创建表:

create table tb_java8date (id int not null primary key auto_increment,t_date date, t_time time, t_datetime datetime);

然后,加入mysql的驱动

<dependency> 
 <groupid>mysql</groupid> 
 <artifactid>mysql-connector-java</artifactid> 
 <version>5.1.37</version> 
</dependency> 

上面说了,数据库驱动的版本不能低于4.2,如何判断呢?

直接打开数据库驱动jar,里面有个meta-inf/manifest.mf文件

JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql

注意这里,必须要至少是4.2

jdbc代码如下:

import java.sql.connection; 
import java.sql.drivermanager; 
import java.sql.preparedstatement; 
import java.time.localdate; 
import java.time.localdatetime; 
import java.time.localtime; 
 
public class app { 
 public static void main(string[] args) throws exception { 
  class.forname("com.mysql.jdbc.driver"); 
  connection conn = drivermanager.getconnection("jdbc:mysql://192.168.1.100:3306/db_java8","root","root123"); 
  preparedstatement st = conn.preparestatement("insert into tb_java8date (t_date,t_time,t_datetime)values(?,?,?)"); 
  st.setobject(1, localdate.now()); 
  st.setobject(2, localtime.now()); 
  st.setobject(3, localdatetime.now()); 
  st.execute(); 
  st.close(); 
  conn.close(); 
 } 
} 

运行,查询数据库

mysql> select * from tb_java8date;
+----+------------+----------+---------------------+
| id | t_date  | t_time | t_datetime   |
+----+------------+----------+---------------------+
| 1 | 2016-11-13 | 11:34:31 | 2016-11-13 11:34:31 |
+----+------------+----------+---------------------+
1 row in set (0.00 sec)

看到已经成功插入到数据库中去了

如果你使用的mysql-connector-java版本低于5.1.37,则数据库的驱动版本低于4.2,运行会报如下错误:

exception in thread "main" com.mysql.jdbc.mysqldatatruncation: data truncation: incorrect date value: '\xac\xed\x00\x05sr\x00\x0djava.time.ser\x95]\x84\xba\x1b"h\xb2\x0c\x00\x00xpw\x07\x03\x00\x00\x07\xe0\x0b\x0dx' for column 't_date' at row 1 
 at com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3845) 
 at com.mysql.jdbc.mysqlio.checkerrorpacket(mysqlio.java:3783) 
 at com.mysql.jdbc.mysqlio.sendcommand(mysqlio.java:2447) 
 at com.mysql.jdbc.mysqlio.sqlquerydirect(mysqlio.java:2594) 
 at com.mysql.jdbc.connectionimpl.execsql(connectionimpl.java:2545) 
 at com.mysql.jdbc.preparedstatement.executeinternal(preparedstatement.java:1901) 
 at com.mysql.jdbc.preparedstatement.execute(preparedstatement.java:1193) 
 at com.pp.app.main(app.java:18) 

二:postgresql

首先创建表:

create table tb_java8date (id serial not null primary key,t_date date, t_time time, t_datetime timestamp);

然后,加入postgresql的数据库驱动

<dependency> 
 <groupid>org.postgresql</groupid> 
 <artifactid>postgresql</artifactid> 
 <version>9.4.1212</version> 
</dependency> 

注意这里添加的数据库驱动版本最低要是4.2,检验方法和上面类似

JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql

jdbc代码如下:

import java.sql.connection; 
import java.sql.drivermanager; 
import java.sql.preparedstatement; 
import java.time.localdate; 
import java.time.localdatetime; 
import java.time.localtime; 
 
public class app { 
 public static void main( string[] args ) throws exception { 
  class.forname("org.postgresql.driver"); 
  connection conn = drivermanager.getconnection("jdbc:postgresql://127.0.0.1:5432/pg_java8","admin","123456"); 
  preparedstatement st = conn.preparestatement("insert into tb_java8date (t_date,t_time,t_datetime)values(?,?,?)"); 
  system.out.println(st.getclass()); 
  st.setobject(1, localdate.now()); 
  st.setobject(2, localtime.now()); 
  st.setobject(3, localdatetime.now()); 
  st.execute(); 
  st.close(); 
  conn.close(); 
 } 
} 

运行,然后查询数据库表

JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql

发现,已经成功执行

如果你加入的依赖,数据库的驱动版本低于4.2,运行会报如下错误:

exception in thread "main" org.postgresql.util.psqlexception: can't infer the sql type to use for an instance of java.time.localdate. use setobject() with an explicit types value to specify the type to use. 
 at org.postgresql.jdbc.pgpreparedstatement.setobject(pgpreparedstatement.java:1051) 
 at com.pp.app.main(app2.java:16) 

以上只是演示了mysql,postgresql两个数据库,其他的数据库,请自行测试。我这里就不演示了,方法都类似。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。