前言
相信大家應該都知道,在實體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
首先創建表:
1
|
create table tb_java8date (id int not null primary key auto_increment,t_date date, t_time time, t_datetime datetime); |
然后,加入mysql的驅動
1
2
3
4
5
|
<dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version> 5.1 . 37 </version> </dependency> |
上面說了,數據庫驅動的版本不能低于4.2,如何判斷呢?
直接打開數據庫驅動jar,里面有個meta-inf/manifest.mf文件
注意這里,必須要至少是4.2
jdbc代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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(); } } |
運行,查詢數據庫
1
2
3
4
5
6
7
|
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,運行會報如下錯誤:
1
2
3
4
5
6
7
8
9
|
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
首先創建表:
1
|
create table tb_java8date (id serial not null primary key,t_date date, t_time time, t_datetime timestamp); |
然后,加入postgresql的數據庫驅動
1
2
3
4
5
|
<dependency> <groupid>org.postgresql</groupid> <artifactid>postgresql</artifactid> <version> 9.4 . 1212 </version> </dependency> |
注意這里添加的數據庫驅動版本最低要是4.2,檢驗方法和上面類似
jdbc代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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(); } } |
運行,然后查詢數據庫表
發現,已經成功執行
如果你加入的依賴,數據庫的驅動版本低于4.2,運行會報如下錯誤:
1
2
3
|
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兩個數據庫,其他的數據庫,請自行測試。我這里就不演示了,方法都類似。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://blog.csdn.net/mn960mn/article/details/53148044