当前位置:首页 > 数据库 > Oracle

JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

一、Oracle中大数据处理

  在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据 量非常大的业务领域(如图象、档案等)。

  LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。

二、搭建测试环境

2.1、建立两个测试用的数据库表

  建表SQL语句为:

            1
            CREATE
            TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
23CREATETABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)

2.2、搭建测试项目架构

bubuko.com,布布扣

2.3、编写db.properties配置文件

            1 oracleDb_Driver=oracle.jdbc.driver.OracleDriver
2 oracleDb_Url=jdbc:oracle:thin:@localhost:1521:GACL
3 oracleDb_UserName=GACL_XDP
4 oracleDb_Password=P

2.4、编写JdbcUtils工具类

             1
            package
             me.gacl.utils;

             2
             3
            import
             java.io.InputStream;

             4
            import
             java.sql.Connection;

             5
            import
             java.sql.DriverManager;

             6
            import
             java.sql.ResultSet;

             7
            import
             java.sql.SQLException;

             8
            import
             java.sql.Statement;

             9
            import
             java.util.Properties;

            10
            11
            public
            class
             JdbcUtils {

            12
            13
            private
            static String oracleDb_Driver = null;
14privatestatic String oracleDb_Url = null;
15privatestatic String oracleDb_UserName = null;
16privatestatic String oracleDb_Password = null;
1718static{
19try{
20//读取db.properties文件中的数据库连接信息21             InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
22             Properties prop = new Properties();
23            prop.load(in);
2425//获取数据库连接驱动26             oracleDb_Driver = prop.getProperty("oracleDb_Driver");
27//获取数据库连接URL地址28             oracleDb_Url = prop.getProperty("oracleDb_Url");
29//获取数据库连接用户名30             oracleDb_UserName = prop.getProperty("oracleDb_UserName");
31//获取数据库连接密码32             oracleDb_Password = prop.getProperty("oracleDb_Password");
3334//加载数据库驱动35            Class.forName(oracleDb_Driver);
3637         }catch (Exception e) {
38thrownew ExceptionInInitializerError(e);
39        }
40    }
4142/**43    * @Method: getOracleConnection
44    * @Description: 获取Oracle数据库连接对象
45    * @Anthor:孤傲苍狼
46    *
47    * @return Connection数据库连接对象
48    * @throws SQLException
49*/50publicstatic Connection getOracleConnection() throws SQLException{
51return DriverManager.getConnection(oracleDb_Url, oracleDb_UserName,oracleDb_Password);
52    }
5354/**55    * @Method: release
56    * @Description: 释放资源,
57    *     要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
58    * @Anthor:孤傲苍狼
59    *
60    * @param conn
61    * @param st
62    * @param rs
63*/64publicstaticvoid release(Connection conn,Statement st,ResultSet rs){
65if(rs!=null){
66try{
67//关闭存储查询结果的ResultSet对象68                rs.close();
69             }catch (Exception e) {
70                e.printStackTrace();
71            }
72             rs = null;
73        }
74if(st!=null){
75try{
76//关闭负责执行SQL命令的Statement对象77                st.close();
78             }catch (Exception e) {
79                e.printStackTrace();
80            }
81        }
8283if(conn!=null){
84try{
85//关闭Connection数据库连接对象86                conn.close();
87             }catch (Exception e) {
88                e.printStackTrace();
89            }
90        }
91    }
92 }

三、JDBC处理Oracle大数据

3.1、JDBC处理CLOB数据

              1
            package
             me.gacl.demo;

              2
              3
            import
             java.io.BufferedReader;

              4
            import
             java.io.BufferedWriter;

              5
            import
             java.io.FileReader;

              6
            import
             java.io.FileWriter;

              7
            import
             java.sql.Connection;

              8
            import
             java.sql.PreparedStatement;

              9
            import
             java.sql.ResultSet;

             10
            import
             org.junit.Test;

             11
            import
             me.gacl.utils.JdbcUtils;

             12
             13
            /**
             14
            * @ClassName: JdbcOperaOracleClob

             15
            * @Description:Oracle中字符型大型对象(Character Large Object)数据处理

             16
            * 
            @author
            : 孤傲苍狼

             17
            * @date: 2014-10-7 下午3:53:19

             18
            *

             19
            */
             20
            public
            class
             JdbcOperaOracleClob {

             21
             22
            /**
             23
                CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)

             24
            */
             25
            /**
             26
                * @Method: clobInsert

             27
                * @Description:往数据库中插入一个新的CLOB对象

             28
                * @Anthor:孤傲苍狼

             29
                *

             30
                * 
            @throws
             Exception

             31
            */
             32
                @Test

             33
            public
            void clobInsert() throws Exception {
 34         Connection conn = null;
 35         PreparedStatement stmt = null;
 36         ResultSet rs = null;
 37         conn = JdbcUtils.getOracleConnection();
 38boolean defaultCommit = conn.getAutoCommit();
 39/*开启事务,设定不自动提交 */ 40         conn.setAutoCommit(false);
 41try {
 42/* 插入一个空的CLOB对象 */ 43             String sql = "INSERT INTO TEST_CLOB VALUES (?, EMPTY_CLOB())";
 44             stmt = conn.prepareStatement(sql);
 45             stmt.setInt(1, 1);
 46            stmt.executeUpdate();
 47/* 查询此CLOB对象并锁定 */ 48             sql = "SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE";
 49             stmt = conn.prepareStatement(sql);
 50             stmt.setInt(1, 1);
 51             rs = stmt.executeQuery();
 52if (rs.next()) {
 53/* 取出此CLOB对象 */ 54                 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");
 55/* 向CLOB对象中写入数据 */ 56                 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
 57//这种方式获取的路径,其中的空格会被使用“%20”代替 58                 String path = JdbcOperaClob.class.getClassLoader().getResource("data.txt").getPath();
 59//将“%20”替换回空格 60                 path = path.replaceAll("%20", " ");
 61                 BufferedReader in = new BufferedReader(new FileReader(path));
 62int c;
 63while ((c = in.read()) != -1) {
 64                    out.write(c);
 65                }
 66                in.close();
 67                out.close();
 68            }
 69/* 正式提交 */ 70            conn.commit();
 71             System.out.println("插入成功");
 72         } catch (Exception ex) {
 73/* 出错回滚 */ 74            conn.rollback();
 75throw ex;
 76         }finally{
 77/* 恢复原提交状态 */ 78            conn.setAutoCommit(defaultCommit);
 79            JdbcUtils.release(conn,stmt,rs);
 80        }
 81 82    }
 83 84/** 85    * @Method: clobRead
 86    * @Description: CLOB对象读取
 87    * @Anthor:孤傲苍狼
 88    *
 89    * @throws Exception
 90*/ 91    @Test
 92publicvoid clobRead() throws Exception {
 93         Connection conn = null;
 94         PreparedStatement stmt = null;
 95         ResultSet rs = null;
 96         conn = JdbcUtils.getOracleConnection();
 97boolean defaultCommit = conn.getAutoCommit();
 98         conn.setAutoCommit(false);
 99try {
100/* 查询CLOB对象 */101             String sql = "SELECT * FROM TEST_CLOB WHERE ID=?";
102             stmt = conn.prepareStatement(sql);
103             stmt.setInt(1, 1);
104             rs = stmt.executeQuery();
105if (rs.next()) {
106/* 获取CLOB对象 */107                 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");
108/* 以字符形式输出 */109                 BufferedReader in = new BufferedReader(clob.getCharacterStream());
110                 BufferedWriter out = new BufferedWriter(new FileWriter("D:\2.txt"));
111int c;
112while ((c = in.read()) != -1) {
113                    out.write(c);
114                }
115                out.close();
116                in.close();
117            }
118         } catch (Exception ex) {
119            conn.rollback();
120throw ex;
121         }finally{
122/* 恢复原提交状态 */123            conn.setAutoCommit(defaultCommit);
124            JdbcUtils.release(conn,stmt,rs);
125        }
126    }
127128/**129    * @Method: clobModify
130    * @Description:修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)
131    * @Anthor:孤傲苍狼
132    *
133    * @throws Exception
134*/135    @Test
136publicvoid clobModify() throws Exception {
137         Connection conn = null;
138         PreparedStatement stmt = null;
139         ResultSet rs = null;
140         conn = JdbcUtils.getOracleConnection();
141boolean defaultCommit = conn.getAutoCommit();
142// 开启事务143         conn.setAutoCommit(false);
144try {
145/* 查询CLOB对象并锁定 */146             String sql = "SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE";
147             stmt = conn.prepareStatement(sql);
148             stmt.setInt(1, 1);
149             rs = stmt.executeQuery();
150if (rs.next()) {
151/* 获取此CLOB对象 */152                 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");
153/* 进行覆盖式修改 */154                 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
155// 这种方式获取的路径,其中的空格会被使用“%20”代替156                 String path = JdbcOperaClob.class.getClassLoader().getResource("data2.txt").getPath();
157// 将“%20”替换回空格158                 path = path.replaceAll("%20", " ");
159                 BufferedReader in = new BufferedReader(new FileReader(path));
160int c;
161while ((c = in.read()) != -1) {
162                    out.write(c);
163                }
164                in.close();
165                out.close();
166            }
167/*提交事务 */168            conn.commit();
169         } catch (Exception ex) {
170/*出错回滚事务 */171            conn.rollback();
172throw ex;
173         }finally{
174/*恢复原提交状态 */175            conn.setAutoCommit(defaultCommit);
176            JdbcUtils.release(conn,stmt,rs);
177        }
178    }
179180/**181    * @Method: clobReplace
182    * @Description:替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)
183    * @Anthor:孤傲苍狼
184    *
185    * @throws Exception
186*/187    @Test
188publicvoid clobReplace() throws Exception {
189         Connection conn = null;
190         PreparedStatement stmt = null;
191         ResultSet rs = null;
192         conn = JdbcUtils.getOracleConnection();
193boolean defaultCommit = conn.getAutoCommit();
194// 开启事务195         conn.setAutoCommit(false);
196try {
197/* 清空原CLOB对象 */198             String sql = "UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID=?";
199             stmt = conn.prepareStatement(sql);
200             stmt.setInt(1, 1);
201            stmt.executeUpdate();
202203/* 查询CLOB对象并锁定 */204             sql = "SELECT CLOBCOL FROM TEST_CLOB WHERE ID=? FOR UPDATE";
205             stmt = conn.prepareStatement(sql);
206             stmt.setInt(1, 1);
207             rs = stmt.executeQuery();
208if (rs.next()) {
209/* 获取此CLOB对象 */210                 oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBCOL");
211/* 更新数据 */212                 BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
213// 这种方式获取的路径,其中的空格会被使用“%20”代替214                 String path = JdbcOperaClob.class.getClassLoader().getResource("db.properties").getPath();
215// 将“%20”替换回空格216                 path = path.replaceAll("%20", " ");
217                 BufferedReader in = new BufferedReader(new FileReader(path));
218int c;
219while ((c = in.read()) != -1) {
220                    out.write(c);
221                }
222                in.close();
223                out.close();
224            }
225/* 正式提交 */226            conn.commit();
227         } catch (Exception ex) {
228/* 出错回滚 */229            conn.rollback();
230throw ex;
231         } finally {
232/* 恢复原提交状态 */233            conn.setAutoCommit(defaultCommit);
234            JdbcUtils.release(conn, stmt, rs);
235        }
236    }
237 }

3.2、JDBC处理BLOB数据

  Oracle定义了一个BLOB字段用于保存二进制数据,但这个字段并不能存放真正的二进制数据,只能向这个字段存一个指针,然后把数据放到指针所指向的Oracle的LOB段中, LOB段是在数据库内部表的一部分。因而在操作Oracle的Blob之前,必须获得指针(定位器)才能进行Blob数据的读取和写入。
  如何获得表中的Blob指针呢? 可以先使用insert语句向表中插入一个空的blob(调用oracle的函数empty_blob()),这将创建一个blob的指针,然后再把这个empty的blob的指针查询出来,这样就可得到BLOB对象,从而读写blob数据了。

  1、插入空blob:insert into testblob(id,image) values(?,empty_blob())
  2、获得blob的cursor:

    select image from testblob where id=? for update 注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突。

    Blob b = rs.getBlob("image");

  3、利用 io和获取到的cursor往数据库读写数据
  注意:以上操作需开启事务。

  BLOB对象的存取范例

              1
            package
             me.gacl.demo;

              2
              3
            import
             java.io.BufferedInputStream;

              4
            import
             java.io.BufferedOutputStream;

              5
            import
             java.io.FileOutputStream;

              6
            import
             java.sql.Connection;

              7
            import
             java.sql.PreparedStatement;

              8
            import
             java.sql.ResultSet;

              9
            import
             org.junit.Test;

             10
            import
             me.gacl.utils.JdbcUtils;

             11
             12
            /**
             13
            * @ClassName: JdbcOperaOracleBlob

             14
            * @Description:Oracle中大数据处理

             15
            * 
            @author
            : 孤傲苍狼

             16
            * @date: 2014-10-7 下午3:53:19

             17
            *

             18
            */
             19
            public
            class
             JdbcOperaOracleBlob {

             20
             21
            /**
             22
                 * @Method: blobInsert

             23
                 * @Description: 向数据库中插入一个新的BLOB对象

             24
                 * @Anthor:孤傲苍狼

             25
                 * 

             26
                 * 
            @throws
             Exception

             27
            */
             28
                @Test

             29
            public
            void blobInsert() throws Exception {
 30         Connection conn = null;
 31         PreparedStatement stmt = null;
 32         ResultSet rs = null;
 33boolean defaultCommit = true;
 34try {
 35             conn = JdbcUtils.getOracleConnection();
 36//得到数据库事务处理的默认提交方式 37             defaultCommit = conn.getAutoCommit();
 38//1、开启事务 39             conn.setAutoCommit(false);
 40//2、插入一个空的BLOB对象 41             String sql = "INSERT INTO TEST_BLOB VALUES (?, EMPTY_BLOB())";
 42             stmt = conn.prepareStatement(sql);
 43             stmt.setInt(1, 1);
 44            stmt.executeUpdate();
 45//3、查询此BLOB对象并锁定。注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突 46             sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=? FOR UPDATE";
 47             stmt = conn.prepareStatement(sql);
 48             stmt.setInt(1, 1);
 49             rs = stmt.executeQuery();
 50if (rs.next()) {
 51//4、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象 52                 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL");
 53//5、使用IO向BLOB对象中写入数据 54                 BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
 55                 BufferedInputStream in = new BufferedInputStream(JdbcOperaOracleBlob.class.getClassLoader().getResourceAsStream("01.jpg"));
 56int c;
 57while ((c = in.read()) != -1) {
 58                    out.write(c);
 59                }
 60                in.close();
 61                out.close();
 62            }
 63//6、提交事务 64            conn.commit();
 65         } catch (Exception ex) {
 66//7、出错回滚事务 67            conn.rollback();
 68throw ex;
 69         } finally {
 70//8、恢复数据库事务处理的默认提交方式 71            conn.setAutoCommit(defaultCommit);
 72//释放资源 73            JdbcUtils.release(conn, stmt, rs);
 74        }
 75 76    }
 77 78/** 79     * @Method: blobModify
 80     * @Description:修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改)
 81     * @Anthor:孤傲苍狼
 82     * 
 83     * @throws Exception
 84*/ 85    @Test
 86publicvoid blobModify() throws Exception {
 87         Connection conn = null;
 88         PreparedStatement stmt = null;
 89         ResultSet rs = null;
 90boolean defaultCommit = true;
 91try {
 92             conn = JdbcUtils.getOracleConnection();
 93//得到数据库事务处理的默认提交方式 94             defaultCommit = conn.getAutoCommit();
 95//1、开启事务 96             conn.setAutoCommit(false);
 97//2、查询此BLOB对象并锁定。注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突 98             String sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=? FOR UPDATE";
 99             stmt = conn.prepareStatement(sql);
100             stmt.setInt(1, 1);
101             rs = stmt.executeQuery();
102if (rs.next()) {
103//3、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象104                 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL");
105//4、使用IO向BLOB对象中写入数据106                 BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
107                 BufferedInputStream in = new BufferedInputStream(JdbcOperaOracleBlob.class.getClassLoader().getResourceAsStream("02.jpg"));
108int c;
109while ((c = in.read()) != -1) {
110                    out.write(c);
111                }
112                in.close();
113                out.close();
114            }
115//5、提交事务116            conn.commit();
117         } catch (Exception ex) {
118//6、出错回滚事务119            conn.rollback();
120throw ex;
121         } finally {
122//8、恢复数据库事务处理的默认提交方式123            conn.setAutoCommit(defaultCommit);
124//释放资源125            JdbcUtils.release(conn, stmt, rs);
126        }
127    }
128129/**130     * @Method: blobReplace
131     * @Description:替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象)
132     * @Anthor:孤傲苍狼
133     * 
134     * @throws Exception
135*/136    @Test
137publicvoid blobReplace() throws Exception {
138         Connection conn = null;
139         PreparedStatement stmt = null;
140         ResultSet rs = null;
141boolean defaultCommit = true;
142try {
143             conn = JdbcUtils.getOracleConnection();
144//得到数据库事务处理的默认提交方式145             defaultCommit = conn.getAutoCommit();
146//1、开启事务147             conn.setAutoCommit(false);
148//2、清空原BLOB对象149             String sql = "UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID=?";
150             stmt = conn.prepareStatement(sql);
151             stmt.setInt(1, 1);
152            stmt.executeUpdate();
153//3、查询此BLOB对象并锁定。注意: 必 须加for update锁定该行,直至该行被修改完毕,保证不产生并发冲突154             sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=? FOR UPDATE";
155             stmt = conn.prepareStatement(sql);
156             stmt.setInt(1, 1);
157             rs = stmt.executeQuery();
158if (rs.next()) {
159//4、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象160                 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL");
161//5、使用IO向BLOB对象中写入数据162                 BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
163                 BufferedInputStream in = new BufferedInputStream(JdbcOperaOracleBlob.class.getClassLoader().getResourceAsStream("01.jpg"));
164int c;
165while ((c = in.read()) != -1) {
166                    out.write(c);
167                }
168                in.close();
169                out.close();
170            }
171//6、提交事务172            conn.commit();
173         } catch (Exception ex) {
174//7、出错回滚事务175            conn.rollback();
176throw ex;
177         } finally {
178//8、恢复数据库事务处理的默认提交方式179            conn.setAutoCommit(defaultCommit);
180//释放资源181            JdbcUtils.release(conn, stmt, rs);
182        }
183    }
184185/**186     * @Method: blobRead
187     * @Description:BLOB对象读取
188     * @Anthor:孤傲苍狼
189     * 
190     * @throws Exception
191*/192    @Test
193publicvoid blobRead() throws Exception {
194         Connection conn = null;
195         PreparedStatement stmt = null;
196         ResultSet rs = null;
197boolean defaultCommit = true;
198try {
199             conn = JdbcUtils.getOracleConnection();
200//得到数据库事务处理的默认提交方式201             defaultCommit = conn.getAutoCommit();
202//1、开启事务203             conn.setAutoCommit(false);
204//2、查询BLOB对象205             String sql = "SELECT BLOBCOL FROM TEST_BLOB WHERE ID=?";
206             stmt = conn.prepareStatement(sql);
207             stmt.setInt(1, 1);
208             rs = stmt.executeQuery();
209if (rs.next()) {
210//3、取出此BLOB对象 ,并强制转换成Oracle的BLOB对象211                 oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBCOL");
212//4、以二进制流的形式输出213                 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("D:/1.jpg"));
214                 BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
215int c;
216while ((c = in.read()) != -1) {
217                    out.write(c);
218                }
219                in.close();
220                out.close();
221            }
222//5、提交事务223            conn.commit();
224         } catch (Exception ex) {
225//6、出错回滚事务226            conn.rollback();
227throw ex;
228         } finally {
229//8、恢复数据库事务处理的默认提交方式230            conn.setAutoCommit(defaultCommit);
231//释放资源232            JdbcUtils.release(conn, stmt, rs);
233        }
234235    }
236 }

四、使用JDBC处理Oracle大数据总结

  通过JDBC操纵Oracle数据库的LOB字段,不外乎插入、修改、替换、读取四种方式,掌握起来并不难。观察上述程序对LOB类型字段的存取,我们可以看出,较之其它类型字段,有下面几个显著不同的特点

1、必须取消自动提交

  存取操作开始前,必须用setAutoCommit(false)取消自动提交。其它类型字段则无此特殊要求。这是因为存取LOB类型字段时,通常要进行多次操作可以完成。不这样的话,Oracle将抛出“读取违反顺序”的错误。

2、插入方式不同

  LOB数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的LOB对象,CLOB类型 的空对象为EMPTY_CLOB(),BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定,继而将 空对象修改为所要插入的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。 例程中全部使用了缓冲操作类。

原文:http://www.cnblogs.com/xdp-gacl/p/4009399.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐