JAVA8时间和Mysql时间的关系
来源:互联网 发布:华讯网络薪资 编辑:程序博客网 时间:2024/06/05 09:58
大家知道,在实体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>
<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代码如下:
- 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();
- }
- }
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)
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>
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4.1212</version></dependency>注意这里添加的数据库驱动版本最低要是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(”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();
- }
- }
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,运行会报如下错误:
- 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)
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两个数据库,其他的数据库,请自行测试。我这里就不演示了,方法都类似。
- JAVA8时间和Mysql时间的关系
- java8时间api和mysql集成的坑
- java8的时间 和 java8以下的日期互转
- java8 新的日期和时间api
- Java8:新的日期和时间API
- Java8新的时间和日期
- java8 新的时期和时间API
- java8的时间处理
- java8的时间api
- java8 获取当天的开始时间和结束时间
- mysql中时间类型和java之间的对于关系
- Java8中的时间和日期
- Java8日期和时间API
- Java8 日期和时间实用技巧
- java8 时间
- JAVA8中时间的处理
- Java8的日期、时间类
- python---时间和时间戳的关系转换
- es6函数扩展(六)
- FFmpeg的Android平台移植—编译篇
- window下和Linux下启动,停止,重启mysql的命令
- Linux芯片级移植与底层驱动(基于3.7.4内核)
- cmd dos 命令
- JAVA8时间和Mysql时间的关系
- convert sample rate from AV_SAMPLE_FMT_FLTP to AV_SAMPLE_FMT_S16
- 下拉框的click、onchange事件
- C# webbrowser 使用Tips
- 共享python代码
- android多Modle统一配置Gradle
- Halcon算子学习 2 6-19
- linux下svn环境的搭建
- jdbc