往数据库里存图片BLOB大字段出错
我在网上找的存图片的程序,但是一直报错如下:
Exception in thread "main" java.lang.UnsupportedOperationException
at sun.jdbc.odbc.JdbcOdbcResultSet.getBlob(Unknown Source)
at blob.OracelBlobTest.writeBlob(OracelBlobTest.java:90)
at blob.OracelBlobTest.main(OracelBlobTest.java:154)
这个语句有错误: blob = (BLOB)rst.getBlob(1);
求达人帮忙~~~
程序如下:
package blob;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.sql.BLOB;
/**
* 总结:
* 1.JDBC的API:java.sql.Blob接口,只提供了BLOB的读取方法,没有提供写入的方法。
* 2.ORACEL的API:oracle.sql.BLOB是一个类,它实现了java.sql.Blob接口,并且提供了向BLOB中写入数据的方法
* 3.在向数据库中插入BLOB时,只能用ORACEL提供的API:oracel.sql.BLOB
* 写入的步骤:1>插入一条记录,其中BLOB字段用oracle的空函数:empty_blob()代替。
* 2>以加锁的方式读取刚插入的记录,
* 3>利用oracle的oracle.sql.BLOB的getBinaryOutputStream()方法获取BLOB字段的输出流,向流中写入数据
* 4>用被写入的BLOB数据,更新原记录
* 4.在从数据库中读取BLOB时,既可以使用java.sql.Blob,也可以使用oracel.sql.BLOB
* 读取的步骤:1>读取记录,获取BLOB字段的输入流,
* 2>读取输入流中的数据,保存到一个地方。
*/
public class OracelBlobTest {
private Connection conn;
private final String DB_URL = "jdbc:odbc:oracle";
private final String DB_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
private final String DB_USER= "system";
private final String DB_PASS= "123456";
/**
* 获取数据库连接
*/
private void initConnection() throws Exception {
if(conn == null || conn.isClosed()){
Class.forName(DB_DRIVER);
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
conn.setAutoCommit(false);
}
}
private void closeConnection(ResultSet rst, PreparedStatement psmt, Connection conn) throws Exception {
if(rst != null){
rst.close();
}
if(psmt != null){
psmt.close();
}
if(conn != null){
conn.close();
}
}
public OracelBlobTest() {
try {
initConnection();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将指定文件写入到数据库中去。
* 注意:因为JDBC中的API没有提供写入BLOB的方法,所以这里用到了oracle的API:oracle.sql.BLOB;它实现了接口:java.sql.Blob,同时提供了写入BLOB的方法。
* 这里不能用java.sql.Blob
*/
@SuppressWarnings("deprecation")
public void writeBlob(String file) throws Exception {
// 1.插入一条记录,其中blob字段用空函数代替
// 2.以加锁的方式读取该记录
// 3.向blob字段写数据,并执行更新操作。
// 4.提交事务,关闭资源
// 1.
String sql = "insert into MYTABLE (ID, PIC) values (?, empty_blob())";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1, "200921090149");
psmt.executeUpdate();
// 2.
BLOB blob = null;
OutputStream os = null;
InputStream is = new FileInputStream(file);
sql = "select PIC from MYTABLE where ID = ? for update";
psmt =