`
lysongfei
  • 浏览: 60163 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC操作BFILE字段

 
阅读更多

 

import java.io.*;
import java.sql.*;

import oracle.sql.*;
import oracle.jdbc.*;

public class JdbcBfile {
    public static void main(String[] args){
        Connection conn = null;
        Statement stmt = null;
        try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }
        catch(ClassNotFoundException e){
            e.printStackTrace();
        }
        
        try{
            conn = DriverManager.getConnection("jdbc:oracle:thin:@db_server:1521:SID","username","password");
            stmt = conn.createStatement();
            conn.setAutoCommit(false);
            String dbDir = "LOB_DIR";
            String targetDir = "C:\\";
            String fileName = "a.zip";
            System.out.println("Adding BFILE to db...");
            addBfile(stmt,dbDir, fileName);
            System.out.println("Retrieving BFILE from db...");
            retrieveBfile(stmt,targetDir,fileName);
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        finally{
            try{
                stmt.close();
                conn.close();
            }
            catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
    
    private static void addBfile(
            Statement stmt, 
            String directory,
            String fileName){
        String sqlInsert = "INSERT INTO bfile_content VALUES('"+fileName+"', bfilename('"+directory+"','"+fileName+"'))";
        System.out.println(sqlInsert);
        
        try{
            stmt.executeUpdate(sqlInsert);
            stmt.execute("COMMIT");
            System.out.println("Added pointer to file"+ fileName+" to BFILE in DB Directory "+directory+"\n");
        }
        catch(SQLException e){
            System.out.println("Error Code: "+e.getErrorCode());
            System.out.println("Error Message: "+e.getMessage());
            e.printStackTrace();
        }
        
      }
    
    private static void retrieveBfile(
            Statement stmt,
            String targetDir,
            String fileName){
        String sqlSelect = "SELECT bfile_column FROM bfile_content WHERE file_name='"+fileName+"'";
        ResultSet bfileRS = null;
        try{
            //step1: retrieve the row containing BFILE locator
            bfileRS = stmt.executeQuery(sqlSelect);
            bfileRS.next();
            System.out.println(sqlSelect);
            
            //step2: create a BFILE obj and read the locator
            BFILE myBfile = ((OracleResultSet) bfileRS).getBFILE("bfile_column");
            
            //step3: get the file name from BFILE obj
            String bfileName = myBfile.getName();

            //step4: check the external file exists
            myBfile.fileExists();

            //step5: open the external file
            myBfile.openFile();

            //step6: create an input stream to read the external file
            InputStream in = myBfile.getBinaryStream();
            
            //step7: save the file contents to a new file
            String saveFileName = targetDir+"retrievedBFILE"+bfileName;
            saveFile(in, saveFileName);

            //step8: close the input stream
            in.close();
            myBfile.closeFile();
            
            System.out.println("Retrieved BFILE and saved to "+saveFileName);
        }
        catch(SQLException e){
            System.out.println("Error code = "+e.getErrorCode());
            System.out.println("Error message = "+e.getMessage());
            e.printStackTrace();
        }
        catch(IOException e){
            System.out.println("Error message = "+e.getMessage());
            e.printStackTrace();
        }
    }
    
    private static void saveFile(
            InputStream in, 
            String saveFileName){
        try{
            File file = new File(saveFileName);
            FileOutputStream out = new FileOutputStream(file);
            byte[] byteBuffer = new byte[8132];
            int bytesRead;            
            while((bytesRead = in.read(byteBuffer)) != -1){
                out.write(byteBuffer);
            }            
            out.close();
        }
        catch(IOException e){
            e.printStackTrace();
        }
    
    }
}
分享到:
评论

相关推荐

    jdbc连接及数据库操作

    ### JDBC连接及数据库操作 #### 一、JDBC概述与连接方式 JDBC(Java Database Connectivity)是Java中用于操作数据库的标准API,它提供了一种规范来访问各种类型的数据库,如Oracle、MySQL、SQL Server等。JDBC...

    jdbcoracle(文件上传)

    这里我们关注的是`jdbcoracle(文件上传)`,这很可能是指使用JDBC(Java Database Connectivity)来操作Oracle数据库,并实现文件上传的功能。以下是对这个主题的详细阐述: JDBC是Java编程语言中用于与各种类型...

    JDBC 书籍 学习

    BFILE、BLOB、CLOB 等大对象类型的数据通常以引用形式存储在 byte[] 缓存中,每个引用占用大约 4K 的空间。 #### 三、案例分析 以一个简单的表 `TAB` 为例,其定义为 `CREATE TABLE TAB (ID NUMBER(10), NAME ...

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

    BFILE允许存储在操作系统文件系统上的大型二进制文件,而CLOB和NCLOB则用于存储大量文本数据。Oracle提供了PL/SQL过程和函数来读取、写入和管理这些大数据对象,确保高效的数据操作。 MySQL,作为开源数据库系统,...

    spring blob相关

    在Spring框架中操作Oracle数据库中的BLOB字段,我们需要了解一些关键概念和步骤。 首先,理解BLOB类型。BLOB是一种用于存储大量二进制数据的数据类型,它可以容纳从几KB到4GB不等的数据。在Oracle中,BFILE和CLOB也...

    java sqlserver text 类型字段读取方法

    关键在于正确地处理大数据量的文本,以及确保在操作文件流时的异常处理和资源管理。需要注意的是,SQL Server在较新的版本中已经不再推荐使用`text`类型,而是建议使用`varchar(max)`或`nvarchar(max)`来替代。

    基于Java与Oracle数据库的图像处理技术.pdf

    同时,通过JDBC,可以将处理后的图像数据存储到Oracle数据库的BLOB字段,或者从数据库中检索图像数据并显示出来。 文章中可能还涉及了如何使用PreparedStatement进行参数化查询,以提高性能和防止SQL注入。此外,还...

    Struts2 Hibernate存取Oracle数据库中的BLOB数据.pdf

    Hibernate是一个开源的对象关系映射(ORM)框架,它对JDBC进行了封装,让Java开发者能够以面向对象的方式操作关系数据库。Hibernate的主要特性包括: 1. 轻量级封装:Hibernate封装了JDBC的复杂性,使得开发者能够...

    Oracle中CLOB类型文字处理代码

    可能包括了JSP、Servlet或Java后端代码,演示如何在Web应用中与Oracle数据库中的CLOB字段交互,如通过JDBC连接进行CRUD操作。 8. 注意事项: - 管理CLOB数据时要考虑性能,大量读写可能影响效率。 - 避免一次性...

    数据库读入、读出图片资料

    例如,在MySQL中,可以使用`BLOB`或`MEDIUMBLOB`,在SQL Server中,有`VARBINARY(MAX)`,在Oracle中则是`BFILE`或`RAW`。 2. **图片上传**: 当用户上传图片时,我们需要将图片文件转换为字节流,然后保存到数据库...

    mysql,sqlserver,oracle三种数据库的大对象存取解析.docx

    当需要在MySQL中存取大对象时,可以通过Java的JDBC API来操作。例如,使用PreparedStatement的setBinaryStream方法将文件流写入BLOB字段,然后通过getBinaryStream读取。在存取大对象前,可能需要调整MySQL的配置...

    Android/Ios上传图片头像或是文件到数据库

    例如,在Java中,使用JDBC进行如下操作: ```java PreparedStatement pstmt = connection.prepareStatement("INSERT INTO files (id, filename, content) VALUES (?, ?, ?)"); pstmt.setString(1, fileId); pstmt....

    java调用oracle存储过程(游标)相关

    获取`ResultSet`后,可以使用`ResultSet.next()`遍历每一行,然后通过`ResultSet.getXXX()`获取字段值。 6. **关闭资源**: 完成数据处理后,记得关闭`ResultSet`、`CallableStatement`和`Connection`,以释放...

    文件的上传下载.rar

    为了提高性能,可以使用流式处理减少内存占用,使用数据库连接池管理数据库连接,以及启用Oracle的BFILE或NCLOB特性,让文件存储在文件系统中而非数据库内部,降低数据库的压力。 8. 故障恢复: 在设计系统时,...

    Oracle数据库实现BBS

    "建表SQL语句.txt"文件应该包含了创建这些表的SQL命令,包括定义字段类型、主键、外键等,以保证数据的一致性和完整性。 JSP(Java Server Pages)是用于动态网页开发的Java技术,它与Oracle数据库结合,可以实现...

    Manipulating Large Objects

    LOB 字段由两部分组成:一个 LOB 定位器和实际的 LOB 值。定位器是指向 LOB 值的指针,而 LOB 值本身则包含实际的数据内容。 - **LOB 定位器**:它是一个指针,指向 LOB 值的实际位置。 - **LOB 值**:这是存储实际...

    oracle 错误合集

    **ORA-17102**:BFILE 为只读错误,通常是因为 BFILE 对象被设置为只读。 **ORA-17103**:通过 getConnection 创建 Java Connection 错误,可能是因为 getConnection 方法使用不当。 **ORA-17104**:执行的 SQL ...

    数据库迁移及区别比较(Oracle,Sql Server,MySql).docx

    5. **数据库连接和驱动**:更换数据库连接字符串和驱动,例如,从SQL Server的JDBC驱动切换到MySQL的JDBC驱动。 接下来,我们对比分析Oracle、SQL Server和MySQL在开发中的差异: 1. **数据类型**:Oracle支持更多...

Global site tag (gtag.js) - Google Analytics