java读写oracle的blob字段示例_java

复制代码 代码如下:

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"));
 }

}

时间: 2024-11-26 02:31:33

java读写oracle的blob字段示例_java的相关文章

如何在oracle的blob字段里保存多个文件

Oracle的BLOB字段类型可以用来保存长2进制数据.但是通常读写BLOB字段数据的代码都是很罗嗦,非细心编码很容易出错.我把这个功能集成到我的OCI包装库(ORADBI)中.下面的例子就是演示如何使用ORADBI把多个文件按保存到一个字段里. 我在另外的例子中将演示如何把BLOB字段中的数据还原为文件. 整个ORADBI是我在OCI基础上写的C语言API.从创作这个API到一直不断的更新维护,已经有1年多了.我也将一直维护下去,不断完善和添加新的功能.ORADBI是完全免费和完全开源的,使用

java把字符串存入blob字段

问题描述 java把字符串存入blob字段 java把字符串存入blob字段怎么存?怎么取出来................ 解决方案 你存的是文本还是二进制文件? 解决方案二: 取为String类型数据 解决方案三: JAVA 取 数据库里Blob字段值为字符串的方法 解决方案四: 机器人给了你一个方法..你也可以试试这种 create table test(id blob) select cast(id as char) from test 解决方案五: 取出的二进制数据放入数组中再对其进

VB.Net在向ORACLE存储BLOb字段时,系统内存占用很大如何分块存储

问题描述 我使用的是VS2003的VB.Net在向ORACLE存储BLOb字段时,系统内存占用很大有100多兆,我存储的文件大小为30M,代码如下:那位高手能否知道如果分块存储(每次存储10240个字节,然后循环存储)的话内存就是马上降下来,请高手指点PublicSubinsertBidDoc(ByValvTmpFileAsString,ByValvPrjNoAsString,ByValvSprNoAsString,ByValvSprNameAsString)DimoCnOraAsNewOrac

h2数据库文件写入oracle的blob字段,再从blob字段读取出来,重新生成h2.db文件

问题描述 h2数据库h2.db文件写入oracle的blob字段,再从blob字段读取出来,重新生成h2.db文件之后,用jdbc访问这个重新生成h2.db文件,会报表不存在的错误,无法操作h2. 请问大概是什么原因? 解决方案 你可以按以下依次排查:1.h2.db数据库文件本身是否完整?2.存入oracle是以二进制的数据存进去的,存入取出之间对数据文件是否有完整.像你这样可以完整报表不存在的错误,我觉得跟数据库存储是没有关系的.

在JDBC中,setBinaryStream()方法给oracle的BLOB字段插值时报错

问题描述 报错:仅能绑定要插入LONG列的LONG值我是通过JDBC的方式从Oracle获取表数据,并通过WebService方式传输,然后别的应用获取后,插入到别的数据库.从Oracle获取BLOB字段时是通过getBinaryStream()获取的,传输后,在另外的应用中冶获得了该值,但通过setBinaryStram()插入时,如果获取的BLOB字段的内容太大(我存放的是图片),则会报上述错误,如果内容不大,则可以成功插入.ps:试过setByte()方式插入,但也包上述错误.与setBi

如何读取Oracle的BLOB字段里的文件

使用ORADBI读取存储在BLOB字段里的多个文件,并还原到指定的路径下. 下面是完整的代码: // // read_blobfile.c - 读BLOBFILE的例子 // cheungmine@gmail.com// // 内存泄漏检测 // 在需要检测的地方放置语句: // _CrtDumpMemoryLeaks(); // 以下3句的次序不能改变 #define _CRTDBG_MAP_ALLOC #include<stdlib.h> #include<crtdbg.h>

java压缩文件和下载图片示例_java

本文实例为大家分享了java压缩文件和下载图片示例,供大家参考,具体内容如下 主页面index.xml <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>项目的主页</title> </head> <body> <h2>主页

java连接Oracle数据库的方法解析_java

Oracle数据库先创建一个表和添加一些数据 1.先在Oracle数据库中创建一个student表: create table student ( id number(11) not null primary key, stu_name varchar(16) not null, gender number(11) default null, age number(11) default null, address varchar(128) default null ); 2.向表中增添一些数据

java读取图像文件存入oracle中blob字段源代码

数据库:oracle 10G XE 数据源驱动:jdbc12.jar 文件名:WriteBlob 数据库中建立一个为clobtest的表,内有两个字段,name (varchar2(20)),content(blob). 1package dbdriver; 2 3/** *//** 4 * 2008-09-28 5 * @author duduli 6 * email: lxyzj2000@gmail.com 7 */ 8import java.sql.*; 9import java.io.*