使用JDBC操作基于Oracle的CLOB,BLOB字段类型
生活随笔
收集整理的這篇文章主要介紹了
使用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]
先來看看兩種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]
轉載于:https://blog.51cto.com/gongqikui/82299
總結
以上是生活随笔為你收集整理的使用JDBC操作基于Oracle的CLOB,BLOB字段类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 购买工业五金零部件时应当注意什么?
- 下一篇: 车出现了质量问题哪里投诉管用?