JDBC 複習3 存取Oracle大資料 clob blob

來源:互聯網
上載者:User

標籤:ack   inpu   sql   param   back   cti   for   錯誤   方法   

1 目錄結構記得導包咯 mysql oracle

2 代碼,DBUtil工具類見前面的隨筆博文

package dbex.mysql;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import dbex.DBUtil;/** *  * @ClassName: OrcClob  * @Description: Oracle 字元clob大資料練習 * @author penny * @date 2017年11月29日 上午10:30:37  * */public class OrcClob {        Connection conn=null;    PreparedStatement ppst = null;    ResultSet rs= null;    /**     * @throws SQLException      * @Title: insertClob      * @Description: 插入      * @param          * @throws     */    void insertClob() throws Exception{                conn = DBUtil.getConnection();//擷取到連線物件,DBUtil 前面博文有        boolean defaultCommit = conn.getAutoCommit();        conn.setAutoCommit(false);//設定不自動認可        String path =OrcClob.class.getClassLoader().getResource("big.txt").getPath();        path =path.replace("%20", " ");//用20%替換空格                 try {            ppst = conn.prepareStatement("insert into clob values(?,empty_clob())");            ppst.setInt(1, 125);            ppst.execute();            ppst = conn.prepareStatement("select clobcol from clob where id=? for update");            ppst.setInt(1, 125);            rs=ppst.executeQuery();            if(rs.next()){                oracle.sql.CLOB clob= (oracle.sql.CLOB)rs.getClob("clobcol");                BufferedWriter bw = new BufferedWriter(clob.getCharacterOutputStream());                BufferedReader br = new BufferedReader(new FileReader(new File(path)));                int len;                while((len=br.read())!=-1){                    System.out.println("寫入中");                    bw.write(len);                }                br.close();                bw.close();            }            //真正提交            conn.commit();                    } catch (SQLException e) {            e.printStackTrace();            conn.rollback();        }finally{            conn.setAutoCommit(defaultCommit);            DBUtil.closeAll(conn, ppst, rs);        }    }    /**     * @throws Exception      *      * @Title: readClob      * @Description: 讀取大資料     * @param          * @throws     */    void readClob() throws Exception{        Connection conn = DBUtil.getConnection();        PreparedStatement ppst =null;        ResultSet rs= null;        boolean defaultCommit = conn.getAutoCommit();        try {            ppst = conn.prepareStatement("select clobcol from clob where id =?");            ppst.setInt(1, 125);            rs=ppst.executeQuery();            if(rs.next()){                oracle.sql.CLOB clob= (oracle.sql.CLOB)rs.getClob("clobcol");                BufferedReader br = new BufferedReader(clob.getCharacterStream());                BufferedWriter bw = new BufferedWriter(new FileWriter("2.txt"));                int len;                while((len=br.read())!=-1){                    System.out.println("讀取中");                    bw.write(len);                }                br.close();                bw.close();            }            conn.commit();        } catch (Exception e) {            conn.rollback();            throw(e);        }finally{            conn.setAutoCommit(defaultCommit);            DBUtil.closeAll(conn, ppst, rs);        }    }        public static void main(String[] args) throws Exception {//      new OrcClob().insertClob();        new OrcClob().readClob();    }}

3效果


4總結:
通過JDBC操縱Oracle資料庫的LOB欄位,不外乎插入、修改、替換、讀取四種方式,掌握起來並不難。觀察上述程式對LOB類型欄位的存取,我們可以看出,較之其它類型欄位,有下面幾個顯著不同的特點:

  1、必須取消自動認可。

  存取操作開始前,必須用setAutoCommit(false)取消自動認可。其它類型欄位則無此特殊要求。這是因為存取LOB類型欄位時,通常要進行多次操作可以完成。不這樣的話,Oracle將拋出“讀取違反順序”的錯誤。

  2、插入方式不同。

  LOB資料不能象其它類型資料一樣直接插入(INSERT)。插入前必須先插入一個空的LOB對象,CLOB類型 的Null 物件為EMPTY_CLOB(),BLOB類型的Null 物件為EMPTY_BLOB()。之後通過SELECT命令查詢得到先前插入的記錄並鎖定,繼而將 Null 物件修改為所要插入的LOB對象。

  3、修改方式不同。

  其它類型的欄位修改時,用UPDATE … SET…命令即可。而LOB類型欄位,則只能用SELECT … FOR UPDATE命令將記錄查詢出來並鎖定,然後才能修改。且修改也有兩種改法:一是在原資料基礎上的修改(即覆蓋式修改),執行SELECT … FOR UPDATE後再改資料;二是替換(先將原資料清掉,再修改),先執行UPDATE命令將LOB欄位之值設為空白的LOB對象,然後進行第一種改法。建議使 用替換的方法,以實現與其它欄位UPDATE操作後一樣的效果。

  4、存取時應使用由資料庫JDBC驅動程式提供的LOB操作類。

  對於Oracle資料庫,應使用oracle.sql.CLOB和oracle.sql.BLOB。不使用由資料庫JDBC驅動程式提供的LOB類時,程式運行時易於出現“抽象方法調用”的錯誤,這是因為JDBC所定義的java.sql.Clob與 java.sql.Blob介面,其中的一些方法並未在資料庫廠家提供的驅動程式中真正實現。

  5、存取手段與檔案操作相仿。

  對於BLOB類型,應用InputStream/OutputStream類,此類不進行編碼轉換,逐個位元組存取。oracle.sql.BLOB類相應提供了getBinaryStream()和getBinaryOutputStream()兩個方法,前一個 方法用於讀取Oracle的BLOB欄位,後一個方法用於將資料寫入Oracle的BLOB欄位。

  對於CLOB類型,應用Reader/Writer類,此類進行編碼轉換。oracle.sql.CLOB類相應 提供了getCharacterStream()和getCharacterOutputStream()兩個方法,前一個方法用於讀取Oracle的 CLOB欄位,後一個方法用於將資料寫入Oracle的CLOB欄位。

  需要說明的是,為了大幅提高程式執行效率,對BLOB/CLOB欄位的讀寫操作,應該使用緩衝操作類(帶 Buffered首碼),即:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。 常式中全部使用了緩衝操作類。

JDBC 複習3 存取Oracle大資料 clob blob

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.