標籤:red 資料庫 關閉 一半 輸出 main my.cnf string medium
一、時間類型
資料庫類型與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 @Test15 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 * 需要得到Blob27 * 1、我們有的是檔案,目標是Blob28 * 2、先把檔案變成byte[]29 * 3、再使用byte[]建立Blob30 */31 byte[] bytes = IOUtils.toByteArray(new FileInputStream("/Users/Shared/薛之謙-一半.mp3"));32 //使用byte[]建立Blob33 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 * 從資料庫中讀取map352 */53 @Test54 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語句模板,建立pstmt63 String sql = "SELECT * FROM tab_bin";64 pstmt = con.prepareStatement(sql);65 //3、pstmt執行查詢,得到ResultSet66 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)--- 時間類型、大資料