在JDBC中使用Java8的日期LocalDate、LocalDateTime

时间:2022-09-11 21:21:21

  在实体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 tab_java8date (id int not null primary key auto_increment,t_date date, t_time time, t_datetime datetime);

然后,加入mysql的驱动

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <version>5.1.37</version>
  5. </dependency>

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

直接打开数据库驱动jar,里面有个META-INF/MANIFEST.MF文件

在JDBC中使用Java8的日期LocalDate、LocalDateTime

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

JDBC代码如下:

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.time.LocalDate;
  5. import java.time.LocalDateTime;
  6. import java.time.LocalTime;
  7. public class App {
  8. public static void main(String[] args) throws Exception {
  9. Class.forName("com.mysql.jdbc.Driver");
  10. Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.1.100:3306/db_java8","root","root123");
  11. PreparedStatement st = conn.prepareStatement("insert into tab_java8date (t_date,t_time,t_datetime)values(?,?,?)");
  12. st.setObject(1, LocalDate.now());
  13. st.setObject(2, LocalTime.now());
  14. st.setObject(3, LocalDateTime.now());
  15. st.execute();
  16. st.close();
  17. conn.close();
  18. }
  19. }

运行,查询数据库

mysql> select * from tab_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. 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
  2. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3845)
  3. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783)
  4. at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447)
  5. at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594)
  6. at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545)
  7. at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1901)
  8. at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1193)
  9. at com.pp.App.main(App.java:18)

对于mysql驱动器,可以通过查看release note查看支持的版本,https://dev.mysql.com/doc/relnotes/connector-j/5.1/en/news-5-1-45.html。

在JDBC中使用Java8的日期LocalDate、LocalDateTime的更多相关文章

  1. &lpar;后端&rpar;mybatis中使用Java8的日期LocalDate、LocalDateTime

    原文地址:https://blog.csdn.net/weixin_38553453/article/details/75050632 MyBatis的型处理器是属性“createdtime参数映射为 ...

  2. java8中计算两个日期时间LocalDateTime的时间差,格式化成xx年yy月zz日aa时bb分cc秒

    原则上应该适用Period来计算,因为他是专门为这种需求设计的.当时他只能计算到两个时间差的,年月日 传入参数Period.between(LocalDate,LocalDate) 这里是计算两个Lo ...

  3. Java8 中的时间和日期 API

    1. 日期和时间概述 LocalDate,LocalTime,LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 日历系统 的日期,时间,日期和时间;它们提供了简单的日期 ...

  4. Java日期时间API系列8-----Jdk8中java&period;time包中的新的日期时间API类的LocalDate源码分析

    目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...

  5. Java日期时间API系列11-----Jdk8中java&period;time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

    通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...

  6. &lbrack;转&rsqb;JDBC中日期时间的处理技巧

    Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...

  7. 【Java 与数据库】JDBC中日期时间的处理技巧

    JDBC中日期时间的处理技巧 详谈Java.util.Date和Java.sql.Date 基础知识 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒 ...

  8. 如何在JDK1&period;8中愉快地处理日期和时间

    如何在JDK1.8中愉快地处理日期和时间 JDK1.8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. ...

  9. Java日期时间API系列7-----Jdk8中java&period;time包中的新的日期时间API类的特点

    1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp ...

随机推荐

  1. C&plus;&plus;学习基础十——子类构造函数与析构函数的执行

    1.子类构造函数的执行: 先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数. 当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关 ...

  2. Codeforces Round &num;306 &lpar;Div&period; 2&rpar;

    A. Two Substrings You are given string s. Your task is to determine if the given string s contains t ...

  3. iOS一个开发系列中 - UIButton 使用摘要

    // 初始化button并设置类型 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // 可以定义的UIButto ...

  4. Jupyter Notebook的快捷键

    Jupyter Notebook 有两种键盘输入模式. 编辑模式,允许你往单元中键入代码或文本,这时的单元框线是绿色的. 命令模式,键盘输入运行程序命令:这时的单元框线是蓝色.       命令模式 ...

  5. ArrayList源码理解

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Col ...

  6. iOS - is missing from working copy

    解决方案:1.打开终端2.cd 到警告所提示的文件夹下3.执行命令svn rm --force 丢失文件的名称 丢失的文件太多批量处理:1.打开终端2.sudo find /Users/mac/Des ...

  7. Mysql 5&period;7源码编译启动 报error问题:The server quit without updating PID file &lpar;&sol;data&sol;data&lowbar;mysql&sol;mysql&period;pid&rpar;&period;

    一般是报error问题就是我们的mysql没有权限,这里主要是指三点:一个是mysql的安装主目录要设为mysql用户和用户组.一个是logs目录设置为mysql用户以及用户组.还有一个是data目录 ...

  8. ABAP-BarCode-2-Excel打印二维码

    以前用Excel打印过二维码看板标签,将实现过程备注下. 1.安装控件 安装文件:TBarCodeOffice.exe 2.控件注册 打开Excel,找到[选项] 在打开的界面选择[加载项],在活动应 ...

  9. CountDownTimer倒计时器的使用

    以前好多倒计时的需求都需要自己去写,今天发现android 原来自带了倒计时的类CountDownTimer,和适合用于发送短信 ,等待验证码的情况 代码展示了在一个TextView进行60S的倒计时 ...

  10. Python3 列表 clear&lpar;&rpar; 方法

    描述 Python3 列表 clear() 方法用于清空列表,类似于 del a[:]. 语法 clear() 方法语法: L.clear() 参数 无. 返回值 该方法没有返回值. 实例 以下实例展 ...