09_database_08_jdbc-7

第八十三章 "大"对象Blob与Clob

1. 简介

除了支持基本数据类型(Primitive Types)、字符串、日期和时间以外,JDBC接口还支持"大"对象Blob和Clob。Blob表示的是二进制大对象(Binary Large OBject),例如:图片、文件等;Clob表示的是字符大对象(Character Large OBject)。

在PreparedStatement类中,setBlob()和setClob()方法用于设置大对象。setBlob()方法接收一个参数序号和读取大对象的InputStream对象;setClob()方法接收一个参数序号和读取Clob对象的Reader对象。参数序号是指出现在SQL语句中参数的序号(位置)。

当从数据库中查询大对象时,ResultSet类提供了getBlob()和getClob()方法。该方法返回一个Blob对象或者一个Clob对象。Blob类的getBinaryStream()方法返回一个InputStream对象,用于读取该Blob中的数据。Clob类的getCharacterStream()方法返回一个Reader对象,用于读取该Clob中的数据。

2. Blob与Clob的使用方法

2.1 查询Blob和Clob类型的数据

在下面的示例中,我们查询了学生Adam的个人履历信息。在student表中,列"cvInPdf"存放着学生履历的pdf版本,而列"cvInText"存放着学生履历的文本版本。它们的数据类型分别是Blob和Clob。

import java.io.InputStream;
import java.io.Reader;

...
// 查询学生履历信息
String query = "SELECT cvInPdf, cvInText FROM student where name = ? ";

try (PreparedStatement stmt = con.prepareStatement(query)) {
    // 查询学生Adam的履历信息
    stmt.setString(1, "Adam");
    ResultSet rs = stmt.executeQuery();

    Blob cvInPdf = rs.getBlob("cvInPdf");
    Clob cvInText = rs.getClob("cvInText");

    InputStream cvInPdfStream = cvInPdf.getBinaryStream();
    Reader cvInTextReader = cvInText.getCharacterStream();
}

2.2 更新Blob和Clob类型的数据

当学生Adam更新了他的个人履历信息之后,我们可以将新的履历信息写入数据库中,如下面的例子所示。

import java.io.InputStream;
import java.io.Reader;

...
// 更新学生履历信息
String update = "UPDATE student SET cvInPdf = ?, cvInText = ? where name = ? ";

try (PreparedStatement stmt = con.prepareStatement(query)) {
    // 更新学生Adam的履历信息
    InputStream cvInPdfStream = new FileInputStream("cv.pdf");
    Reader cvInTextReader = new FileReader("cv.txt");

    stmt.setBlob(1, cvInPdfStream);
    stmt.setClob(2, cvInTextReader);
    stmt.executeUpdate();
}

3. 小结

本章介绍了JDBC接口如何查询和更新大对象。Blob表示的大的二进制对象,Clob表示的是大的字符对象。开发人员可以使用Blob类型数据来存放文件内容、图片内容、或者任何二进制的数据。Clob类型数据可用于存放较长的文本内容。在PreparedStatement和ResultSet类中提供了相应的设置和获取Blob和Clob对象的接口。

上一章
下一章

注册用户登陆后可留言

Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.