zoukankan      html  css  js  c++  java
  • JDBC--处理Blob

    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);
        }
    }
  • 相关阅读:
    Python 初学者必看:Python 异常处理集合
    解析分布式应用框架Ray架构源码
    混合编程:如何用python11调用C++
    AI开发效率低,你可以试试华为NAIE AutoML
    知道Python中的字符串是什么吗?
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    MindSpore部署图像分割示例程序
    MindSpore模型推理
    MindSpore特性支持类
    MindSpore后端运行类
  • 原文地址:https://www.cnblogs.com/tengtao93/p/4984689.html
Copyright © 2011-2022 走看看