如何使用 JDBC 从表中读取 BLOB 和 CLOB 类型列的数据?
Clob 数据类型
CLOB 代表字符大对象 (Character Large Object)。通常,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 个字符。
BLOB 用于存储大量二进制数据,例如图像或其他类型的文件。MySQL 支持 BLOB 数据类型,包括 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
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");
让我们在 MySQL 中使用 CREATE 语句创建一个名为 articles_data 的表,如下所示 −
CREATE TABLE articles_data ( Name VARCHAR(255), Article LONGTEXT, Logo Blob);
以下 JDBC 程序将记录插入 articles_data 表,然后将其检索回来,并将列的内容分别存储为文件和图像,并指定路径。
示例
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 { //注册驱动程序 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //获取连接 String mysqlUrl = "jdbc:mysql://localhost/sampledatabase"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("连接已建立......"); //插入值 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......"); //检索结果 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: "); //将 clob 存储到文件中 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
如果您验证指定路径下文件的内容,您会发现如下所示的 −