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(Java Database Connectivity)是Java中用于操作数据库的标准API,它提供了一种规范来访问各种类型的数据库,如Oracle、MySQL、SQL Server等。JDBC...
这里我们关注的是`jdbcoracle(文件上传)`,这很可能是指使用JDBC(Java Database Connectivity)来操作Oracle数据库,并实现文件上传的功能。以下是对这个主题的详细阐述: JDBC是Java编程语言中用于与各种类型...
BFILE、BLOB、CLOB 等大对象类型的数据通常以引用形式存储在 byte[] 缓存中,每个引用占用大约 4K 的空间。 #### 三、案例分析 以一个简单的表 `TAB` 为例,其定义为 `CREATE TABLE TAB (ID NUMBER(10), NAME ...
BFILE允许存储在操作系统文件系统上的大型二进制文件,而CLOB和NCLOB则用于存储大量文本数据。Oracle提供了PL/SQL过程和函数来读取、写入和管理这些大数据对象,确保高效的数据操作。 MySQL,作为开源数据库系统,...
在Spring框架中操作Oracle数据库中的BLOB字段,我们需要了解一些关键概念和步骤。 首先,理解BLOB类型。BLOB是一种用于存储大量二进制数据的数据类型,它可以容纳从几KB到4GB不等的数据。在Oracle中,BFILE和CLOB也...
关键在于正确地处理大数据量的文本,以及确保在操作文件流时的异常处理和资源管理。需要注意的是,SQL Server在较新的版本中已经不再推荐使用`text`类型,而是建议使用`varchar(max)`或`nvarchar(max)`来替代。
同时,通过JDBC,可以将处理后的图像数据存储到Oracle数据库的BLOB字段,或者从数据库中检索图像数据并显示出来。 文章中可能还涉及了如何使用PreparedStatement进行参数化查询,以提高性能和防止SQL注入。此外,还...
Hibernate是一个开源的对象关系映射(ORM)框架,它对JDBC进行了封装,让Java开发者能够以面向对象的方式操作关系数据库。Hibernate的主要特性包括: 1. 轻量级封装:Hibernate封装了JDBC的复杂性,使得开发者能够...
可能包括了JSP、Servlet或Java后端代码,演示如何在Web应用中与Oracle数据库中的CLOB字段交互,如通过JDBC连接进行CRUD操作。 8. 注意事项: - 管理CLOB数据时要考虑性能,大量读写可能影响效率。 - 避免一次性...
例如,在MySQL中,可以使用`BLOB`或`MEDIUMBLOB`,在SQL Server中,有`VARBINARY(MAX)`,在Oracle中则是`BFILE`或`RAW`。 2. **图片上传**: 当用户上传图片时,我们需要将图片文件转换为字节流,然后保存到数据库...
当需要在MySQL中存取大对象时,可以通过Java的JDBC API来操作。例如,使用PreparedStatement的setBinaryStream方法将文件流写入BLOB字段,然后通过getBinaryStream读取。在存取大对象前,可能需要调整MySQL的配置...
例如,在Java中,使用JDBC进行如下操作: ```java PreparedStatement pstmt = connection.prepareStatement("INSERT INTO files (id, filename, content) VALUES (?, ?, ?)"); pstmt.setString(1, fileId); pstmt....
获取`ResultSet`后,可以使用`ResultSet.next()`遍历每一行,然后通过`ResultSet.getXXX()`获取字段值。 6. **关闭资源**: 完成数据处理后,记得关闭`ResultSet`、`CallableStatement`和`Connection`,以释放...
为了提高性能,可以使用流式处理减少内存占用,使用数据库连接池管理数据库连接,以及启用Oracle的BFILE或NCLOB特性,让文件存储在文件系统中而非数据库内部,降低数据库的压力。 8. 故障恢复: 在设计系统时,...
"建表SQL语句.txt"文件应该包含了创建这些表的SQL命令,包括定义字段类型、主键、外键等,以保证数据的一致性和完整性。 JSP(Java Server Pages)是用于动态网页开发的Java技术,它与Oracle数据库结合,可以实现...
LOB 字段由两部分组成:一个 LOB 定位器和实际的 LOB 值。定位器是指向 LOB 值的指针,而 LOB 值本身则包含实际的数据内容。 - **LOB 定位器**:它是一个指针,指向 LOB 值的实际位置。 - **LOB 值**:这是存储实际...
**ORA-17102**:BFILE 为只读错误,通常是因为 BFILE 对象被设置为只读。 **ORA-17103**:通过 getConnection 创建 Java Connection 错误,可能是因为 getConnection 方法使用不当。 **ORA-17104**:执行的 SQL ...
5. **数据库连接和驱动**:更换数据库连接字符串和驱动,例如,从SQL Server的JDBC驱动切换到MySQL的JDBC驱动。 接下来,我们对比分析Oracle、SQL Server和MySQL在开发中的差异: 1. **数据类型**:Oracle支持更多...