java读写oracle的blob字段示例

 更新时间:2014年02月26日 10:25:27   作者:  
这篇文章主要介绍了java读写oracle的blob字段示例,需要的朋友可以参考下

复制代码 代码如下:

package com.wanmei.meishu;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
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 java.sql.SQLException;
import java.util.Properties;

import oracle.sql.BLOB;

public class BlobUtil {

 private static BlobUtil bu;
 private String env;
 public static BlobUtil getInstance(String env) {
  bu = new BlobUtil();
  bu.env = env;
  return bu;
 }

 /**
  * <p>得到数据库链接</p>
  * @return
  * @throws Exception
  */
 private Connection getConnection() throws Exception {
  String driver = "oracle.jdbc.driver.OracleDriver";
  Class.forName(driver);
  String env = this.env;
  Properties pro = new Properties();
  // 读取classes 目录下的配置文件  
  pro.load(new FileReader(Class.class.getResource("/config.properties").getFile()));
  String host = pro.getProperty(env + ".host");
  String database = pro.getProperty(env + ".database");
  String username = pro.getProperty(env + ".username");
  String password = pro.getProperty(env + ".password");
  String port = pro.getProperty(env + ".port");
  String url = "jdbc:oracle:thin:@" + host + ":" + port +":" + database;
  return DriverManager.getConnection(url, username, password);
 }

 /**
  * <p>传入项目,任务,附件名称,文件路径,写入数据库</p>
  * @param projectId
  * @param taskId
  * @param fileName
  * @param file
  * @return 返回是否成功
  */
 public boolean write(String projectId, String taskId, String fileName, String file) {
  Connection conn = null;
  ResultSet rs = null;
  PreparedStatement ps = null;
  BLOB blob = null;
  boolean flag = false;
  try {
   conn = getConnection();
   conn.setAutoCommit(false);

   String sql = "INSERT INTO PS_ZP_PRJ_WBS_BLOB BLB(ZP_PRJ_ID, ZZ_SEQ_NUM, ZZ_FILE_NAME, ZZ_IMAGE_BLOB) VALUES(?, ? ,? ,empty_blob())";
   ps = conn.prepareStatement(sql);
   ps.setString(1, projectId);
   ps.setString(2, taskId);
   ps.setString(3, fileName);
   ps.executeUpdate();
   sql = "SELECT ZZ_IMAGE_BLOB FROM PS_ZP_PRJ_WBS_BLOB WHERE ZP_PRJ_ID = ? AND ZZ_SEQ_NUM = ? AND ZZ_FILE_NAME = ? FOR UPDATE";
   ps = conn.prepareStatement(sql);
   ps.setString(1, projectId);
   ps.setString(2, taskId);
   ps.setString(3, fileName);
   rs = ps.executeQuery();
   if(rs.next()) {
    blob = (BLOB) rs.getBlob(1);
   }
   InputStream in = new FileInputStream(file);
   OutputStream out = blob.setBinaryStream(1L);
   byte[] buffer = new byte[1024];
   int length = -1;
            while ((length = in.read(buffer)) != -1){
                out.write(buffer, 0, length);
            }
            in.close();
            out.close();
            conn.commit();
            conn.setAutoCommit(true);
            flag = true; 
  }
  catch(Exception e) {
   if(conn != null) {
    try {
     conn.rollback();
    } catch (SQLException e1) {
     e1.printStackTrace();
    }
   }
  }
  finally {
   try {
    rs.close();
    ps.close();
    conn.close();
   }
   catch(Exception e) {
    e.printStackTrace();
   }
  }
  return flag;
 }

 /**
  * <p>根据项目Id,任务Id,文件名读取数据库blob字段文件,写入指定的文件路径</p>
  * @param projectId
  * @param taskId
  * @param fileName
  * @param file
  * @return 返回是否成功
  */
 public boolean read(String projectId, String taskId, String fileName, String file) {
  Connection conn = null;
  ResultSet rs = null;
  PreparedStatement ps = null;
  BLOB blob = null;
  boolean flag = false;
  try {
   conn = getConnection();
   String sql = "SELECT ZZ_IMAGE_BLOB FROM PS_ZP_PRJ_WBS_BLOB WHERE ZP_PRJ_ID = ? AND ZZ_SEQ_NUM = ? AND ZZ_FILE_NAME = ?";
   ps = conn.prepareStatement(sql);
   ps.setString(1, projectId);
   ps.setString(2, taskId);
   ps.setString(3, fileName);
   rs = ps.executeQuery();
   if(rs.next()) {
    blob = (BLOB) rs.getBlob(1);
   }
   InputStream in = blob.getBinaryStream();
   byte[] buf = new byte[1024];
   int bytesIn = 0;
   FileOutputStream out = new FileOutputStream(file);
   while ((bytesIn = in.read(buf, 0, 1024)) != -1) {
    out.write(buf, 0, bytesIn);
   }
            in.close();
            out.close();
            flag = true;
  }
  catch(Exception e) {
   e.printStackTrace();
  }
  finally {
   try {
    rs.close();
    ps.close();
    conn.close();
   }
   catch(Exception e) {
    e.printStackTrace();
   }
  }
  return flag;
 }

 public static void main(String[] args) {
  BlobUtil bu = BlobUtil.getInstance("MSDEV");
  System.out.println(bu.write("CB", "001", "image1", "D:\\61e44b02jw1dw4xbp2zo6j.jpg"));
  System.out.println(bu.read("CB", "001", "image1", "D:\\2.jpg"));
 }

}

相关文章

  • Java线程等待唤醒几种方法小结

    Java线程等待唤醒几种方法小结

    线程等待和唤醒有三种实现方法,分别是Object类中的wait、notify,Condition类中的await、signal,LockSupport类中的park、unpark方法,感兴趣的可以了解一下
    2023-10-10
  • java中对象转json字符串的三种常用方式

    java中对象转json字符串的三种常用方式

    本文主要介绍了java中对象转json字符串的三种常用方式,包含Jackson库,Gson库和Hutool工具类这三种,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • SpringBoot初始化加载配置的八种方式总结

    SpringBoot初始化加载配置的八种方式总结

    在日常开发时,我们常常需要 在SpringBoot应用启动时执行某一段逻辑,如获取一些当前环境的配置或变量、向数据库写入一些初始数据或者连接某些第三方系统,确认对方可以工作,那么在实现初始化逻辑代码时就需要小心了,所以本文介绍了SpringBoot初始化加载配置的方式
    2024-12-12
  • SpringBoot实现自定义Redis的连接的流程步骤

    SpringBoot实现自定义Redis的连接的流程步骤

    Spring Boot 自定义 Redis 主要是指在基于 Spring Boot 的应用程序中,当你需要更深入地控制或扩展对 Redis 数据库的操作,而不是仅仅依赖 Spring Data Redis 的默认配置,本文给大家介绍了SpringBoot实现自定义Redis的连接的流程步骤,需要的朋友可以参考下
    2024-09-09
  • 记录一个使用Spring Data JPA设置默认值的问题

    记录一个使用Spring Data JPA设置默认值的问题

    这篇文章主要介绍了使用Spring Data JPA设置默认值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java调用微信客服消息实现发货通知的方法详解

    Java调用微信客服消息实现发货通知的方法详解

    这篇文章主要介绍了Java调用微信客服消息实现发货通知的方法,结合实例形式详细分析了java针对微信接口调用的原理、调用方法与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • java的各种集合为什么不安全(List、Set、Map)以及代替方案

    java的各种集合为什么不安全(List、Set、Map)以及代替方案

    这篇文章主要介绍了java的各种集合为什么不安全(List、Set、Map)以及代替方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java使用Tess4J实现图像识别方式

    Java使用Tess4J实现图像识别方式

    这篇文章主要介绍了Java使用Tess4J实现图像识别方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 基于spring @Cacheable 注解的spel表达式解析执行逻辑

    基于spring @Cacheable 注解的spel表达式解析执行逻辑

    这篇文章主要介绍了spring @Cacheable 注解的spel表达式解析执行逻辑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java调用明华RF读写器DLL文件过程解析

    Java调用明华RF读写器DLL文件过程解析

    这篇文章主要介绍了Java调用明华RF读写器DLL文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论