Oracle數據庫BLOB字段的存取

述】
    Oracle的Blob字段比較特殊,他比long字段的性能要好不少,能夠用來保存例如圖片之類的二進制數據。
寫入Blob字段和寫入其它類型字段的方式很是不一樣,由於Blob自身有一個cursor,你必須使用cursor對
blob進行操做,於是你在寫入Blob以前,必須得到cursor才能進行寫入,那麼如何得到Blob的cursor呢?
這須要你先插入一個empty的blob,這將建立一個blob的cursor,而後你再把這個empty的blob的cursor
用select查詢出來,這樣經過兩步操做,你就得到了blob的cursor,能夠真正地寫入blob數據了。
【處理流程】java

  1. --Oracle中的Lob類型示例表  
  2.   
  3. create table user_info   
  4. (  
  5.   user_id number(10) primary key,  
  6.   name varchar2(20),  
  7.   image blob  
  8. );  
  9.   
  10. --1. 插入空blob: (若是在數據庫中採用默認值方式對Blob字段賦值, 此步可省略)  
  11.   
  12.    insert into user_info values (1, 'Jacky', empty_blob());  
  13.   
  14. --2. 得到blob的cursor:  
  15.     
  16.    select image from user_info where user_id = ? for update;  
  17.   
  18. --3. 用cursor往數據庫寫數據:  
  19.   
  20.    update user_info set image = ? where user_id = ?;  
--Oracle中的Lob類型示例表

create table user_info 
(
  user_id number(10) primary key,
  name varchar2(20),
  image blob
);

--1. 插入空blob: (若是在數據庫中採用默認值方式對Blob字段賦值, 此步可省略)

   insert into user_info values (1, 'Jacky', empty_blob());

--2. 得到blob的cursor:
  
   select image from user_info where user_id = ? for update;

--3. 用cursor往數據庫寫數據:

   update user_info set image = ? where user_id = ?;

 

//讀取Blob數據   
  1. package demo;   
  2.   
  3. import java.sql.*;   
  4. import java.io.*;   
  5.   
  6. public class ReadBlob   
  7. {   
  8.     //加載驅動程序   
  9.     static    
  10.     {   
  11.            
    1. //讀取Blob數據  
    2. package demo;  
    3.   
    4. import java.sql.*;  
    5. import java.io.*;  
    6.   
    7. public class ReadBlob  
    8. {  
    9.     //加載驅動程序  
    10.     static   
    11.     {  
    12.           
    13.         try  
    14.         {  
    15.             Class.forName("oracle.jdbc.driver.OracleDriver");  
    16.         } catch (ClassNotFoundException e)  
    17.         {  
    18.             // TODO Auto-generated catch block  
    19.             e.printStackTrace();  
    20.         }  
    21.     }  
    22.       
    23.     public static void main(String[] args)  
    24.     {  
    25.         try  
    26.         {  
    27.             //1. 創建鏈接  
    28.             String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";  
    29.             Connection conn = DriverManager.getConnection(url,"scott","tiger");  
    30.             conn.setAutoCommit(false);  
    31.               
    32.             //2. 查詢數據  
    33.             String sql = "select image from user_info where user_id = 1";  
    34.             Statement stmt = conn.createStatement();  
    35.             ResultSet rs = stmt.executeQuery(sql);  
    36.               
    37.             //3. 讀取Blob類型數據  
    38.             Blob blob = null;  
    39.             if(rs.next())  
    40.             {  
    41.                 blob = rs.getBlob(1);  
    42.             }  
    43.             byte[] temp = new byte[(int)blob.length()];  
    44.             InputStream in = blob.getBinaryStream();  
    45.             in.read(temp)s  
    //讀取Blob數據
    package demo;
    
    import java.sql.*;
    import java.io.*;
    
    public class ReadBlob
    {
    	//加載驅動程序
    	static 
    	{
    		
    		try
    		{
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		} catch (ClassNotFoundException e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public static void main(String[] args)
    	{
    		try
    		{
    			//1. 創建鏈接
    			String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
    			Connection conn = DriverManager.getConnection(url,"scott","tiger");
    			conn.setAutoCommit(false);
    			
    			//2. 查詢數據
    			String sql = "select image from user_info where user_id = 1";
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery(sql);
    			
    			//3. 讀取Blob類型數據
    			Blob blob = null;
    			if(rs.next())
    			{
    				blob = rs.getBlob(1);
    			}
    			byte[] temp = new byte[(int)blob.length()];
    			InputStream in = blob.getBinaryStream();
    			in.read(temp)s
    1.             <strong>//保證文件名惟一,你能夠用主鍵+時間啊等等方法</strong>                 
    2.             File file = new File("D://img.bmp");  
    3.             FileOutputStream fout = new FileOutputStream(file);  
    4.             fout.write(temp);  
    5.             in.close();  
    6.             fout.close();  
    7.         } catch (Exception e)  
    8.         {  
    9.             // TODO Auto-generated catch block  
    10.             e.printStackTrace();  
    11.         }  
    12.     }  
    13. }  
    			//保證文件名惟一,你能夠用主鍵+時間啊等等方法				
    			File file = new File("D://img.bmp");
    			FileOutputStream fout = new FileOutputStream(file);
    			fout.write(temp);
    			in.close();
    			fout.close();
    		} catch (Exception e)
    		{
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }

 

//寫Blob數據   
  1. package demo;   
  2.   
  3. import java.sql.*;   
  4. import oracle.sql.BLOB;//▲此處的BLOB類全大寫, 而java.sql.Blob中的Blob非全大寫   
  5. import java.io.*;   
  6.   
  7. public class WriteBlob   
  8. {   
  9.     //加載驅動程序   
  10.     static    
  11.     {   
  12.         try  
  13.         {   
  14.             Class.forName("oracle.jdbc.driver.OracleDriver");   
  15.         }   
  16.         catch(Exception e)   
  17.         {   
  18.             e.printStackTrace();   
  19.         }   
  20.     }   
  21.     public static void main(String[] args)   
  22.     {   
  23.         try  
  24.         {   
  25.             //1. 創建與數據庫服務器的鏈接   
  26.             String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";   
  27.             Connection conn = DriverManager.getConnection(url,"scott","tiger");   
  28.             conn.setAutoCommit(false);   
  29.                
  30.             //2. 首先向表中插入空的Blob   
  31.             //★注意: 對於empty_blob()應放在SQL語句中直接賦值, 使用預置語句的方式賦值沒法實現.   
  32.             String sql = "insert into user_info values(?,?,empty_blob())";   
  33.             PreparedStatement ps = conn.prepareStatement(sql);   
  34.             ps.setInt(1, 1);   
  35.             ps.setString(2, "Lucy");   
  36.             ps.executeUpdate();   
  37.                
  38.             //3. 查詢Blob, 得到Blob的Cursor   
  39.             sql = "select image from user_info where user_id = ?";   
  40.             ps = conn.prepareStatement(sql);   
  41.             ps.setInt(1, 1);   
  42.             ResultSet rs = ps.executeQuery();   
  43.             BLOB blob = null;   
  44.             if(rs.next())   
  45.             {   
  46.                 blob = (BLOB)rs.getBlob(1);   
  47.             }   
  48.                
  49.             //4. 使用字節流將待入庫的文件寫入到blob中   
  50.             File file = new File("D://iriver//sample1.bmp");   
  51.             FileInputStream fin = new FileInputStream(file);   
  52.             byte[] temp = new byte[fin.available()];   
  53.             fin.read(temp);   
  54.             OutputStream out = blob.getBinaryOutputStream();   
  55.             out.write(temp);   
  56.             fin.close();   
  57.             out.close();   
  58.                
  59.             //5. 向數據庫中寫入數據   
  60.             sql = "update user_info set image = ? where user_id = ?";   
  61.             ps = conn.prepareStatement(sql);   
  62.             ps.setBlob(1, blob);   
  63.             ps.setInt(2, 1);   
  64.             ps.executeUpdate();   
  65.                
  66.             conn.commit();   
  67.         } catch (Exception e)   
  68.         {   
  69.             e.printStackTrace();   
  70.         }   
  71.     }   
  72. }  
相關文章
相關標籤/搜索