zoukankan      html  css  js  c++  java
  • JavaEE JDBC 读写LOB大对象

    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)时,并不等于获取了它的实际内容,

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

  • 相关阅读:
    HDU.5765.Bonds(DP 高维前缀和)
    SPOJ.TLE
    LOJ.2585.[APIO2018]新家(二分 线段树 堆)
    BZOJ.2679.Balanced Cow Subsets(meet in the middle)
    BZOJ.3293.[CQOI2011]分金币(思路)
    BZOJ.4558.[JLOI2016]方(计数 容斥)
    BZOJ.3631.[JLOI2014]松鼠的新家(树上差分)
    BZOJ.1568.[JSOI2008]Blue Mary开公司(李超线段树)
    BZOJ.1071.[SCOI2007]组队(思路)
    BZOJ.4910.[SDOI2017]苹果树(树形依赖背包 DP 单调队列)
  • 原文地址:https://www.cnblogs.com/ixenos/p/6294081.html
Copyright © 2011-2022 走看看