JDBC入門(5)--- 時間類型、大數據
阿新 • • 發佈:2017-10-06
服務器 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)--- 時間類型、大數據