在oracle 數據庫中使用 Blob 字段存儲 一張圖片並讀取

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

相關文章
相關標籤/搜索