您的位置:首页 > 大数据

JDBC入门(5)--- 时间类型、大数据

2017-10-06 21:39 246 查看
一、时间类型

数据库类型与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中提供了如下类型来保存大数据类型:

类型长度
tinyblob28-1B(256B)
blob216-1B(64K)
mediumblob224-1B(16M)
longblob232-1B(4G)
tinyclob28-1B(256B)
clob216-1B(64K)
mediumclob224-1B(16M)
longclob232-1B(4G)
但是,在mysql中没有提供tinyclob、clob、mediumclob、longclob四种类型,而是使用如下四种类型来处理文本大数据:

类型长度
tinytext28-1B(256B)
text216-1B(64K)
mediumtext224-1B(16M)
longtext232-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服务器即可解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: