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

                                       转载至程式先锋技术维客[url]www.javabiz.cn[/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();         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字段类型,若是须要本文中的所有源代码请发送邮件到[email]info@javabiz.cn[/email]
相关文章
相关标签/搜索