如何使用 JDBC 從表中讀取 BLOB 和 CLOB 型別列的資料?
Clob 資料型別
CLOB 代表字元大物件。一般來說,SQL Clob 是一種內建資料型別,用於儲存大量文字資料。使用此資料型別,您可以儲存最多 2,147,483,647 個字元的資料。MYSQL 資料庫提供 Clob 資料型別的支援:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。
JDBC API 的 java.sql.Clob 介面表示 CLOB 資料型別。由於 JDBC 中的 Clob 物件是使用 SQL 定位器實現的,因此它持有指向 SQL CLOB 的邏輯指標(而不是資料)。
從 Clob 資料型別列讀取資料
您可以使用 ResultSet 介面的 getCharacterStream() 或 getClob() 方法從表中讀取 CLOB 值(字元流資料)。
這些方法接受一個表示所需列索引的整數值(或表示其名稱的字串值),並從中讀取 CLOB 資料。
ResultSet rs = stmt.executeQuery("SELECT * from articles_data"); rs.next(); Clob clob = rs.getClob("File");
Blob 資料型別
BLOB 是一個二進位制大物件,可以儲存可變數量的資料,最大長度為 65535 個字元。
它們用於儲存大量二進位制資料,例如影像或其他型別的檔案。MySQL 使用 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB 支援 BLOB 資料型別。
JDBC API 的 java.sql.Blob 介面表示 BLOB 資料型別。由於 JDBC 中的 Blob 物件是使用 SQL 定位器實現的,因此它持有指向 SQL BLOB 的邏輯指標(而不是資料)。
從 Blob 資料型別列讀取資料
您可以使用 ResultSet 介面的 getBinaryStream() 或 getBlob() 方法從表中讀取 BLOB 值(二進位制資料)。
這些方法接受一個表示所需列索引的整數值(或表示其名稱的字串值),並從中讀取 CLOB 資料。
ResultSet rs = stmt.executeQuery("SELECT * from articles_data"); rs.next(); Blob blob = rs.getBlob("image");
讓我們使用如下所示的 CREATE 語句在 MySQL 中建立一個名為 articles_data 的表:
CREATE TABLE articles_data ( Name VARCHAR(255), Article LONGTEXT, Logo Blob);
以下 JDBC 程式將記錄插入到 articles_data 表中,檢索回記錄,並將 article 和 logo 列的內容分別儲存為檔案和影像,並指定路徑。
示例
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStream; import java.io.Reader; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class ReadingDataFromBlobandClob { public static void main(String args[]) throws Exception { //Registering the Driver DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //Getting the connection String mysqlUrl = "jdbc:mysql:///sampledatabase"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("Connection established......"); //Inserting values String query = "INSERT INTO articles_data(Name, Article, Logo) VALUES (?, ?, ?)"; PreparedStatement pstmt = con.prepareStatement(query); pstmt.setString(1, "JavaFX"); FileReader fileReader = new FileReader("E:\images\javafx_contents.txt"); pstmt.setClob(2, fileReader); InputStream inputStream = new FileInputStream("E:\images\javafx_logo.jpg"); pstmt.setBlob(3, inputStream); pstmt.execute(); System.out.println("Record inserted......"); //Retrieving the results Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * from articles_data"); while(rs.next()) { String name = rs.getString("Name"); Clob clob = rs.getClob("Article"); Blob blob = rs.getBlob("Logo"); System.out.println("Name: "+name); System.out.println("Clob value: "+clob); System.out.println("Blob value: "+blob); System.out.println(""); System.out.print("Clob data is stored at: "); //Storing clob to a file int i, j =0; Reader r = clob.getCharacterStream(); String filePath = "E:\output\"+name+"_article_content.txt"; FileWriter writer = new FileWriter(filePath); while ((i=r.read())!=-1) { writer.write(i); } writer.close(); System.out.println(filePath); j++; System.out.print("Blob data is stored at: "); InputStream is = blob.getBinaryStream(); byte byteArray[] = new byte[is.available()]; is.read(byteArray); filePath = "E:\output\"+name+"_article_logo.jpg"; FileOutputStream outPutStream = new FileOutputStream(filePath); outPutStream.write(byteArray); System.out.println(filePath); } } }
輸出
Connection established...... Record inserted...... Name: JavaFX Clob value: com.mysql.jdbc.Clob@18ef96 Blob value: com.mysql.jdbc.Blob@6956de9 Clob data is stored at: E:\output\JavaFX_article_content.txt Blob data is stored at: E:\output\JavaFX_article_logo.jpg
如果驗證指定路徑下檔案的內容,您可以發現如下所示: