1. 程式人生 > >Mysql資料庫大文字資料處理

Mysql資料庫大文字資料處理

資料庫大文字資料處理
    目標:把 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--1B256B

clob

216-1B64K

mediumclob

224-1B16M

longclob

232-1B4G

    但是,在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,
          filename   VARCHAR(100),
          data       MEDIUMBLOB
        );

  還有一種方法,就是把要儲存的資料包裝成Blob型別,然後呼叫PreparedStatement的setBlob()方法來設定資料
    程式碼如下:
        package cn.itcast.demo4;
        主要的包
        import java.sql.Blob;
        import javax.sql.rowset.serial.SerialBlob;
        import org.apache.commons.io.IOUtils;
        import cn.itcast.demo3.JdbcUtils;
    
        /**
        * 大文字資料
        */
        public class Demo4 {
    
            // 把mp3儲存到資料庫中。
            @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
            */
            @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);
                }
            }
        }