java讀寫oracle的blob字段示例
package com.wanmei.meishu;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import oracle.sql.BLOB;
public class BlobUtil {
private static BlobUtil bu;
private String env;
public static BlobUtil getInstance(String env) {
bu = new BlobUtil();
bu.env = env;
return bu;
}
/**
* <p>得到數(shù)據(jù)庫鏈接</p>
* @return
* @throws Exception
*/
private Connection getConnection() throws Exception {
String driver = "oracle.jdbc.driver.OracleDriver";
Class.forName(driver);
String env = this.env;
Properties pro = new Properties();
// 讀取classes 目錄下的配置文件
pro.load(new FileReader(Class.class.getResource("/config.properties").getFile()));
String host = pro.getProperty(env + ".host");
String database = pro.getProperty(env + ".database");
String username = pro.getProperty(env + ".username");
String password = pro.getProperty(env + ".password");
String port = pro.getProperty(env + ".port");
String url = "jdbc:oracle:thin:@" + host + ":" + port +":" + database;
return DriverManager.getConnection(url, username, password);
}
/**
* <p>傳入項(xiàng)目,任務(wù),附件名稱,文件路徑,寫入數(shù)據(jù)庫</p>
* @param projectId
* @param taskId
* @param fileName
* @param file
* @return 返回是否成功
*/
public boolean write(String projectId, String taskId, String fileName, String file) {
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
BLOB blob = null;
boolean flag = false;
try {
conn = getConnection();
conn.setAutoCommit(false);
String sql = "INSERT INTO PS_ZP_PRJ_WBS_BLOB BLB(ZP_PRJ_ID, ZZ_SEQ_NUM, ZZ_FILE_NAME, ZZ_IMAGE_BLOB) VALUES(?, ? ,? ,empty_blob())";
ps = conn.prepareStatement(sql);
ps.setString(1, projectId);
ps.setString(2, taskId);
ps.setString(3, fileName);
ps.executeUpdate();
sql = "SELECT ZZ_IMAGE_BLOB FROM PS_ZP_PRJ_WBS_BLOB WHERE ZP_PRJ_ID = ? AND ZZ_SEQ_NUM = ? AND ZZ_FILE_NAME = ? FOR UPDATE";
ps = conn.prepareStatement(sql);
ps.setString(1, projectId);
ps.setString(2, taskId);
ps.setString(3, fileName);
rs = ps.executeQuery();
if(rs.next()) {
blob = (BLOB) rs.getBlob(1);
}
InputStream in = new FileInputStream(file);
OutputStream out = blob.setBinaryStream(1L);
byte[] buffer = new byte[1024];
int length = -1;
while ((length = in.read(buffer)) != -1){
out.write(buffer, 0, length);
}
in.close();
out.close();
conn.commit();
conn.setAutoCommit(true);
flag = true;
}
catch(Exception e) {
if(conn != null) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
finally {
try {
rs.close();
ps.close();
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
return flag;
}
/**
* <p>根據(jù)項(xiàng)目Id,任務(wù)Id,文件名讀取數(shù)據(jù)庫blob字段文件,寫入指定的文件路徑</p>
* @param projectId
* @param taskId
* @param fileName
* @param file
* @return 返回是否成功
*/
public boolean read(String projectId, String taskId, String fileName, String file) {
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
BLOB blob = null;
boolean flag = false;
try {
conn = getConnection();
String sql = "SELECT ZZ_IMAGE_BLOB FROM PS_ZP_PRJ_WBS_BLOB WHERE ZP_PRJ_ID = ? AND ZZ_SEQ_NUM = ? AND ZZ_FILE_NAME = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, projectId);
ps.setString(2, taskId);
ps.setString(3, fileName);
rs = ps.executeQuery();
if(rs.next()) {
blob = (BLOB) rs.getBlob(1);
}
InputStream in = blob.getBinaryStream();
byte[] buf = new byte[1024];
int bytesIn = 0;
FileOutputStream out = new FileOutputStream(file);
while ((bytesIn = in.read(buf, 0, 1024)) != -1) {
out.write(buf, 0, bytesIn);
}
in.close();
out.close();
flag = true;
}
catch(Exception e) {
e.printStackTrace();
}
finally {
try {
rs.close();
ps.close();
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
return flag;
}
public static void main(String[] args) {
BlobUtil bu = BlobUtil.getInstance("MSDEV");
System.out.println(bu.write("CB", "001", "image1", "D:\\61e44b02jw1dw4xbp2zo6j.jpg"));
System.out.println(bu.read("CB", "001", "image1", "D:\\2.jpg"));
}
}
相關(guān)文章
如何保證RabbitMQ全鏈路數(shù)據(jù)100%不丟失問題
這篇文章主要介紹了如何保證RabbitMQ全鏈路數(shù)據(jù)100%不丟失問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05詳解Guava Cache本地緩存在Spring Boot應(yīng)用中的實(shí)踐
Guava Cache是一個(gè)全內(nèi)存的本地緩存實(shí)現(xiàn),本文將講述如何將 Guava Cache緩存應(yīng)用到 Spring Boot應(yīng)用中。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Spring boot中filter類不能注入@Autowired變量問題
這篇文章主要介紹了Spring boot中filter類不能注入@Autowired變量問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化
這篇文章主要介紹了淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01springboot?ConfigurationProperties的綁定源碼示例解析
這篇文章主要為大家介紹了springboot?ConfigurationProperties的綁定源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09解決mybatisPlus 中的field-strategy配置失效問題
這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02