1. 程式人生 > >JDBC入門(5)--- 時間類型、大數據

JDBC入門(5)--- 時間類型、大數據

服務器 setting fun exceptio finall trace rep rest bytes

一、時間類型

數據庫類型與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入門(5)--- 時間類型、大數據