除了支持基本数据类型(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中的数据。
在下面的示例中,我们查询了学生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();
}
当学生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();
}
本章介绍了JDBC接口如何查询和更新大对象。Blob表示的大的二进制对象,Clob表示的是大的字符对象。开发人员可以使用Blob类型数据来存放文件内容、图片内容、或者任何二进制的数据。Clob类型数据可用于存放较长的文本内容。在PreparedStatement和ResultSet类中提供了相应的设置和获取Blob和Clob对象的接口。
注册用户登陆后可留言