JDBC入门--- 时间类型大数据

Posted gdwkong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC入门--- 时间类型大数据相关的知识,希望对你有一定的参考价值。

一、时间类型

数据库类型与Java中类型的对应关系:

DATE->java.sql.Date:表示日期,只有年月日,没有时分秒,会丢失时间。

TIME->java.sql.Time:表示时间,只有时分秒,没有年月日,会丢失日期。

TIMESTAMP->java.sql.Timestamp:表示时间戳,有年月日时分秒,以及毫秒。

  • 领域对象(domain)中的所有属性不能出现java.sql包下的对象,即不能使用java.sql.Date
  • ResultSet#getDate()返回的是java.sql.Date()
  • PreparedStatement#setDate(int,Date),其中第二个参数也是java.sql.Date

时间类型的转换:

  • java.util.Date ->java.sql.Date、Time、Timestamp
    • 把util的Date转换成毫秒值
    • 使用毫秒值创建sql的Date、Time、Timestamp
  • java.sql.Date、Time、Timestamp->java.util.Date 
    • 这一不不需要处理了:因为java.sql.Date是java.util.Date的子类。  

java.util.Date date = new java.util.Date();

long l = date.getTime();

java.sql.Date sqlDate = new java.sql.Date(l);

二、大数据

所谓大数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:

类型 长度
tinyblob 28-1B(256B)
blob 216-1B(64K)
mediumblob 224-1B(16M)
longblob 232-1B(4G)
tinyclob 28-1B(256B)
clob 216-1B(64K)
mediumclob 224-1B(16M)
longclob 232-1B(4G)

 

 

 

 

 

 

 

 

 

但是,在mysql中没有提供tinyclob、clob、mediumclob、longclob四种类型,而是使用如下四种类型来处理文本大数据:

类型 长度
tinytext 28-1B(256B)
text 216-1B(64K)
mediumtext 224-1B(16M)
longtext 232-1B(4G)

 

 

 

 

 

实例:

 1 package demo4;
 2 
 3 import demo3.JdbcUtils;
 4 import org.apache.commons.io.IOUtils;
 5 import org.junit.Test;
 6 import javax.sql.rowset.serial.SerialBlob;
 7 import java.io.*;
 8 import java.sql.*;
 9 
10 public class Demo4 {
11     /**
12      * 把map3保存到数据库中、JdbcUtils为自建类
13      */
14     @Test
15     public void fun1() {
16         Connection con = null;
17         PreparedStatement pstmt = null;
18         Blob blob;
19         try {
20             con = JdbcUtils.getConnection();
21             String sql = "INSERT INTO tab_bin VALUES (?,?,?)";
22             pstmt = con.prepareStatement(sql);
23             pstmt.setInt(1,1);
24             pstmt.setString(2,"薛之谦-一半.mp3");
25             /**
26              * 需要得到Blob
27              * 1、我们有的是文件,目标是Blob
28              * 2、先把文件变成byte[]
29              * 3、再使用byte[]创建Blob
30              */
31             byte[] bytes = IOUtils.toByteArray(new FileInputStream("/Users/Shared/薛之谦-一半.mp3"));
32             //使用byte[]创建Blob
33             blob = new SerialBlob(bytes);
34             //设置参数
35             pstmt.setBlob(3,blob);
36             pstmt.executeUpdate();
37         } catch (SQLException e) {
38             e.printStackTrace();
39         } catch (IOException e) {
40             e.printStackTrace();
41         } finally {
42             try {
43                 if (pstmt != null) pstmt.close();
44                 if (con != null) con.close();
45             } catch (SQLException e) {
46                 e.printStackTrace();
47             }
48         }
49     }
50     /**
51      * 从数据库中读取map3
52      */
53     @Test
54     public void fun2() {
55         Connection con = null;
56         PreparedStatement pstmt = null;
57         ResultSet rs = null;
58         Blob blob;
59         //1、得到连接
60         try {
61             con = JdbcUtils.getConnection();
62             //2、给出select语句模板,创建pstmt
63             String sql = "SELECT * FROM tab_bin";
64             pstmt = con.prepareStatement(sql);
65             //3、pstmt执行查询,得到ResultSet
66             rs = pstmt.executeQuery();
67             //获取名为DATA列的数据
68             if (rs.next()) {
69                 blob = rs.getBlob("DATA");
70                 //把Blob变成硬盘上的文件
71                     /*
72                     * 1、通过Blob得到输入流对象
73                     * 2、自己创建输出流对象
74                     * 3、把输入流的数据写到输出流中
75                     * */
76                 InputStream in = blob.getBinaryStream();
77                 OutputStream out = new FileOutputStream("/Users/Mac/Downloads/薛之谦-一半2.mp3");
78                 IOUtils.copy(in, out);
79             }
80         } catch (SQLException e) {
81             e.printStackTrace();
82         } catch (IOException e) {
83             e.printStackTrace();
84         } finally {
85             try {
86                 if (rs != null) rs.close();
87                 if (pstmt != null) pstmt.close();
88                 if (con != null) con.close();
89             } catch (SQLException e) {
90                 e.printStackTrace();
91             }
92         }
93     }
94 }

当存储数据大于设定值时会报如下异常:

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4188642 > 1048576). You can change this value on the server by setting the max_allowed_packet\' variable.

需要对mysql配置文件(Mac中 /etc/my.cnf)相应位置进行添加修改:

保存关闭,重启MySQL服务器即可解决。

 

以上是关于JDBC入门--- 时间类型大数据的主要内容,如果未能解决你的问题,请参考以下文章

部分代码片段

入门大数据需要学习啥内容?

JDBC大数据的采取

如何绕过将数据模型传递给片段参数以避免事务太大异常?

21jdbc入门1

jdbc入门