2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 使用JDBC操作基于Oracle的CLOB BLOB字段类型

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

时间:2019-04-06 13:22:58

相关推荐

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

转载至程式先锋技术维客[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]

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。