java对oracle中blob字段的操作

来源:互联网 发布:淘宝怎么自定义尺码 编辑:程序博客网 时间:2024/05/16 09:17

    写这篇博客之前,我写了关于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();
 }
}

原创粉丝点击