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

所属分类: 软件编程 / java 阅读数: 23
收藏 0 赞 0 分享

前言

相信大家应该都知道,在实体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文件

注意这里,必须要至少是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代码如下:

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) 

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

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

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多