搜索
您的当前位置:首页正文

使用JDBC操作基于Oracle的CLOB,BLOB字段类型

来源:独旅网


使用JDBC操作基于Oracle的CLOB,BLOB字段类型

先来看看两种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(); conn.commit(); 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();

// 数据库提交 conn.commit(); 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字段类型

JAVA通过JDBC对Oracle中BLOB类型字段的操作

2009-09-17 13:56

网络上很多关于JAVA对Oracle中BLOB、CLOB类型字段的操作说明,有的不够全面,有的不够准确,甚至有的简直就是胡说八道。最近

的项目正巧用到了这方面的知识,在这里做个总结。

环境:

Database: Oracle 10g

App Server: BEA Weblogic 8.14

表结构:

CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20),

BLOBATTR Blob)

1、存入

//通过JDBC获得数据库连接

Class.forName(\"oracle.jdbc.driver.OracleDriver\");

Connection con =

DriverManager.getConnection(\"jdbc:oracle:thin:@localhost:1521:test

db\con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_blob()

st.executeUpdate(\"insert into TESTBLOB (ID, NAME, BLOBATTR)

values (1, \"thename\

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery(\"select BLOBATTR from TESTBLOB

where ID=1 for update\");

if (rs.next())

{

//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(\"BLOBATTR\");

OutputStream outStream = blob.getBinaryOutputStream();

//data是传入的byte数组,定义:byte[] data

outStream.write(data, 0, data.length);

}

outStream.flush(); outStream.close(); con.commit(); con.close();

2、读取 //获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//不需要“for update”

ResultSet rs = st.executeQuery(\"select BLOBATTR from TESTBLOB

where ID=1\"); if (rs.next())

{

java.sql.Blob blob = rs.getBlob(\"BLOBATTR\");

InputStreamReader read = new

InputStreamReader(blob.getBinaryStream()) ;

StringBuffer sb = new StringBuffer(); char[] charbuf = new char[4096];

for (int i = read.read(charbuf); i > 0; i = read.read(charbuf)) {

sb.append(charbuf, 0, i);

}

read.close();

out.println(sb.toString()) ;

}

con.commit(); con.close();

因篇幅问题不能全部显示,请点此查看更多更全内容

Top