1. 進行數據庫的設置 java
create table image_lob(t_id varchar2(5) not null,t_image blob not null);
create or replace directory "images" as 'f:\pic\';
create or replace procedure img_insert(tid varchar2,filename varchar2)as
f_lob bfile;
b_lob blob;
begin
insert into image_lob(t_id,t_image)
values(tid,empty_blob())return t_image into b_lob;
f_lob:=bfilename('images',filename);
dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);
dbms_lob.loadfromfile(b_lob,f_lob,
dbms_lob.getlength(f_lob));
dbms_lob.fileclose(f_lob);
commit;
end;
/
在 f:\pic 文件夾下(這個須要本身創建), 一張圖片 cat.png
exec img_insert('1','cat.png'); 或者 CALL IMG_INSERT('2','cat.png');
--查看的代碼
select * from image_lob;
select t_image from image_lob where t_id = '1' for update;
2. 使用 java 對 blob 數據庫進行讀取
package JavaTest;
import SQLUtils.SQLUtils;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.ResultSet;
public class CallBlob {
public CallBlob() {
super();
}
public static void main(String[] args)
{
try
{
//1. 創建鏈接
String driveName = "oracle.jdbc.driver.OracleDriver" ;
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String userName = "hr";
String passWord="hr";
Connection conn = SQLUtils.getConnection(driveName, url, userName, passWord, false);
//2. 查詢數據
String sql = "select t_image from image_lob where t_id = '2'";
ResultSet rs = SQLUtils.getResultSet(conn, sql);
//3. 讀取Blob類型數據 ,並寫入對應的位置
Blob blob = SQLUtils.getBlob(rs, 1);
byte[] temp = new byte[(int)blob.length()];
String fileUrl = "E://img.png" ;
SQLUtils.writePicToSomeWhere(blob, temp, fileUrl);
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package SQLUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class SQLUtils {
public SQLUtils() {
super();
}
/**
*根據相關的條件,返回一個 jdbc 的鏈接
*
@param driverName 驅動名稱
*
@param connUrl 鏈接字符串
*
@param userName 數據庫名稱
*
@param passWord 數據庫密碼
* @param isCommit 是否自動提交 sql 語句
* @return 一個 jdbc 的 connecion
*/
public static Connection getConnection(String driverName, String connUrl , String userName, String passWord,Boolean isCommit){
Connection conn = null ;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(connUrl,userName,passWord);
conn.setAutoCommit(isCommit);
} catch (ClassNotFoundException e) {
System.out.println("沒有找到驅動異常!");
} catch (SQLException e) {
System.out.println("鏈接字符串錯誤或者數據庫用戶名密碼錯誤異常!");
}
return conn;
}
/**
*根據 connection 和 sql 語句 , 返回一個 ResultSet 對象
* @param conn 數據庫鏈接的 Connection
* @param sql 要執行的 SQL語句
* @return 獲得 ResultSet 對象
*/
public static ResultSet getResultSet(Connection conn , String sql){
ResultSet rs = null ;
try {
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
System.out.println("sql 語句執行失敗!");
}
return rs ;
}
/**
*根據 ResultSet 和 index 獲取Blob 數據
* @param rs 數據返回的 ResultSet
* @param index 數據庫表中的 字段位置, 從一開始的
* @return 讀取的 Blob 數據
*/
public static Blob getBlob(ResultSet rs, int index){
Blob blob = null;
try {
if(rs.next())
{
blob = rs.getBlob(index);
}
} catch (SQLException e) {
System.out.println("讀取Blob 數據失敗, 請檢查 index 的位置!");
}
return blob ;
}
/**
*將得到的 Blob 數據, 存儲到硬盤指定的位置
* @param blob
* @param temp
* @param fileUrl
*/
public static void writePicToSomeWhere(Blob blob,byte[] temp,String fileUrl){
InputStream in = null;
FileOutputStream fout = null ;
try {
in = blob.getBinaryStream();
in.read(temp);
File file = new File(fileUrl);
fout = new FileOutputStream(file);
fout.write(temp);
} catch (SQLException e) {
System.out.println("從 blob 得到inputStream失敗!");
} catch (IOException e) {
System.out.println("io 讀寫失敗!");
} finally {
try{
in.close();
fout.close();
} catch (Exception e){
System.out.println("輸入流或輸出流關閉失敗!");
}
}
}
} sql