许久没有分享代码了,把这段时间写的一个Java操作Blob字段,有日子没写Java了,就当作笔记记录一下。
1. [代码][Java]代码     跳至 [1] [全屏预览]
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;http://www.huiyi8.com/webyuanma/​
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 读写Oracle Blob字段的更多相关文章

  1. odp.net 读写oracle blob字段

    DEVELOPER: ODP.NET Serving Winning LOBs: http://www.oracle.com/technetwork/issue-archive/2005/05-nov ...

  2. Java实现下载BLOB字段中的文件

    概述 web项目的文件下载实现:servlet接收请求,spring工具类访问数据库及简化大字段内容获取. 虽然文章的demo中是以sevlet为平台,想必在spring mvc中也有参考意义. 核心 ...

  3. Oracle Blob 字段的模糊查询

    原文地址:http://blog.csdn.net/springk/article/details/6866248

  4. Java实现打包下载BLOB字段中的文件

    概述 web项目的文件打包下载实现:servlet接收请求,spring工具类访问数据库及简化大字段内容获取,org.apache.tools.zip打包. 必要提醒:当前总结是继Java实现下载BL ...

  5. Java读取oracle数据库中blob字段数据文件保存到本地文件(转载)

    转自:https://www.cnblogs.com/forever2698/p/4747349.html package com.bo.test; import java.io.FileOutput ...

  6. Oracle数据库BLOB字段的存取

    述]     Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cur ...

  7. 分块读取Blob字段数据(Oracle)

    试过了MSSQL的分块读取Blob字段,又尝试在Oracle下完成,发现还是可行的. 首先建立一个存储过程: create or replace procedure PRO_GET_BLOB(     ...

  8. oracle 下操作blob字段是否会产生大量redo

    操作blob字段是否会产生大量redo,答案是不会.以下来做一个实验,測试数据库版本号是11.2.0.1.0: --创建一张表做測试之用 create table test_blob (   id n ...

  9. mybatis oracle BLOB类型字段保存与读取

    一.BLOB字段 BLOB是指二进制大对象也就是英文Binary Large Object的所写,而CLOB是指大字符对象也就是英文Character Large Object的所写.其中BLOB是用 ...

随机推荐

  1. msp430入门学习41

    msp430的其他九 msp430入门学习

  2. Python入门--4--分之和循环

    1.用ELIF比较省CPU: 第一种方法,使用if score = int(input('请输入你的分数:')) if (score <= 100) and (score >= 90): ...

  3. HUNAN 11560 Yangyang loves AC(二分+贪心)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11560&courseid=0 题意:总共有n天,每天 ...

  4. Spring Boot使用Schedule实现定时任务

    适用的工具是:Schedule 集成步骤: 1.开启Schedule支持 package com.jsoft.springboottest.springboottest1; import org.sp ...

  5. 使用SmartQQ实现的智能回复(Web QQ协议)

    采用SmartQQ SDK进行开发,官网:https://github.com/ScienJus/smartqq 此项目只是集成使用的方法,在com.jsoft.robot.SmartQQUse.Re ...

  6. ASP.NET Core 依赖注入(构造函数注入,属性注入等)

    原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入   构造函数注入 构造函数注 ...

  7. 【转】Code Your Own PHP MVC Framework in 1 Hour

      原文: https://www.codeproject.com/Articles/1080626/Code-Your-Own-PHP-MVC-Framework-in-Hour --------- ...

  8. iOS开发之创建颜色渐变视图View

    在iOS开发中有时需要自己自定义一个视图view的背景,而网上有人提出的在循环中不断alloc的方法设置其背景色渐变,会耗费很多内存和资源,极其不明智,而在CALayer中早就提供有图层渐变的类和相应 ...

  9. poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53414   Accepted: 18449 Desc ...

  10. [cocos2d-x]怎样降低cocos2d-x游戏的耗电量?

    Cocos2d-x游戏的耗电量一直是个让人头疼的问题,一个简单的三消游戏,玩一会手机就热得发烫,更郁闷的是电池消耗非常快.基本上两个小时就能够把电池耗光. 近期又看到一个帖子.有个老外用cocos2d ...