使用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]
相關文章
相關標籤/搜索