日期:2014-05-16  浏览次数:20544 次

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

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());