標籤:javaweb commons logs 輸出資料流 jdbcutil height lib next 語句
黑馬程式員_超全面的JavaWeb視頻教程vedio\黑馬程式員_超全面的JavaWeb教程-源碼筆記\JavaWeb視頻教程_day17-資料源碼\day17_code\day17_1\
大資料
目標:把mp3儲存到資料庫中!
在my.ini中添加如下配置!
max_allowed_packet=10485760
1 什麼是大資料
所謂大資料,就是大的位元組資料,或大的字元資料。標準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) |
首先我們需要建立一張表,表中要有一個mediumblob(16M)類型的欄位。
CREATE TABLE tab_bin(id INT PRIMARY KEY AUTO_INCREMENT,filenameVARCHAR(100),data MEDIUMBLOB);
向資料庫插入位元據需要使用PreparedStatement為原setBinaryStream(int, InputSteam)方法來完成。
con = JdbcUtils.getConnection(); String sql = "insert into tab_bin(filename,data) values(?, ?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, "a.jpg"); InputStream in = new FileInputStream("f:\\a.jpg"); pstmt.setBinaryStream(2, in); pstmt.executeUpdate(); |
讀取位元據,需要在查詢後使用ResultSet類的getBinaryStream()方法來擷取輸入資料流對象。也就是說,PreparedStatement有setXXX(),那麼ResultSet就有getXXX()。
con = JdbcUtils.getConnection(); String sql = "select filename,data from tab_bin where id=?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); rs = pstmt.executeQuery(); rs.next(); String filename = rs.getString("filename"); OutputStream out = new FileOutputStream("F:\\" + filename); InputStream in = rs.getBinaryStream("data"); IOUtils.copy(in, out); out.close(); |
還有一種方法,就是把要儲存的資料封裝成Blob類型,然後調用PreparedStatement的setBlob()方法來設定資料
con = JdbcUtils.getConnection(); String sql = "insert into tab_bin(filename,data) values(?, ?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, "a.jpg"); File file = new File("f:\\a.jpg"); byte[] datas = FileUtils.getBytes(file);//擷取檔案中的資料 Blob blob = new SerialBlob(datas);//建立Blob對象 pstmt.setBlob(2, blob);//設定Blob類型的參數 pstmt.executeUpdate(); |
con = JdbcUtils.getConnection(); String sql = "select filename,data from tab_bin where id=?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); rs = pstmt.executeQuery(); rs.next(); String filename = rs.getString("filename"); File file = new File("F:\\" + filename) ; Blob blob = rs.getBlob("data"); byte[] datas = blob.getBytes(0, (int)file.length()); FileUtils.writeByteArrayToFile(file, datas); |
上課老師敲的代碼:
package cn.itcast.demo4;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.sql.Blob;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import javax.sql.rowset.serial.SerialBlob;import org.apache.commons.io.IOUtils;import org.junit.Test;import cn.itcast.demo3.JdbcUtils;/** * 大資料 * @author cxf * */public class Demo4 { /** * 把mp3儲存到資料庫中。 * @throws SQLException * @throws IOException * @throws FileNotFoundException */ @Test public void fun1() throws Exception { /* * 1. 得到Connection * 2. 給出sql模板,建立pstmt * 3. 設定sql模板中的參數 * 4. 調用pstmt的executeUpdate()執行 */ Connection con = JdbcUtils.getConnection(); String sql = "insert into tab_bin values(?,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setInt(1, 1); pstmt.setString(2, "流光飛舞.mp3"); /** * 需要得到Blob * 1. 我們有的是檔案,目標是Blob * 2. 先把檔案變成byte[] * 3. 再使用byte[]建立Blob */ // 把檔案轉換成byte[] byte[] bytes = IOUtils.toByteArray(new FileInputStream("F:/流光飛舞.mp3")); // 使用byte[]建立Blob Blob blob = new SerialBlob(bytes); // 設定參數 pstmt.setBlob(3, blob); pstmt.executeUpdate(); } /** * 從資料庫讀取mp3 * @throws SQLException */ @Test public void fun2() throws Exception { /* * 1. 建立Connection */ Connection con = JdbcUtils.getConnection(); /* * 2. 給出select語句模板,建立pstmt */ String sql = "select * from tab_bin"; PreparedStatement pstmt = con.prepareStatement(sql); /* * 3. pstmt執行查詢,得到ResultSet */ ResultSet rs = pstmt.executeQuery(); /* * 4. 擷取rs中名為data的列資料 */ if(rs.next()) { Blob blob = rs.getBlob("data"); /* * 把Blob變成硬碟上的檔案! */ /* * 1. 通過Blob得到輸入資料流對象 * 2. 自己建立輸出資料流對象 * 3. 把輸入資料流的資料寫入到輸出資料流中 */ InputStream in = blob.getBinaryStream(); OutputStream out = new FileOutputStream("c:/lgfw.mp3"); IOUtils.copy(in, out); } }}
大資料-將MP3儲存到資料庫並讀取出來《黑馬程式員_超全面的JavaWeb視頻教程vedio》day17