转载JDBC操作LOB字段

Posted YangtzeYu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载JDBC操作LOB字段相关的知识,希望对你有一定的参考价值。

转自:http://www.cnblogs.com/tengtao93/p/4984689.html

1、LOB(Large Objects)大对象,是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储多达4GB的数据)

--LOB分类两种类型:1)内部LOB; 2)外部LOB:

  --内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作;

    --Oracle支持三种类型的内部LOB:1)BLOB(二进制数据);2)CLOB(单字节字符数据);3)NCLOB(多字节字符数据);

    --CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、文件等。

  --外部LOB:目前只支持一种外部LOB类型,即BFILE类型,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于文件系统中。

    --BFILE类型所表示的数据都是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。

2、使用JDBC向数据库插入BLOB类型的数据时必须使用PreparedStatement。

3、向Oracle数据库插入Blob类型数据

复制代码
public void insertBlobData(){
    Connection conn = null;
    PreparedStatement ps = null;
    String sql = "INSERT INTO customers(id, name, picture) VALUES(?,?,?)";
    try{
        conn = JDBCUtils.getConnection();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, 12345);
        ps.setString(2, "Alice");
        
        InputStream in = new FileInputStream("test.jpg");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] b = new byte[1024]; 
        int len;
        while((len = in.read(b)) != -1){
            baos.write(b, 0, len);
        }
        ps.setBytes(3, baos.toByteArray());
        
        ps.executeUpdate();
        in.close();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, ps, null);
    }
}
复制代码

4、从Oracle数据库中读取Blob类型的数据并通过IO流写入文件中:

复制代码
public void readBlobData(){
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    String sql = "SELECT id, name, picture FROM customers WHERE id = ?";
    try{
        conn = JDBCUtils.getConnection();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, 12345);
        rs = ps.executeQuery();
        if(rs.next()){
            Blob blob = rs.getBlob(3);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("out.jpg"));
            InputStream in = blob.getBinaryStream();
            byte[] b = new byte[1024];
            int len;
            while((len = in.read(b)) != -1){
                bos.write(b,0, len);
                bos.flush();
            }
            bos.close();
            in.close();
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, ps, rs);
    }
}
复制代码

以上是关于转载JDBC操作LOB字段的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库中的大对象(LOB)数据类型介绍

[转帖]Oracle数据库lob大对象数据类型字段总结,值得收藏

在 @Lob 字段中搜索 IndexOutOfBound

LOB字段HWM问题 收缩高水位线的测试

创建表规范 lob 字段

Blob(二进制大对象)