您的位置:首页 > 数据库 > Oracle

java对oracle中blob字段的操作

2008-08-27 15:52 411 查看
写这篇博客之前,我写了关于java操作oracle中clob类行的字段。今天我要写下java操作oracle中blob类型的字段。数据的表结构我如图片所示。里面标记了颜色就是重要的哦 ^_^

import java.io.File;
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.ResultSet;
import java.sql.Statement;
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.BLOB;

/**
* 本类是对oracle数据库进行增删改查操作
* @author LoongHua
*
*/
public class OperateBlobDao {

private Connection conn;

public static Connection getConnection(){
Connection conn=null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.6:1521:findata","system","123456");
} catch (Exception e) {
System.out.println("得到数据库连接发生异常");
e.printStackTrace();
}
return conn;
}

public OperateBlobDao(Connection conn){
this.conn=conn;
}

/**
* 想数据中插入一个2进制文章,如图片
* @param fileName 文件名
* @param filePath 文件路径
* @return 是否插入成功
*/
public boolean insert(String fileName, String filePath) {
if(conn==null){
return false;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
/*
* 插入所有的数据,插入BLOB字段的列是使用函数empty_blob(),这样系统会创建一个本地化的BLOB数据类型。
*/
query = "insert into aaa(id,name,photo) values (aaa_id.nextval,'"+fileName+"', empty_blob())";
stmt.executeUpdate(query);
/*
*得到刚才插入的记录
*/
query = "select * from aaa where id=(select max(id) from aaa)";
rs = stmt.executeQuery(query);
if (rs.next()) {
// 向BLOB类型变量里插入数据
BLOB blob = ((OracleResultSet)rs).getBLOB("photo");
os = blob.getBinaryOutputStream();
File f = new File(filePath);
is = new FileInputStream(f);
byte[] buffer = new byte[blob.getBufferSize()];
int bytesRead = 0;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.flush();
//清空blob类型
blob = null;
return true;
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(is != null) {
is.close();
}
if(os != null) {

os.close();
}
if(stmt != null) {
stmt.close();
}
if(rs != null) {
rs.close();
}
if(conn != null) {
conn.commit();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
return false;
}

/**
* 用指定的包含文件名的文件路径替换指定名称的文件
* @param fileName 文件名
* @param filePath 包含文件名的文件路径
* @return 是否成功,成功为true,否则为false
*/
public boolean update(String fileName, String filePath){
if(conn==null){
return false;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();

//记得这里一定要加上 for update 不然会报 blob未锁定错误
/*
* 当然也可以用别的方法更新,比如可以先设置photo字段为empty_blob()
* 然后在向blob插入新的数据,就象对clob操作那篇博客那样做也是可以的。
*/
query="select * from aaa where name='"+fileName+"' for update";
rs=stmt.executeQuery(query);
if(rs.next()){
BLOB blob = ((OracleResultSet) rs).getBLOB("photo");
File f = new File(filePath);
is = new FileInputStream(f);
byte[] buffer=new byte[blob.getBufferSize()];
os = blob.getBinaryOutputStream();
int bytesRead = 0;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer, 0, bytesRead);
}
os.flush();
blob=null;
return true;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}

/**
* 查询指定文件名的一张图片,如果存在则保存到本机的D盘下
* @param fileName 文件名
* @param filePath 包含文件名的文件路径
*/
public void select(String fileName,String filePath){
if(conn==null){
return ;
}
Statement stmt = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
query="select * from aaa where name='"+fileName+"'";
rs=stmt.executeQuery(query);
if(rs.next()){
BLOB blob = ((OracleResultSet) rs).getBLOB("photo");
File f = new File(filePath);
os = new FileOutputStream(f);
byte[] buffer=new byte[blob.getBufferSize()];
is = blob.getBinaryStream();
int bytesRead = 0;
while((bytesRead=is.read(buffer))!=-1){
os.write(buffer, 0, bytesRead);
}
os.flush();
blob=null;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.setAutoCommit(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 删除指定的文件名的文件
* @param fileName 指定的文件名
* @return 是否成功,成功为true,否则为false
*/
public boolean delete(String fileName){
if(conn==null){
return false;
}
Statement stmt = null;
String query = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();
query="delete from aaa where name='"+fileName+"'";
int row=stmt.executeUpdate(query);
if(row>0){
return true;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
if(stmt==null){
stmt.close();
}
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}

/**
* 关闭数据库
*/
public void close(){
try {
if(conn!=null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
Connection conn=getConnection();
OperateBlobDao obdao=new OperateBlobDao(conn);
// boolean flag=obdao.insert("123.JPG", "d:/123.JPG");
// if(flag){
// System.out.println("插入成功!");
// }

// obdao.select("123.JPG", "d:/123.JPG");

// boolean flag=obdao.delete("123.JPG");
// if(flag){
// System.out.println("删除成功!");
// }

boolean flag=obdao.update("xxgz.pdf", "d:/123.JPG");
if(flag){
System.out.println("更新成功!");
}
obdao.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: