如何使用 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
如果验证指定路径下文件的內容,您可以发现如下所示:


数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP