转载至程式先锋技术维客[url][/url]
先来看看两种LOB类型的主要区别:
CLOB 表示Character LOB (字符LOB) 它可以存储大量的字符数据。
BLOB表示 Binary LOB(二进制LOB)。此数据类型的列可以存储大型二进制对象,如图形、视频剪辑和声音文件等。
基本上我们可以得出这样的结论: 文本文件我们既可以使用BLOB也可以使用CLOB,二进制文件的存储我们只能使用BLOB类型.
好,下面通过代码示例描述如何读取和写入LOB类型的字段:
1. 先建一张表,具有三个字段:
CREATE TABLE "ATTACHMENT" (
"ID" VARCHAR2(10) NOT NULL,
"MYCLOB" CLOB,
"MYBLOB" BLOB,
PRIMARY KEY("ID"));
2. 准备两个文件用来存入数据库:
c:/Test.java 用来代表文本文件
C:/xx.jar 用来代表二进制数据
3. 存储文本信息到CLOB字段中
Connection conn = DBUtil.getConnection();
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
//先初始化CLOB字段,此处为必须的操作,否则后面会产生空指针异常
String initSql = "UPDATE ATTACHMENT SET MYCLOB=EMPTY_CLOB() WHERE ID=1";
//读取CLOB字段
String updateSql = "SELECT MYCLOB FROM ATTACHMENT WHERE ID=1";
stmt.executeUpdate(initSql);
ResultSet rs = stmt.executeQuery(updateSql);
if (rs.next()) {
CLOB clob = (CLOB) rs.getClob(1); //获取CLOB字段内容并转换为 oracle.sql.CLOB类型
//获取CLOB的输出流
Writer os = clob.getCharacterOutputStream();
//读取文本文件
BufferedReader br = new BufferedReader(new FileReader(new File(
"c:/Test.java")));
String line = br.readLine();
StringBuffer buffer = new StringBuffer();
while (line != null) {
buffer.append(line);
line = br.readLine();
}
os.write(buffer.toString());
os.flush();
br.close();
os.close();
mit();
conn.close();
}
System.out.println("Saved");
在SQLPlus中测试一下文件有没有存入到数据库中,
SQL>
SQL> SELECT DBMS_LOB.GETLENGTH(MYCLOB) FROM ATTACHMENT;
显示结果如下:
DBMS_LOB.GETLENGTH(MYCLOB)
--------------------------
177
这表明文件已经写入到这个MYCLOB字段中,如果没有存入的话,SQLPlus中不会显示任何数字(包括零也不会被显示), 现在可以进行下一步操作了
4. 读取CLOB字段中的文本信息
Connection conn = DBUtil.getConnection();
Statement st = conn.createStatement();
PreparedStatement preparedStatement = conn.prepareStatement("SELECT MYCLOB FROM ATTACHMENT WHERE ID=1");
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
//获取CLOB字段信息
CLOB clob = (CLOB)rs.getClob("MYCLOB");
BufferedReader br = new BufferedReader(clob.getCharacterStream());
//创建输出流
BufferedWriter out = new BufferedWriter(new FileWriter("C:/tttt.txt"));
String line = br.readLine();
while (line != null) {
out.write(line);
System.out.println(line);
line = br.readLine();
out.flush();
}
out.close();
br.close();
}
rs.close();
st.close();
conn.close();
5. 写入二进制信息到BLOB字段
conn = DBUtil.getConnection();
// 设置不自动提交
conn.setAutoCommit(false);
// 创建数据库操作语句
statement = conn.createStatement();
// 定义SQL语句
statement.executeUpdate("UPDATE ATTACHMENT SET MYBLOB = EMPTY_BLOB() WHERE ID=1");
String strSQL = "SELECT MYBLOB FROM ATTACHMENT WHERE ROWNUM = 1 FOR UPDATE";
resultset = statement.executeQuery(strSQL);
BLOB contents = null;
while (resultset.next()) {
// 取出BLOB对象
contents = (oracle.sql.BLOB) resultset.getBlob(1);
}
OutputStream out = contents.getBinaryOutputStream();
FileInputStream in = new FileInputStream(new File("c:/XX.jar"));
//将输出流和输入流对转
FileUtil.copy(in, out);
out.close();
in.close();
// 数据库提交
mit();
conn.close();
同样,这里我们也在SQLPlus中测试一下BLOB字段中是否已经含有数据:
SQL>
SQL> SELECT DBMS_LOB.GETLENGTH(MYBLOB) FROM ATTACHMENT;
显示结果如下:
DBMS_LOB.GETLENGTH(MYBLOB)
--------------------------
211
表明已经存入数据,数据的大小是21.1k, 现在可以进行读取操作了
6. 读取BLOB字段中内容并存储到一个文件中
Connection conn = DBUtil.getConnection();
conn.setAutoCommit(false);
PreparedStatement preparedStatement = conn
.prepareStatement("SELECT DATA FROM ATTACH WHERE ROWNUM=1");
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob(1);
if (blob != null) {
InputStream is = ((BLOB) blob).getBinaryStream();
// ((CLOB) clob).getCharaterStream();
FileOutputStream fos = new FileOutputStream(new File(
"c:/abc.jar"));
FileUtil.copy(is, fos);
fos.close();
is.close();
}
}
rs.close();
preparedStatement.close();
conn.close();
输出: c盘的根目录下应该出现了一个abc.jar 的文件, 你可以根据字节数和xx.jar比较一下,应该完全相同.
上述步骤是使用了示例代码展示了如何操作Oracle中LOB字段类型,如果需要本文中的全部源代码请发送邮件到[email]info@[/email]