述】
    Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对
blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?
这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor
用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正地写入blob数据了。
【处理流程】

 

  1. package demo;
  2. import java.sql.*;
  3. import java.io.*;
  4. public class ReadBlob
  5. {
  6. //加载驱动程序
  7. static
  8. {
    1. //读取Blob数据
    2. package demo;
    3. import java.sql.*;
    4. import java.io.*;
    5. public class ReadBlob
    6. {
    7. //加载驱动程序
    8. static
    9. {
    10. try
    11. {
    12. Class.forName("oracle.jdbc.driver.OracleDriver");
    13. } catch (ClassNotFoundException e)
    14. {
    15. // TODO Auto-generated catch block
    16. e.printStackTrace();
    17. }
    18. }
    19. public static void main(String[] args)
    20. {
    21. try
    22. {
    23. //1. 建立连接
    24. String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
    25. Connection conn = DriverManager.getConnection(url,"scott","tiger");
    26. conn.setAutoCommit(false);
    27. //2. 查询数据
    28. String sql = "select image from user_info where user_id = 1";
    29. Statement stmt = conn.createStatement();
    30. ResultSet rs = stmt.executeQuery(sql);
    31. //3. 读取Blob类型数据
    32. Blob blob = null;
    33. if(rs.next())
    34. {
    35. blob = rs.getBlob(1);
    36. }
    37. byte[] temp = new byte[(int)blob.length()];
    38. InputStream in = blob.getBinaryStream();
    39. 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();
    }
    }
    }
  1. package demo;
  2. import java.sql.*;
  3. import oracle.sql.BLOB;//▲此处的BLOB类全大写, 而java.sql.Blob中的Blob非全大写
  4. import java.io.*;
  5. public class WriteBlob
  6. {
  7. //加载驱动程序
  8. static
  9. {
  10. try
  11. {
  12. Class.forName("oracle.jdbc.driver.OracleDriver");
  13. }
  14. catch(Exception e)
  15. {
  16. e.printStackTrace();
  17. }
  18. }
  19. public static void main(String[] args)
  20. {
  21. try
  22. {
  23. //1. 建立与数据库服务器的连接
  24. String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
  25. Connection conn = DriverManager.getConnection(url,"scott","tiger");
  26. conn.setAutoCommit(false);
  27. //2. 首先向表中插入空的Blob
  28. //★注意: 对于empty_blob()应放在SQL语句中直接赋值, 使用预置语句的方式赋值无法实现.
  29. String sql = "insert into user_info values(?,?,empty_blob())";
  30. PreparedStatement ps = conn.prepareStatement(sql);
  31. ps.setInt(1, 1);
  32. ps.setString(2, "Lucy");
  33. ps.executeUpdate();
  34. //3. 查询Blob, 获得Blob的Cursor
  35. sql = "select image from user_info where user_id = ?";
  36. ps = conn.prepareStatement(sql);
  37. ps.setInt(1, 1);
  38. ResultSet rs = ps.executeQuery();
  39. BLOB blob = null;
  40. if(rs.next())
  41. {
  42. blob = (BLOB)rs.getBlob(1);
  43. }
  44. //4. 使用字节流将待入库的文件写入到blob中
  45. File file = new File("D://iriver//sample1.bmp");
  46. FileInputStream fin = new FileInputStream(file);
  47. byte[] temp = new byte[fin.available()];
  48. fin.read(temp);
  49. OutputStream out = blob.getBinaryOutputStream();
  50. out.write(temp);
  51. fin.close();
  52. out.close();
  53. //5. 向数据库中写入数据
  54. sql = "update user_info set image = ? where user_id = ?";
  55. ps = conn.prepareStatement(sql);
  56. ps.setBlob(1, blob);
  57. ps.setInt(2, 1);
  58. ps.executeUpdate();
  59. conn.commit();
  60. } catch (Exception e)
  61. {
  62. e.printStackTrace();
  63. }
  64. }
  65. }

Oracle数据库BLOB字段的存取的更多相关文章

  1. 对oracle数据库Blob字段的操作

    java实体类 定义类型 byte[] private byte[] str_blob hibernate映射文件类型oracle.sql.BLOB <property name="s ...

  2. C# winform 窗体应用程序之图片上传Oracle数据库保存字段BLOB

    C# winform 窗体应用程序之图片上传Oracle数据库保存字段BLOB 我用的数据库是Oracle,就目前来看,许多数据库现在都倾向于Oracle数据库,对ORACLE数据库基本的操作也是必须 ...

  3. sybase数据库和oracle数据库中字段中含有换行符的解决办法

    最近在做数据库从sybase到oracle的迁移工作,sybase数据库表bcp导出后,通过sqlldr导入到oracle数据库,然后oracle数据库通过spool按照sybase数据库bcp的格式 ...

  4. oracle数据库调整字段顺序

    oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034

  5. php oracle数据库NCOLB字段ORA-01704

    php oracle数据库NCOLB字段ORA-01704 对clob更新  ORA-01704: 字符串文字太长 解决办法:把字符赋值给一个变量,然后赋值update语句 declarev_clob ...

  6. FIREDAC保存ORACLE的BLOB字段数据

     FIREDAC默认识别ORACLE的BLOB字段为HUGEBLOB,需要将HBLOB映射为BLOB,才可以保存ORACLE的BLOB字段的数据.

  7. Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题

    一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...

  8. Oracle数据库clob字段导出为sql insert插入语句

    oracle数据库的clob字段导出为sql insert插入语句可以分三种情况:1,clob没有换行符:2,clob有换行符但不以分号结尾:3,clob有换行符并且以分号结尾. clob没有换行符使 ...

  9. java读取写入oracle的blob字段工具类

    import com.hzunitech.fxgk.sys.model.UtFileData;import com.jfinal.kit.PathKit;import com.jfinal.plugi ...

随机推荐

  1. 简单说一个IOCP不好的地方

    感谢rulary的指正!博文中我对IOCP的理解是有误的,正确的方式请见评论区rulary的回复! 由于项目实际设计的需要,最终IO事件处理没有采用IOCP,而是采用了NT6.0引入的WSAPoll, ...

  2. Android---闪频页和倒计时

    android闪频的实现非常简单,使用Handler对象的postDelayed()方法就可以实现.在这个方法里传递一个Runnable对象和一个延迟的时间.该方法实现了一个延迟执行的效果,延迟的时间 ...

  3. linux系统下,查看端口号被哪个应用占用

    netstat -tunlp 会把所有端口和所有对应的程序显示出来. 用grep管道可过滤出来需要的信息.比如,17059端口号被占用了. 第一步:netstat -tunlp | grep 1705 ...

  4. SVN与git交互

    操作的第一步,就是找到版本库,然后打开,有git的文件夹叫版本库    OrderManagement是版本库 第二步,查看日志,在版本库里内部,空白处右键,选择TortoiseGit--showlo ...

  5. 使用CocoaPod导入Swift第三方库报错

    在使用cocoapod导入swift第三方时出现这样的错误: [!] Pods written in Swift can only be integrated as frameworks; add ` ...

  6. 解决Oracle在scott用户下创建视图(VIEW)权限不足的方法

    问题描述:在scott用户下创建视图的时候,报错:权限不足.(其他用户以此类推)解决方法: 以dba用户登录 sqlplus / as sysdba 赋予scott用户创建VIEW的权限 grant  ...

  7. 一触即发 App启动优化最佳实践

    一触即发 App启动优化最佳实践 本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送. 文中的很多图都是Google性能优 ...

  8. PHPExcel 导出时乱码

    今天遇到了个奇怪的问题..猜测应该是因为php文件的编码造成的,但是没有解决办法. 问题是,用PHPEXCEL导出文件的时候,相同的代码在一个文件中可以导出,在另一个文件中却不行.. 最后没有办法,只 ...

  9. 利用C语言获得网页编码

    #include <stdio.h> #include <winsock.h> #include <string.h> #pragma comment(lib, & ...

  10. ivy 配置 maven代理

    Ivy 是一个依赖管理工具,直观感受是其跟maven 的作用差不多:但这两个其实是不同的工具: maven 是面向整个项目的工程管理及构建工具:ivy 仅作为依赖管理工具,与ant 高度集成. 需要了 ...