JDBC 读写LOB大对象

@author ixenos

LOB


除了数字、字符串和日期之外,许多数据库还可以存储大对象,例如图片或其他数据,

在SQL中,二进制(字节型)大对象称为BLOB,字符型大对象称为CLOB

读取LOB流程


i.     执行SELECT语句

ii.    ResultSet调用getBlob或getClob方法获取Blob或Clob类型的对象

iii.   Blob调用getBytes或getInputStream方法获取Image等对象

iv.   代码如下:

PreparedStatement stat = conn.prepareStatement(“SELECT Cover FROM BookCovers WHERE ISBN=?”);

stat.set(1, isbn);

ResultSet result = stat.executeQuery();

If(result.next()){
    //从ResultSet中获取Blob对象
Blob coverBlob = result.getBlob(1);
    //Blob对象打开字节流,获取数据
Image coverImage = ImageIO.read(coverBlob.getBinaryStream()); }

   v.  同理,Clob调用getSubString或getCharacterStream来获取字符数据

存储LOB对象到数据库流程


i. 在Connection对象上调用createBlob或createClob得到空的Blob、Clob

ii. 从Blob、Clob获取该LOB的输出流或写出器

iii. 将数据通过输出流写出数据到LOB对象中

iv. 将该LOB对象存储到数据库中

v. 代码如下:

Blob coverBlob = conn.createBlob();

int offset = 0;

OutputStream out = coverBlob.setBinaryStream(offset);
//将Image对象coverImage的数据用二进制流输出到Blob对象中
ImageIO.write(coverImage, “PNG”, out); PreparedStatement stat = conn.prepareStatement(“INSERT INTO Cover VALUES (?,?)”); stat.set(1, isbn);
//将Blob对象插入数据库中
stat.set(2, coverBlob); stat.executeUpdate();

  

注意


  从数据库中读取一个LOB数组(SQL数组指值的序列,在java中是java.sql.array)时,并不等于获取了它的实际内容,

  只有在访问具体的值时,它们才会从数据库中被读取出来,这对改善性能有好处,因为通常这些数据的数据量都非常大

最新文章

  1. PagerSlidingTabStrip介绍及使用,让ViewPager更绚丽
  2. Mysql主从架构的复制
  3. POJ1584 判断多边形是否为凸多边形,并判断点到直线的距离
  4. Asprise-OCR的使用
  5. EVE ToDo
  6. 发现easyui-accordion一个bug,在ie6、ie7不兼容性问题
  7. 递归模式学习(recursion)
  8. Java 专业人士必备的书籍和网站列表
  9. Java-泛型编程-使用通配符? extends 和 ? super
  10. 5 Java学习之 泛型
  11. python程序不支持中文
  12. axis2 webservices 411错误解决办法
  13. 关于socket通讯,如何才能高效?
  14. JavaEE中的MVC(一)Dao层彻底封装
  15. 使用最小堆优化Dijkstra算法
  16. Linux下关闭Tomcat残留线程
  17. python3+django2 开发易语言网络验证(上)
  18. MySQL存储过程(PROCEDURE)(二)
  19. python excel 读写
  20. [SQL in Azure] Getting Started with SQL Server in Azure Virtual Machines

热门文章

  1. 贪心 UVALive 6834 Shopping
  2. performClick()方法的使用
  3. 在spring boot 中使用itext和itextrender生成pdf文件
  4. Java多线程——线程的创建方式
  5. 在sql server 如何创建一个只读账户
  6. call和apply和bind的区别
  7. CFAN:Coarse-to-Fine Auto-Encoder Networks (CFAN) for Real-Time Face Alignment
  8. swift 待研备份
  9. 在Swift中定义属于自己的运算符
  10. vue工程化:返回顶部和底部的动画效果