版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://qq772708707.blog.51cto.com/259758/79253
|
先来看看两种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字段类型,如果需要本文中的全部源代码请发送邮件到 info@javabiz.cn 如需转载请注明本文来自程式先锋网站 [url]http://www.javabiz.cn[/url] 本文出自 “程式先锋” 博客,请务必保留此出处http://qq772708707.blog.51cto.com/259758/79253 本文出自 51CTO.COM技术博客 |
使用JDBC操作基于Oracle的CLOB,BLOB字段类型
最新推荐文章于 2021-12-14 22:01:59 发布