用JDBC操縱BLOB和CLOB資料
在訪問Oracle 資料庫,對Oracle 的BLOB 和CLOB 進行操作的時候,當通過Oracle JDBC Driver 來呼叫的時,如下所例:
Driver myDriver = (Driver)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
conn = myDriver.connect("jdbc:oracle:thin:" , props);
Statement stmt = conn.createStatement();
stmt.execute("select blob_content from lobtest where id=1");
ResultSet rs = stmt.getResultSet();
System.out.println("ResultSet result:"+rs);
while ( rs.next() ) ...{
System.out.println("BLOB:"+rs.getBlob("blob_content"));
myBlob = (oracle.sql.BLOB)rs.getBlob("blob_content");
}
返回的資料物件正確,是oracle.sql.BLOB 物件,然後可以使用該物件進行方法訪問。
但當使用Oracle JDBC Driver 配置連線池後,使用DataSource 取得資料庫連線之後,查詢CLOB 資料,賦值給oracle.sql.CLOB 的物件,這是就會報型別轉換錯誤。
在網路上有相應的解決方案,但都是依賴於某一種應用伺服器所提供的oracle連線環境。
下面是一個比較好的解決方案:
1。必須有支援jdbc3.0以上規範的oracle驅動。
2。更新blob欄位資料
public void updateBlob(String tableName, String blobFeild, String pryKey, String pryKeyValue, byte[] blob)
throws IOException, SQLException ...{
Statement stmt = null;
ResultSet rs = null;
try ...{
stmt = conn.createStatement();
String sql = "UPDATE " + tableName + " SET " + blobFeild + "=EMPTY_BLOB() WHERE " + pryKey + "='"
+ pryKeyValue + "'";
// 如果引數blob為null,清空blob值;否則先清空blob值,然後插入新的blob值。
if (blob == null) ...{
stmt.executeUpdate(sql);
} else ...{
stmt.executeUpdate(sql);
sql = "SELECT " + blobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue
+ "' FOR UPDATE";
rs = stmt.executeQuery(sql);
if (rs.next()) ...{
Blob inBlob = rs.getBlob(blobFeild);
int len = inBlob.setBytes(1, blob);
log.debug("已成功儲存BLOB大物件:" + len / 1024 + "KB");
}
}
} finally ...{
DbUtils.close(rs);
DbUtils.close(stmt);
}
}
3。獲取blob欄位資料
public byte[] findBlob(String tableName, String blobFeild, String pryKey, String pryKeyValue) throws SQLException ...{
byte[] blob = null;
Statement stmt = null;
String sql = "SELECT " + blobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue + "'";
ResultSet rs = null;
try ...{
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) ...{
Blob outBlob = rs.getBlob(blobFeild);
if (outBlob != null && outBlob.length() > 0) ...{
blob = outBlob.getBytes(1, (int) outBlob.length());
}
}
} finally ...{
DbUtils.close(rs);
DbUtils.close(stmt);
}
return blob;
}
4。更新clob欄位資料
public void updateClob(String tableName, String clobFeild, String pryKey, String pryKeyValue, String clob)
throws IOException, SQLException ...{
Statement stmt = null;
ResultSet rs = null;
try ...{
stmt = conn.createStatement();
String sql = "UPDATE " + tableName + " SET " + clobFeild + "=EMPTY_CLOB() WHERE " + pryKey + "='"
+ pryKeyValue + "'";
// 如果引數clob為null,清空clob值;否則先清空clob值,然後插入新的clob值。
if (clob == null) ...{
stmt.executeUpdate(sql);
} else ...{
stmt.executeUpdate(sql);
sql = "SELECT " + clobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue
+ "' FOR UPDATE";
rs = stmt.executeQuery(sql);
if (rs.next()) ...{
Clob inClob = rs.getClob(clobFeild);
int len = inClob.setString(1, clob);
log.debug("已成功儲存CLOB大物件:" + len / 1024 + "KB");
}
}
} finally ...{
DbUtils.close(rs);
DbUtils.close(stmt);
}
}
5。獲取clob欄位資料
public String findClob(String tableName, String clobFeild, String pryKey, String pryKeyValue) throws SQLException ...{
String clob = "";
Statement stmt = null;
String sql = "SELECT " + clobFeild + " FROM " + tableName + " WHERE " + pryKey + "='" + pryKeyValue + "'";
ResultSet rs = null;
try ...{
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) ...{
Clob outClob = rs.getClob(clobFeild);
if (outClob != null && outClob.length() > 0) ...{
clob = outClob.getSubString(1, pryKeyValue.length());
}
}
} finally ...{
DbUtils.close(rs);
DbUtils.close(stmt);
}
return clob;
}
採用以上這種方式可以避免對連線池提供方的依賴。
相關文章
- JDBC 處理CLob和Blob型別資料JDBC型別
- JDBC:java提供的專門操縱資料庫的APIJDBCJava資料庫API
- 關於Oracle的BLOB和CLOBOracle
- 建立和操縱表
- 如何檢視ORACLE的LOB(BLOB和CLOB)物件佔用的大小Oracle物件
- 通過配置hibernate方言包+GBase8s jdbc實現clob、blob、text、byte大物件資料型別操作JDBC物件資料型別
- 7.82 EMPTY_BLOB, EMPTY_CLOB
- MYSQL中的DDL(用來操縱資料庫物件的語言)1MySql資料庫物件
- 研究:比特幣揭露央行貨幣操縱和資本管制比特幣
- C# 操縱貼上板 Clipboard(傳送資料、讀取資料、清空資料)C#
- JavaWeb——JDBC八股文、JSBC使用儲存過程、儲存函式、處理CLOB/BLOB型別JavaWebJDBCJS儲存過程儲存函式型別
- MySQL教程DML資料操縱語言示例詳解鍵塾MySql
- (資料科學學習手札125)在Python中操縱json資料的最佳方式資料科學PythonJSON
- MySQL 中 blob 和 text 資料型別詳解MySql資料型別
- 連結串列,樹,順序表操縱
- 數億WIFI晶片存在資料竊取和流量操縱風險;因存在安全漏洞,沃爾沃研發資料被盜WiFi晶片
- Python爬蟲教程-28-Selenium 操縱 ChromePython爬蟲Chrome
- 線上社交網路中的操縱武器
- 如何使用 jq 接收 blob 資料
- Oracle BLOB型別的資料如何檢視和下載?Oracle型別
- 淺談JDBC和資料庫連線池JDBC資料庫
- 搜尋引擎如何操縱我們的思維
- 影片操縱中的新AI技術轉向AI
- ASPOSE.Cells & ASPOSE.Words 操縱Excel和Word文件的 .NET Core 例項Excel
- JSP+JDBC資料庫應用開發初步JSJDBC資料庫
- Java mysql blob 資料讀寫操作JavaMySql
- JDBC 批量插入資料優化, 使用 addBatch 和 executeBatchJDBC優化BAT
- Firedac 在資料表中插入BLOB資料的方法
- 視訊操縱中的新AI技術轉向AI
- JDBC資料庫訪問JDBC資料庫
- JDBC連結資料庫JDBC資料庫
- JDBC連線資料庫JDBC資料庫
- JDBC連線MySQL資料庫的方法和例項JDBCMySql資料庫
- R資料分析:縱向分類結局的分析-馬爾可夫多型模型的理解與實操馬爾可夫多型模型
- 對話心動創始人黃一孟:做遊戲不是去理解和操縱人性遊戲
- 使用ABAP(ADBC)和Java(JDBC)連線SAP HANA資料庫JavaJDBC資料庫
- Spring Boot中如何使用JDBC讀取和寫入資料,JDBC和JPA的對比,JdbcTemplate和SimpleJdbcInsert的用法對比Spring BootJDBC
- Threes.js入門篇之5 - 場景操縱器TrackballJS
- “孫割”被SEC起訴!涉嫌“左手倒右手”、操縱市場!