对于数据库是BLOB类型存储数据。

BLOB数据插入:

Oracle提供的标准方式: 先插入一个空BLOB对象,然后Update这个空对象。

首先使用empty_blob()函数插入一个空BLOB对象。

然后重新查询BLOB,使用for update锁字段,注意关闭连接和回滚或提交。

ResultSet 获取 BLOB对象。

BLOB.setByte(byte);  //这个无效,数据存不进去,不能用

或者 OutputStream os = blob.setBinaryStream(0); // 0设置起始位置

blob.getOutputStream();  //已经deprecated

ResultSet 和 Statement  会在连接关闭时自动关闭,因此无需自己关闭。

  1. /**
  2. * 保存附件Blob
  3. * @param attachId
  4. * @throws SQLException
  5. */
  6. private void setAttachBlob(long attachId, String fileData) throws SQLException {
  7. logger.debug(">>>setAttachBlob(long attachId)");
  8. StringBuilder sql = new StringBuilder();
  9. sql.append(" select file_data fileData from test_attach where attach_id=" + attachId + " for update");
  10. Connection connection = null;
  11. try {
  12. byte[] byteStream = Base64.decodeBase64(fileData.getBytes("UTF-8"));
  13. connection = super.getDbHelper().getConnection();
  14. connection.setAutoCommit(false);

ResultSet rs = connection.prepareStatement(sql.toString())
.executeQuery();
if (rs.next()) {
BLOB blob = (BLOB) rs.getBlob("fileBody");
OutputStream os = blob.setBinaryStream(0);
ByteArrayInputStream is = new ByteArrayInputStream(byteStream);
byte[] byteData = new byte[512];
int len = 0;
try {
while((len = is.read(byteData, 0 , 512)) != -1) {
os.write(byteData, 0, len);
}
os.flush();
} catch (IOException e) {
logger.error("file read write error.", e);
} finally {
if(is != null) {
is.close();
}
if(os != null) {
os.close();
}
}
}

  1. connection.commit();
  2. } catch (UnsupportedEncodingException e) {
  3. logger.error("decode error file get byte...", e);
  4. e.printStackTrace();
  5. } catch (DbException e) {
  6. connection.rollback();
  7. logger.error("blob save error...", e);
  8. }finally {
  9. // 关闭连接
  10. if(connection != null && !connection.isClosed()) {
  11. connection.close();
  12. }
  13. }
  14. logger.debug("<<<setAttachBlob(long attachId)");
  15. }

获取BLOB比较简单:

  1. ResultSet rs = st.executeQuery( "select file_data from test_attach where attach_id=103 ");
  2.  
  3. if (rs.next()) {
  4.  
  5. java.sql.Blob blob = rs.getBlob("file_data ");
  6.  
  7. InputStream ins = blob.getBinaryStream();

BLOB 操作的更多相关文章

  1. 支持BLOB操作的Jena框架扩展——JenaBLOB

    与研究语义网的同行们分享一下上半年做的一个东西,它是支持BLOB操作的Jena框架扩展--JenaBLOB,已在GitHub上开源,欢迎提出宝贵意见! 众所周知,Jena是不支持BLOB类型的Lite ...

  2. python blob操作

    最近在学习使用Python,操作Oracle数据库采用的是cx_Oracle模块. 对于基本字段,都可以正常操作.但是对于Blob字段,我试试好几次,都没成功.下面贴出测试代码,与大家讨论讨论. 这是 ...

  3. js 点击默认另存 ,不是打开 Blob 操作

    function savepic(obj) { if (memFileObj != undefined) { obj = memFileObj; } else { memFileObj = obj; ...

  4. [oracle] Oracle存储过程里操作BLOB的字节数据的办法,例如写入32位整数

    作者: zyl910 一.缘由 BLOB是指二进制大对象,也就是英文Binary Large Object的缩写. 在很多时候,我们是通过其他编程语言(如Java)访问BLOB的字节数据,进行字节级的 ...

  5. 怎么对MySQL数据库操作大数据?这里有思路

    最近学到一招关于使用java代码操作MySQL数据库,对大文本数据(LOB)进行CRUD的技巧,虽然向数据库很少向中存入大文本文件(一般都是存储在硬盘上),但是还是很有必要知道这一技巧的.下面我就来说 ...

  6. Azure系列2.1 —— com.microsoft.azure.storage.blob

    网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...

  7. java读取blob全身乱码

    一.BLOB操作 .入库 ()JDBC方式 //通过JDBC获得数据库连接 Class.forName("oracle.jdbc.driver.OracleDriver"); Co ...

  8. JDBC处理CLOB 和 BLOB大对象

    在数据库中: clob用于存储大量的文本数据 可以使用字符流操作 clob用于存储大量的二进制数据 可以使用字节流操作 以mysql为例 先准备一张表: CREATE TABLE `t_user2` ...

  9. Azure Blob (三)参数设置说明

    一,引言 上一篇将 Azure Blob 存储的时候,有使用到一个 .NET  Core Web 项目,通过代码的方式进行操作 Azure Blob 的数据,接着上一篇的内容,今天继续看一下代码,具体 ...

随机推荐

  1. citus 多租户应用开发(来自官方文档)

      citus 官方文档很不错,资料很全,同时包含一个多租户应用的文档,所以运行下,方便学习 环境准备 使用docker-compose 运行,同时集成了graphql 引擎,很方便 docker-c ...

  2. c#数据库訪问返回值类型为SqlDataReader时使用using时注意的问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010512579/article/details/24011761 在封装通用 SQLSERVER ...

  3. 升级CentOS 7.4内核版本的三种方案

    https://blog.csdn.net/breeze915/article/details/79243673 在实验环境下,已安装了最新的CentOS 7.4操作系统,现在需要升级内核版本. 实验 ...

  4. npm bower gulp

    npm即nodejs package manager ,是nodeJs的包管理工具,使用前需安装nodeJs(https://www.npmjs.com.cn/getting-started/inst ...

  5. 【转】每天一个linux命令(42):kill命令

    原文网址:http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html Linux中的kill命令用来终止指定的进程(terminate a ...

  6. tomcat和servlet关系

    https://blog.csdn.net/weixin_30531261/article/details/78574410 图不错:https://www.cnblogs.com/fengli999 ...

  7. 后台取IE的相关信息

    HttpBrowserCapabilities b = Request.Browser; Response.Write("浏览器名称和版本号:" + b.Type + " ...

  8. POJ1325机器重启次数——二分图匈牙利算法模板

    题目:http://poj.org/problem?id=1325 求最小点覆盖.输出最大匹配数就行,结果略复杂地弄了. 注意由题可知 可以直接把与0有关的边删掉.不过亲测不删0而计数时不计0就会WA ...

  9. vscode美化方法以及定制主题插件

    首先是学会调整字体和字体大小 换成你看着舒服的字体和字体大小,当然,通常情况下默认的就很好看,但每个人的显示屏参数不同显示起来的效果因人而异,如果你有更好的方案不妨设置一下 下面展示我的浅色主题和深色 ...

  10. Linux下的一些名词解释

    libffi (以下E文摘自http://www.sourceware.org/libffi/) A Portable Foreign Function Interface Library. Comp ...