`

oracle存储大数据类型(Clob/Blob)

    博客分类:
  • db
阅读更多

oracle本身支持对大数据类型的各种处理,但是平常大家可能用的不多,其中clob(一般用于大类型的字符型的存取)和blob(一般用于大类型的二进制类型的存取)我想应该就是用的比较少的。所以我写下这篇博文,主要是对这两个数据类型的文件进行的操作,如,保存这类文件进入数据库,读取这类文件到本地磁盘。

本来按照老习惯是该先上效果图的,可惜我的机器现在巨卡,10g跑起来基本让我泪流满面,所以我就偷下懒,图就给省略了 -_-!

 

第一步,新建一个java项目(为啥是java项目而不是web呢,主要因为它便于测试,出效果也快...)orclTest

 

第二步,新建一个数据库连接的类,我这里是com.test.InitDB.java,代码如下:


class InitDB{
    private static Connection con = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;

    //链接oracle数据库
    InitDB()
    {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
            String url = "jdbc:oracle:thin:@localhost:1521:YYSMID"; 
            String user = "zhangsan";
            String password = "Lc123456";
            con = (Connection) DriverManager.getConnection(url, user, password);
            InitDB.setCon(con);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void closCon()
    {
        try
        {
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void stmt()
    {
        try
        {
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public void rs()
    {
        try
        {
            con.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    public static Connection getCon()
    {
        return con;
    }

    public static void setCon(Connection con)
    {
        InitDB.con = con;
    }

    public static ResultSet getRs()
    {
        return rs;
    }

    public static void setRs(ResultSet rs)
    {
        InitDB.rs = rs;
    }

    public static Statement getStmt()
    {
        return stmt;
    }

    public static void setStmt(Statement stmt)
    {
        InitDB.stmt = stmt;
    }
}
 

第三步,以及接下来的几步,我们来分别编写clob和blob的插入数据库和读出数据库的代码,新建com.test.InsertBlobData.java,顾名思义,它是用来插入blob类型数据的类。代码如下:


class InsertBlobData{
    private ResultSet rs = null;
    private InitDB idb = null;

    InsertBlobData()
    {
        idb = new InitDB();
    }

    public void insertBlob(String sql1) throws SQLException
    {
        Connection con = idb.getCon();
        try
        {
            con.setAutoCommit(false);// 不设置自动提交
            BLOB blob = null; // 插入空的Blob
            PreparedStatement pstmt = con
                    .prepareStatement("insert into cdl_test(sid,img) values(?,empty_blob())");
            pstmt.setString(1, "100");
            pstmt.executeUpdate();
            pstmt.close();
            rs = con.createStatement().executeQuery(sql1);
            while (rs.next())
            {
                System.out.println("rs length is:");
                oracle.sql.BLOB b = (oracle.sql.BLOB) rs.getBlob("img");
                System.out.println("cloblength is:" + b.getLength());
                File f = new File("d:\\1.jpg"); //1.jpg一张QQ的截图
                System.out.println("file path is:" + f.getAbsolutePath());
                BufferedInputStream in = new BufferedInputStream(
                        new FileInputStream(f));
                BufferedOutputStream out = new BufferedOutputStream(b
                        .getBinaryOutputStream());
                int c;
                while ((c = in.read()) != -1)
                {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            con.commit();
        }
        catch (Exception e)
        {
            con.rollback();// 出错回滚
            e.printStackTrace();
        }
    }
}

 

第四步,新建com.test.InsertClobData.java,用于插入clob数据类型的,代码如下:

 

 

class InsertClobData
{
    private ResultSet rs = null;
    private InitDB idb = null;

    InsertClobData()
    {
        idb = new InitDB();
    }

    public void insertClob(String sql1) throws SQLException
    {
        Connection con = idb.getCon();
        try
        {
            con.setAutoCommit(false);// 不设置自动提交
            BLOB blob = null; // 插入空的Clob
            PreparedStatement pstmt = con
                    .prepareStatement("insert into cdl_test(sid,doc) values(?,empty_clob())");
            pstmt.setString(1, "101");
            pstmt.executeUpdate();
            pstmt.close();
            rs = con.createStatement().executeQuery(sql1);
            while (rs.next())
            {
                System.out.println("sdfasdfas");
                oracle.sql.CLOB cb = (oracle.sql.CLOB) rs.getClob("doc");
                File f = new File("d:\\1.txt"); //1.txt一本小说《风云》马荣成
                System.out.println("file path is:" + f.getAbsolutePath());
                BufferedWriter out = new BufferedWriter(cb
                        .getCharacterOutputStream());
                BufferedReader in = new BufferedReader(new FileReader(f));
                int c;
                while ((c = in.read()) != -1)
                {
                    out.write(c);
                }
                in.close();
                out.close();
            }
            con.commit();
        }
        catch (Exception e)
        {
            con.rollback();// 出错回滚
            e.printStackTrace();
        }
    }
}
 

 

 

第五步,新建com.test.ReadBlobData.java,用于读取blob类型的数据,代码如下:

 

 

class ReadBlobData
{
    private ResultSet rs = null;
    private InitDB idb = null;

    ReadBlobData()
    {
        idb = new InitDB();
    }

    public void getBlob(String sql2) throws SQLException
    {
        Connection con = idb.getCon();
        con.setAutoCommit(false);
        try
        {
            System.out.println("sq2 is:" + sql2);
            System.out.println("stmt is:" + con);
            rs = con.createStatement().executeQuery(sql2);
            while (rs.next())
            {
                System.out.println("rs length is:");
                Blob b = (Blob) rs.getBlob("img");
                File f = new File("D:\\1.jpg");
                FileOutputStream fos = new FileOutputStream(f);
                InputStream is = b.getBinaryStream();// 读出数据后转换为二进制流
                byte[] data = new byte[1024];
                while (is.read(data) != -1)
                {
                    fos.write(data);
                }
                fos.close();
                is.close();
            }
            con.commit();// 正式提交
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            // rs.close();
        }
    }
}

 

 

第六步,新建com.test.ReadClobData.java,用于读取clob类型的数据,代码如下:

 

 

class ReadClobData
{
    private ResultSet rs = null;
    private InitDB idb = null;

    ReadClobData()
    {
        idb = new InitDB();
    }

    public void getClob(String sql2) throws SQLException
    {
        Connection con = idb.getCon();
        try
        {
            con.setAutoCommit(false);// 不设置自动提交
            System.out.println("sq2 is:" + sql2);
            rs = con.createStatement().executeQuery(sql2);
            while (rs.next())
            {
                oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("doc");
                File f = new File("d:\\1.txt");
                BufferedReader in = new BufferedReader(clob
                        .getCharacterStream());
                // setCharacterStream()方法,可用于将CLOB字段与字节流相关联,
                BufferedWriter out = new BufferedWriter(new FileWriter(f));
                int c;
                while ((c = in.read()) != -1)
                {
                    out.write(c);
                }
                out.close();
                in.close();
            }
            con.commit();// 正式提交
            rs.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            con.rollback();
        }
    }
}

 

最后,就是新建测试类了,每每用着main方法,我就感觉这世界是多么的有爱啊,junit什么的,最讨厌了.....

 

 

public class TestBlob_Clob
{
    public static void main(String[] args)
    {
        String sql1 = "select * from cdl_test  for update";// 悲观锁锁定需更新的行
        String sql2 = "select * from cdl_test";
        System.out.println("\t\t\t欢迎使用:");
        System.out.println("1:插入图片");
        System.out.println("2:插入文本");
        System.out.println("3:读取图片");
        System.out.println("4:读取文本");
        System.out.println("5:退出");
        System.out.println("请选择:");
        while (true)
        {
            try
            {
                Scanner sc = new Scanner(System.in);
                int i = sc.nextInt();
                System.out.println("sss:" + i);
                switch (i)
                {
                case 1:
                    InsertBlobData isd = new InsertBlobData();
                    //插入图片
                    isd.insertBlob(sql1);
                    break;
                case 2:
                    InsertClobData icd = new InsertClobData();
                    //插入小说
                    icd.insertClob(sql1);
                    break;
                case 3:
                    ReadBlobData rb = new ReadBlobData();
                    //得到图片
                    rb.getBlob(sql2);
                    break;
                case 4:
                    ReadClobData rc = new ReadClobData();
                    //得到小说
                    rc.getClob(sql2);
                    break;
                case 5:
                    System.exit(0);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}
 

 

分享到:
评论

相关推荐

    clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle

    在Oracle数据库中,CLOB(Character Large Object)和BLOB(Binary Large Object)是用来存储大量文本数据和二进制数据的特殊数据类型。CLOB用于存储大文本数据,如长篇文章或XML文档,而BLOB则用于存储图像、音频、...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    在Java的持久化框架Hibernate中,处理大数据类型如Clob(Character Large Object)和Blob(Binary Large Object)是一项常见的任务。这些数据类型通常用于存储大量的文本数据(Clob)和二进制数据(Blob),例如长篇...

    Hibernate操作Oarcle中Clob、Blob字段小结

    在Java的持久化框架Hibernate中,处理大数据类型如Oracle数据库中的Clob(Character Large Object)和Blob(Binary Large Object)字段是一项重要的任务。Clob通常用于存储大量的文本数据,而Blob则适用于二进制...

    用VC访问Oracle操作大数据类型的高效方法.pdf

    【描述】: 本文主要探讨了在Visual C++(VC)环境下,利用Oracle Objects for OLE(OO40)来高效处理Oracle数据库中的大数据类型,如Long raw、BLOB、CLOB等。这种方法相比传统的ODBC中间件,具有更快的速度和更高的...

    oracle对大对象类型操作:blob,clob,nclob,bfile

    Oracle数据库系统支持对大型数据对象(LOBs,Large Objects)的操作,这包括BLOB、CLOB、NCLOB和BFILE四种类型。每种类型都有其特定的用途和特性,适用于存储不同类型的大数据。 1. BLOB(Binary Large Object): ...

    oracle中的BLOB(照片)转换到mysql中

    Oracle数据库系统支持多种复杂的数据类型,其中包括BLOB(Binary Large Object),用于存储非结构化的大数据,如图片、音频或视频文件。而MySQL同样提供了BLOB类型,用于相似的用途。本篇将详细讲解如何在Oracle与...

    Oracle的CLOB大数据字段类型操作方法

    Oracle数据库在处理大数据字段时,提供了CLOB(Character Large Object)类型,用于存储大量文本数据。CLOB类型是LOB家族的一员,与BLOB(Binary Large Object)不同,它专门用于存储字符集相关的数据,比如文档、...

    hibernate保存blob,clob对象

    在Java的持久化框架Hibernate中,处理大数据类型如BLOB(Binary Large Object)和CLOB(Character Large Object)是一项常见的任务。BLOB用于存储二进制数据,如图片、视频或文档,而CLOB则用于存储大文本数据,如...

    hibernate动态映射表处理oracle的clob类型

    - 使用Blob/Clob接口:直接操作Clob接口进行读写,而不是将其转换为字符串或其他数据类型,以减少转换开销。 通过以上内容,你应该对在Hibernate中动态映射Oracle 10g的CLOB类型有了深入理解,这将帮助你在实际...

    深入浅析mybatis oracle BLOB类型字段保存与读取

    在Oracle数据库中,BLOB(Binary Large Object)和CLOB(Character Large Object)是两种用于存储大量数据的特殊字段类型。本篇文章将深入剖析如何使用MyBatis框架在Oracle数据库中对BLOB类型字段进行保存和读取。 ...

    load blob clob

    在Oracle数据库系统中,Blob和Clob是两种特殊的数据类型,用于存储大对象(Large Object)。Blob主要用于存储二进制数据,如图片、视频或文档,而Clob则用于存储字符型的大数据,如长篇文本或XML文件。本篇文章将...

    oracle mysql sqlser2000对大数据对象的操作

    Oracle提供了诸如BFILE、CLOB(Character Large Object)和NCLOB(National Character Large Object)等数据类型来处理不同类型的大数据对象。BFILE允许存储在操作系统文件系统上的大型二进制文件,而CLOB和NCLOB则...

    Hibernate对BLOB CLOB操作

    同时,确保数据库支持高效的BLOB和CLOB操作,比如Oracle的BFILE类型或使用流式处理。 总之,Hibernate提供了对BLOB和CLOB的便利支持,允许开发者在Java应用中轻松地处理大数据对象,从而实现与数据库的高效交互。...

    用OO4O操作Oracle数据库的大数据字段.pdf

    【Oracle 数据库与大数据字段操作】Oracle 数据库是关系型数据库的一种,被广泛应用于存储和管理各种类型的数据,包括图像、音频、视频等大数据量的信息。这些数据通常以大数据字段的形式存储,如 BFile、BLOB...

    spring+hibernate操作oracle的clob字段

    在J2EE开发中,处理大数据对象(如大文本或二进制数据)时,Oracle数据库的CLOB字段常被用来存储超过4000字节的信息。Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和...

    通过PLSQL的进行oracle数据库导入导出

    - **BLOB数据**:BLOB用于存储二进制大数据,可以使用`UTL_FILE`包或`DBMS_LOB`包的函数将BLOB内容写入文件,然后在目标数据库中读取并插入。 ### CLOB和BLOB的处理方法 1. **CLOB导出**:创建存储过程,将CLOB...

    用OO4O操作Oracle数据库的大数据字段 (1).pdf

    在实际开发中,推荐使用BLOB和CLOB字段来存储大数据,以充分利用Oracle数据库对大对象的支持和优化。 总之,OO4O提供了一种高效且灵活的方法来处理Oracle数据库中的大数据字段,使得在VC++环境下进行大数据操作变得...

Global site tag (gtag.js) - Google Analytics