java读写oracle的blob字段示例


在Java中,读写Oracle数据库的BLOB字段可以通过使用JDBC(Java Database Connectivity)来实现。下面是一个简单的示例,展示了如何使用`PreparedStatement`和`ResultSet`来插入和读取Oracle数据库中的BLOB数据。

### 插入BLOB数据

首先,我们需要准备数据库连接,然后创建一个`PreparedStatement`来插入BLOB数据。Oracle JDBC驱动提供了`oracle.sql.BLOB`类来操作BLOB数据。


import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import oracle.sql.BLOB;

public class OracleBlobInsertExample {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@localhost:1521:yourdb";
        String user = "yourusername";
        String password = "yourpassword";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             PreparedStatement pstmt = conn.prepareStatement("INSERT INTO your_table (id, blob_column) VALUES (?, ?)")) {

            // 假设你已经有了ID和文件路径
            int id = 1;
            String filePath = "/path/to/your/file.txt";

            try (InputStream is = new FileInputStream(filePath);
                 PreparedStatement blobPstmt = conn.prepareStatement("SELECT EMPTY_BLOB() FROM DUAL")) {

                BLOB blob = (BLOB) blobPstmt.getBlob(1);
                blob.open(BLOB.DB_WRITE);

                // 读取文件并写入BLOB
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = is.read(buffer)) != -1) {
                    blob.writeBytes(buffer, 0, bytesRead);
                }

                blob.close();

                // 设置BLOB到PreparedStatement
                pstmt.setInt(1, id);
                pstmt.setBlob(2, blob);
                pstmt.executeUpdate();

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

**注意**:上面的代码示例中,`EMPTY_BLOB()`函数用于生成一个空的BLOB对象,然后通过读取文件内容并写入到这个BLOB对象中。然而,这种直接写入BLOB对象的方式在某些Oracle JDBC驱动版本中可能不是最优的,因为`EMPTY_BLOB()`的使用可能会导致性能问题或不支持。更常见的做法是使用`PreparedStatement`的`setBinaryStream`方法来直接设置BLOB数据的输入流。

### 读取BLOB数据

读取BLOB数据通常涉及使用`ResultSet`的`getBlob`方法获取BLOB对象,然后使用`BLOB`类的`getBinaryStream`方法来读取BLOB数据的内容。


import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class OracleBlobReadExample {
    public static void main(String[] args) {
        String url = "jdbc:oracle:thin:@localhost:1521:yourdb";
        String user = "yourusername";
        String password = "yourpassword";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             PreparedStatement pstmt = conn.prepareStatement("SELECT blob_column FROM your_table WHERE id = ?")) {

            pstmt.setInt(1, 1); // 假设我们要查询ID为1的记录
            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                Blob blob = rs.getBlob("blob_column");
                try (OutputStream os = new FileOutputStream("/path/to/save/blob_as_file.txt")) {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    InputStream is = blob.getBinaryStream();
                    while ((bytesRead = is.read(buffer)) != -1) {
                        os.write(buffer, 0, bytesRead);
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上示例展示了如何在Java中插入和读取Oracle数据库中的BLOB字段。请确保您已经正确设置了数据库URL、用户名和密码,并根据实际情况调整表名和字段名。