1. 程式人生 > >clob-資料庫存取大文字檔案、二進位制圖片

clob-資料庫存取大文字檔案、二進位制圖片

 將檔案中所有資料(即大文字)作為資料庫表某一列值存入:

程式碼涉及到IOSQL的相關包:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

 資料庫儲存大文字物件(clob-來自檔案) 


    /**
     * 讀檔案並儲存到資料庫(reader輸入流:檔案——資料庫)
     */
    static void read() {
        String url = "jdbc:mysql://192.168.1.45:3306/employ";
        String uerName = "root";
        String password = "[email protected]";
        try {// 載入mysql資料庫驅動
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        /**
         * 要讀的大文字
         **/
        File file = new File("E:\\data\\logs\\udd-config-admin.log");
        if (!file.exists()) {
            return;
        }
        FileReader reader = null;// 輸入流reader
        try {
            reader = new FileReader(file);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {// 獲取資料庫連線物件
            conn = DriverManager.getConnection(url, uerName, password);
            String sql = "insert into  clob(clob_col) values(?)";
            // 獲取預處理物件(標準sql儲存起來)
            pstmt = conn.prepareStatement(sql);
            pstmt.setCharacterStream(1, reader, file.length());// file大文字內容讀到資料庫
            pstmt.executeUpdate();// 執行資料庫更新
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) {
                    pstmt.close();
                    pstmt = null;
                }
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

  

將資料庫中大文字欄位讀出並寫入檔案方法:

    void writer() {
        String url = "jdbc:mysql://192.168.1.45:3306/employ";
        String uerName = "root";
        String password = "[email protected]";
        try {// 載入mysql資料庫驅動
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        /**
         * 待寫入資料的檔案
         **/
        File file = new File("D:\\data\\test.log");

        FileWriter writer = null;// 輸出流writer
        try {
            if (!file.exists()) {// 檔案不存在,建立空檔案
                file.createNewFile();
            }
            writer = new FileWriter(file);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {// 獲取資料庫連線物件
            conn = DriverManager.getConnection(url, uerName, password);

            String sql = "select * from clob ";
            // 獲取預處理物件(標準sql儲存起來)
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();// 去資料庫查詢

            while (rs.next()) {
                // 從結果集中讀出大文字資料
                Reader rd = rs.getCharacterStream(2);
                char[] buf = new char[1024];
                int len = rd.read(buf);
                while (len != -1) {
                    writer.write(buf, 0, len);
                    len = rd.read(buf);
                }
            }
            writer.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) {
                    pstmt.close();
                    pstmt = null;
                }
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

程式碼中涉及到的表: 

 

CLOB和BLOB的區別

CLOB使用CHAR來儲存資料。  如:儲存XML文件、檔案等

BLOB就是使用二進位制儲存資料。  如:儲存點陣圖、圖片、視訊等

用blob存取圖片安全性更高

因blob與clob資料存取操作類似,下面僅僅貼出blob相關主要程式碼及資料庫樣式:

      /**
         * 要儲存的圖片檔案
         **/
        File file = new File("E:\\flower.jpg");
        if (!file.exists()) {
            return;
        }
        FileInputStream fis = null;// 輸入流
        BufferedInputStream bis = null;// 過濾流,加速

        try {
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {// 獲取資料庫連線物件
            conn = DriverManager.getConnection(url, uerName, password);
            String sql = "insert into  clob(blob_col) values(?)";
            // 獲取預處理物件(標準sql儲存起來)
            pstmt = conn.prepareStatement(sql);
            pstmt.setBinaryStream(1, bis, file.length());// 圖片對應二進位制讀到資料庫
            pstmt.executeUpdate();// 執行資料庫更新
        } catch (SQLException e) {
            e.printStackTrace();
        } 

讀出資料庫中二進位制圖片:

    /**
         * 圖片顯示位置
         **/
        File file = new File("D:\\data\\tt.jpg");

        FileOutputStream fos = null;// 輸出流
        BufferedOutputStream bos = null;
        try {
            if (!file.exists()) {// 檔案不存在,建立空檔案
                file.createNewFile();
            }
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {// 獲取資料庫連線物件
            conn = DriverManager.getConnection(url, uerName, password);

            String sql = "select * from clob ";
            // 獲取預處理物件(標準sql儲存起來)
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();// 去資料庫查詢

            while (rs.next()) {
                // 從結果集中讀出大文字資料
                InputStream is = rs.getBinaryStream(2);
                byte[] buf = new byte[1024];
                int len = is.read(buf);
                while (len != -1) {
                    bos.write(buf, 0, len);
                    len = is.read(buf);
                }
            }
            bos.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

表: