Oracle数据库BLOB字段的存取

本文详细介绍了Oracle数据库中Blob字段的特点、如何获取其cursor进行数据读写,以及具体的操作流程和示例代码。通过实例演示了如何在数据库中插入、查询和更新Blob类型的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述】

Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。

写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对

blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?

这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor

用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正地写入blob数据了。

【处理流程】

--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. packagedemo;
  2. importjava.sql.*;
  3. importjava.io.*;
  4. publicclassReadBlob
  5. {
  6. //加载驱动程序
  7. static
  8. {
  9. //读取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
    			//保证文件名唯一,你可以用主键+时间啊等等方法				
    			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. packagedemo;
  2. importjava.sql.*;
  3. importoracle.sql.BLOB;//▲此处的BLOB类全大写,而java.sql.Blob中的Blob非全大写
  4. importjava.io.*;
  5. publicclassWriteBlob
  6. {
  7. //加载驱动程序
  8. static
  9. {
  10. try
  11. {
  12. Class.forName("oracle.jdbc.driver.OracleDriver");
  13. }
  14. catch(Exceptione)
  15. {
  16. e.printStackTrace();
  17. }
  18. }
  19. publicstaticvoidmain(String[]args)
  20. {
  21. try
  22. {
  23. //1.建立与数据库服务器的连接
  24. Stringurl="jdbc:oracle:thin:@localhost:1521:OracleDB";
  25. Connectionconn=DriverManager.getConnection(url,"scott","tiger");
  26. conn.setAutoCommit(false);
  27. //2.首先向表中插入空的Blob
  28. //★注意:对于empty_blob()应放在SQL语句中直接赋值,使用预置语句的方式赋值无法实现.
  29. Stringsql="insertintouser_infovalues(?,?,empty_blob())";
  30. PreparedStatementps=conn.prepareStatement(sql);
  31. ps.setInt(1,1);
  32. ps.setString(2,"Lucy");
  33. ps.executeUpdate();
  34. //3.查询Blob,获得Blob的Cursor
  35. sql="selectimagefromuser_infowhereuser_id=?";
  36. ps=conn.prepareStatement(sql);
  37. ps.setInt(1,1);
  38. ResultSetrs=ps.executeQuery();
  39. BLOBblob=null;
  40. if(rs.next())
  41. {
  42. blob=(BLOB)rs.getBlob(1);
  43. }
  44. //4.使用字节流将待入库的文件写入到blob中
  45. Filefile=newFile("D:\\iriver\\sample1.bmp");
  46. FileInputStreamfin=newFileInputStream(file);
  47. byte[]temp=newbyte[fin.available()];
  48. fin.read(temp);
  49. OutputStreamout=blob.getBinaryOutputStream();
  50. out.write(temp);
  51. fin.close();
  52. out.close();
  53. //5.向数据库中写入数据
  54. sql="updateuser_infosetimage=?whereuser_id=?";
  55. ps=conn.prepareStatement(sql);
  56. ps.setBlob(1,blob);
  57. ps.setInt(2,1);
  58. ps.executeUpdate();
  59. conn.commit();
  60. }catch(Exceptione)
  61. {
  62. e.printStackTrace();
  63. }
  64. }
  65. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值