二进制数据

mysql提供了四种类型来存储二进制数据:

  • TinyBlob    最多可存储255字节
  • Blob   最多可存储65KB
  • MediumBlob    最多可存储16MB
  • LongBlob   最多可存储4GB
 //从properties文件中加载数据库配置
Properties properties = new Properties();
InputStream inputStream = Class.forName("test.Test").getResourceAsStream("/mysql.properties");
properties.load(inputStream); String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password"); Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, password); //插入
String sql1="insert into test_tb (id,blob_col) values (?,?)";
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
InputStream is = new FileInputStream("resource/a.png");
preparedStatement1.setInt(1,1);
preparedStatement1.setBlob(2,is); //参数是InputStream型
preparedStatement1.executeUpdate(); //查询
String sql2="select blob_col from test_tb where id=?";
PreparedStatement preparedStatement2=connection.prepareStatement(sql2);
preparedStatement2.setInt(1,1);
ResultSet resultSet = preparedStatement2.executeQuery();
if (resultSet.next()){
FileOutputStream os=new FileOutputStream("resource/b.png");
Blob blob = resultSet.getBlob("blob_col");
InputStream binaryStream = blob.getBinaryStream();
byte[] data=binaryStream.readAllBytes();
os.write(data);
} connection.close();

存储的只是文件中的数据,文件名需要使用单独的一列来保存。

一般我们是把文件上传到服务器上,数据库中存储文件路径。如果文件特别小,也可以直接存到数据库中。

日期

mysql中提供了date表示日期,格式:yyyy-mm-dd。

 //插入
String sql1 = "insert into test_tb (date_col) values (?)";
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
Date date1 = new Date(System.currentTimeMillis()); //获取当前日期。使用当前时间的时间戳构造出日期
preparedStatement1.setDate(1,date1);
preparedStatement1.executeUpdate(); //查询
String sql2 = "select date_col from test_tb";
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
ResultSet resultSet = preparedStatement2.executeQuery();
while (resultSet.next()){
Date date2 = resultSet.getDate("date_col");
System.out.println(date2);
}

时间

mysql提供了time表示时间,格式:HH:mm:ss,hh是24小时制。

操作方法和日期的相同,把Date换为Time即可,也是使用System.currentTimeMillis()来构造。

与Date不同的是,Time还可以使用new  java.util.Date().getTime()来构造。java.util.Date()构造的Date对象既包括当前日期,也包括当前时间。getTime()获取的是long型的时间戳。

日期时间

mysql提供了timestamp、datetime来存储日期时间,使用方式都差不多,格式都是:yyyy-mm-dd  HH:mm:ss。

         //插入
String sql1 = "insert into test_tb (timestamp_col) values (?)";
PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);
Timestamp timestamp1 = new Timestamp(System.currentTimeMillis()); //也可使用new Date().getTime()来构造
preparedStatement1.setTimestamp(1,timestamp1);
preparedStatement1.executeUpdate(); //查询
String sql2 = "select timestamp_col from test_tb";
PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);
ResultSet resultSet = preparedStatement2.executeQuery();
while (resultSet.next()){
Timestamp timestamps2 = resultSet.getTimestamp("timestamp_col"); Date date=new Date(timestamps2.getTime()); //此句的Date是java.util.Date
System.out.println(date); //Sun Aug 18 18:56:35 CST 2019的形式,不友好 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
String formatDT = sdf.format(timestamps2); //使用指定的格式来格式化,参数可以是Timestamp、long型的时间戳、Date
System.out.println(formatDT); //2019-08-18 19:06:06
}

也可以使用2列来存储,一列存储Date,一列存储Time。

未说明类型的Date、Time、Timestamp,是java.sql包下的。

new Date().getTime()的Date是java.util.Date,默认取当前日期时间,java.sql.Date的构造函数是需要参数的。

datetime、timestamp的异同点

  • 存储格式都是yyyy-mm-dd  HH:mm:ss
  • datetime占用8个字节,timestamp占用4个字节
  • 因为占用的字节数不同,能表示的时间日期范围不一样。timestamp:1970-01-01 00:00:01 ~ 2038-01-19 , datetime范围:1000-01-01 00:00:00 ~  9999-12-31 23:59:59。

很多时候使用timestamp就够了,对数据库空间的利用率高。

有些字段需要使用系统当前时间,比如添加一个用户时,可能要用字段create_time来记录当前时间,设置默认值为now() 即可。

Java JDBC 操作二进制数据、日期时间的更多相关文章

  1. Java JDBC批处理插入数据操作

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  2. Java JDBC批处理插入数据操作(转)

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  3. JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...

  4. Java 之 JDK1.8之前日期时间类

    一.JDK1.8之前日期时间类 二. java.lang.System类 System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1 ...

  5. JAVA IO操作:数据操作流:DataOutputStream和DataInputStream

    掌握DataOutputStream和DataInputStream的作用. 可以使用DataOutputStream和DataInputStream写入和读取数据. 在IO包中提供了两个与平台无关的 ...

  6. JDBC操作MySQL数据

    对原始jdbc进行封装 package com.utils; import java.sql.Connection; import java.sql.DriverManager; import jav ...

  7. Java jdbc 操作数据库详解

    原文地址https://www.cnblogs.com/huguodong/p/5910859.html JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  8. Java基础——常用类之日期时间类

    如果有机会,请尝试Java8中全新的时间日期API!(参见Java8新特性随笔) 如果还是使用Java7及之前的版本,那么你可以尝试一些工具类(参考使用工具类相关的Hutool-DateUtil) 如 ...

  9. java JDBC操作MySQL数据库

    一,首先在MYSQL建立一个数据库,例如Geek99DB: create database Geek99DB; use Geek99DB; 然后建立一个表CustomerTab: create tab ...

随机推荐

  1. Pandas | 15 窗口函数

    为了处理数字数据,Pandas提供了几个变体,如滚动,展开和指数移动窗口统计的权重. 其中包括总和,均值,中位数,方差,协方差,相关性等.本章讨论的是在DataFrame对象上应用这些方法. .rol ...

  2. [无效]网络流之Dinic算法

    // 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html UPDA ...

  3. 详细讲解redis数据结构(内存模型)以及常用命令

    Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...

  4. 剑指offer:机器人的运动范围(回溯法DFS)

    题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...

  5. 每日一问:不一样的角度吐槽下 DataBinding

    我们项目采用的是 kotlin && DataBinding 处理的,可能你会疑问,既然用的是 kotlin,为啥没有用 kotlinx?新的页面当然是用的 kotlinx 啦,但我们 ...

  6. 【技术博客】Postman接口测试教程 - 环境、附加验证、文件上传测试

    Postman接口测试教程 - 环境.附加验证.文件上传测试 v1.0 作者:ZBW 前言 继利用Postman和Jmeter进行接口性能测试之后,我们发现Postman作为一款入门容易的工具,其内置 ...

  7. 安装gerrit服务器

    一.环境准备 1.Java环境 gerrit依赖,用于安装gerrit环境. 下载:jdk-7u79-linux-x64.tar.gz http://www.oracle.com/technetwor ...

  8. 【Activiti学习之一】Activiti入门

    环境 JDK1.7 MySQL5.6 Tomcat7 Eclipse-Luna activiti 6.0 一.概念1.工作流(Workflow):是一系列相互衔接.自动进行的业务活动或任务.采用工作流 ...

  9. 【C/C++开发】C++11 并发指南三(std::mutex 详解)

    本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...

  10. spring JDBC的应用

    原文地址:https://www.iteye.com/blog/chen106106-1574911 1:首先在类路径下面配置访问数据的一些基本信息,包括连接数据库的地址,用户,密码jdbc.prop ...