1. 程式人生 > >MySQL初步學習4:處理大資料物件

MySQL初步學習4:處理大資料物件

大資料物件這裡主要指CLOB和BLOB兩種型別的欄位。
    CLOB可以儲存文字資料,而BLOB中可以儲存二進位制資料,如圖片,電影等。而程式中處理這些大物件資料,必須呼叫PreparedStatement完成,所有的內容以IO流的方式從大文字欄位中儲存和讀取。
    PreparedStatement類中提供了兩種方法寫入資料
    setAsciiStream():文字輸入
    setBinaryStream():二進位制輸入
另外,有幾種讀取資料方式:
    getAsciiStream() 獲取文字輸出流
    getBinaryStream() 獲取二進位制輸出流
    getClob()

獲取CLOB資料
    getBlob() 獲取BLOB資料
  

1、處理CLOB資料

    Clob表示大文字資料,在MySQL中有longtext表示大文字型別,最大儲存4G資料。
    首先在資料庫bb中建表如下:
這裡寫圖片描述
    
    文字文件aa存放路徑在”d:\aa.txt”,文字內容:

這裡寫圖片描述

在eclipse中寫入大文字資料

package fileOperation;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;
public
class CLOB_1 { //將文字檔案中的內容寫入到資料庫中 public static void main(String[] args) throws Exception{ Connection con=null; PreparedStatement ps=null; //必須用預處理語句讀取資料 Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb","root","123456"
); ps=con.prepareStatement(" insert into userclob (name,note) values (?,?) "); File f=new File("d:"+File.separator+"aa.txt"); //File.separator表示分隔符,更加通用 InputStream input=new FileInputStream(f); ps.setString(1, "aa"); ps.setAsciiStream(2, input,(int) f.length()); //設定輸入流 ps.executeUpdate(); ps.close(); con.close(); } }

讀取大文字資料

package fileOperation;
import java.io.InputStream;
import java.sql.*;
import java.util.Scanner;

public class CLOB_2 {

    public static void main(String[] args) throws Exception{
        Connection con=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb","root","123456");
        ps=con.prepareStatement(" select name,note from userclob where id=? ");
        ps.setInt(1,1);
        rs=ps.executeQuery();
        while (rs.next()) {
            String name=rs.getString(1);
            StringBuffer note=new StringBuffer();
            InputStream input = rs.getAsciiStream(2);//接收全部大文字資料
            Scanner scan=new Scanner(input);
            scan.useDelimiter("\r\n");      //將檔案換行作為分隔符
            while(scan.hasNext()) {
                note.append(scan.next()).append("\n"); //不斷讀取資料
            }
            System.out.println("內容為"+note);

            System.out.println("*****************************************************************");

            Clob c=rs.getClob(2);
            String note1=c.getSubString(1, (int) c.length());

            System.out.println("內容為"+note);
            c.truncate(10);         //讀取10個長度的內容
            System.out.println("讀取部分內容: "+c.getSubString(1, (int)c.length()) );

            //可以看到,兩種方法均可以讀取檔案中的內容,而下面的這種方法更為簡單
        }
        rs.close();
        ps.close();
        con.close();

    }

}

結果如下:

內容為dsjfgnsk
vzkldfakjgbdn
azjsdjklzjsfhskdgkklbd
szvzgvsdbb

*****************************************************************
內容為dsjfgnsk
vzkldfakjgbdn
azjsdjklzjsfhskdgkklbd
szvzgvsdbb

讀取部分內容: dsjfgnsk

    可以看到,用CLOB讀取資料更加簡潔。

2、處理BLOB物件

    BLOB操作與CLOB相似,專門用於存放二進位制資料,如電影、圖片等。在MySQL中定義了longblob型別變數,最高可以存放4G資料。
    在資料庫建表userblob,方法和上面一樣。
    將圖片寫入到資料表中
    用到的圖片存放到d盤:

在eclipse中程式設計:


package fileOperation;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

public class BLOB_1 {
    public static void main(String[] args) throws Exception{
        Connection con=null;
        PreparedStatement ps=null;  //必須用預處理語句讀取資料
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb","root","123456");
        ps=con.prepareStatement(" insert into userblob (name,photo) values (?,?) ");
        File f=new File("d:"+File.separator+"11.gif");  //File.separator表示分隔符
        InputStream input=new FileInputStream(f);
        ps.setString(1, "bb");
        ps.setBinaryStream(2,input,(int)f.length());
        ps.executeUpdate();
        ps.close();
        con.close();
    }
}

新建一個圖片,內容為空,儲存在d盤,用於接收資料(也可以程式建立,如下一個例子)。讀取內容,將圖片資訊儲存。

package fileOperation;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;

public class BLOB_2 {

    public static void main(String[] args) throws Exception{
        Connection con=null;
        PreparedStatement ps=null;  
        ResultSet rs=null;
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb","root","123456");
        ps=con.prepareStatement(" select name,photo from userblob where id = ? ");

        ps.setInt(1, 1);    
        rs=ps.executeQuery();
        while(rs.next()) {
            String name = rs.getString(1);

            InputStream input =rs.getBinaryStream(2);
            FileOutputStream output = new FileOutputStream(new File("d:"+File.separator+"12.gif"));
            int temp=0;
            while((temp=input.read())!=-1) {
                output.write(temp);
            }
            input.close();
            output.close();
        }

        rs.close();
        ps.close();
        con.close();
    }

}

使用BLOB讀取內容,更加簡單:

package fileOperation;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;
public class BLOB_3 {

    public static void main(String[] args) throws Exception{
        Connection con=null;
        PreparedStatement ps=null;  
        ResultSet rs=null;
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb","root","123456");
        ps=con.prepareStatement(" select name,photo from userblob where id = ? ");

        ps.setInt(1, 1);    
        rs=ps.executeQuery();
        while(rs.next()) {
            String name = rs.getString(1);

            Blob b=rs.getBlob(2);
            File f=new File("d:"+File.separator+"13.gif");
            if(f.exists()) {
                f.delete();
            }
            else
            {
                f.createNewFile();
            }
            FileOutputStream output = new FileOutputStream(new File("d:"+File.separator+"13.gif"));
            output.write(b.getBytes(1, (int) b.length()));
            output.close();
        }

        rs.close();
        ps.close();
        con.close();
    }

}