有时候,我们需要将文件以二进制流的形式存入数据库中,比如oracle表中有一个字段为files,字段类型为blob。如果编写存储过程,传入blob参数或者文件的路径进行处理似乎有些难度,处理起来也麻烦。由于项目使用到了spring,所以使用spring的jdbc作新增和更新操作。

例如:oracle表t_customer_health_document表中有名为files,类型为blob的字段,需要保存一张图片。

首先,创建一个工具类以获取spring的上下文,如下:

package com.zhangjie.test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TaskInit {

private static ApplicationContext context = null;

/**

* 单例 ApplicationContext

*  用于获取Spring容器中beans

* @return ApplicationContext

* @see

*/

public static ApplicationContext getInstance() {

if (context == null) {

context = new ClassPathXmlApplicationContext(new String[] {

"applicationContext.xml"});

}

return context;

}

}

然后,使用jdbc操作来将文件保存到files字段中,如下:

package com.zhangjie.test;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import oracle.sql.BLOB;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.datasource.DataSourceUtils;

import org.springframework.jdbc.support.JdbcUtils;

public class UpdateFiles {

public static Boolean updateFiles(String id, String filepath) {

Boolean result = false;

JdbcTemplate jdbcTemplate = (JdbcTemplate) TaskInit.getInstance()

.getBean("jdbcTemplate");;

Connection con = null;

PreparedStatement pstmt = null;

ResultSet rset = null;

try {

con = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());

con.setAutoCommit(false);

BLOB blob = null;

pstmt = con

.prepareStatement("update t_customer_health_document set files=empty_blob() where id=?");

pstmt.setString(1, id);

pstmt.executeUpdate();

pstmt.close();

pstmt = con

.prepareStatement("select files from t_customer_health_document where id= ? for update");

pstmt.setString(1, id);

rset = pstmt.executeQuery();

if (rset.next())

blob = (BLOB) rset.getBlob(1);

File f = new File(filepath);

FileInputStream fin = new FileInputStream(f);

pstmt = con

.prepareStatement("update t_customer_health_document set files=? where id=?");

OutputStream out = blob.getBinaryOutputStream();

byte[] data = new byte[(int) fin.available()];

fin.read(data);

out.write(data);

fin.close();

out.close();

pstmt.setBlob(1, blob);

pstmt.setString(2, id);

pstmt.executeUpdate();

pstmt.close();

con.commit();

con.close();

result = true;

} catch (SQLException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

JdbcUtils.closeResultSet(rset);

JdbcUtils.closeStatement(pstmt);

DataSourceUtils

.releaseConnection(con, jdbcTemplate.getDataSource());

}

return result;

}

public static void main(String[] args) {

boolean is = updateFiles("D6256CEBFEF76A03E040A8C057E005B3", "D:\\web deployment assembly.jpg");

System.out.println(is);

}

}

java blob 保存文件_java将文件保存为二进制流到oracle表中的blob字段 | 学步园相关推荐

  1. java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...

    线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...

  2. java 类文件_Java类文件概述

    所谓 Java 类文件,就是通常用 javac 编译器产生的 .class 文件.这些文件具有严格定义的格式. Java 源文件经过 javac 编译器编译之后,将会生成对应的二进制文件(如下图所示) ...

  3. java中实现选择文件_Java 实现文件选择对话框及功能

    时间:2018-10-02 概述:文件选择器 Java实现文件选择器,就是大家熟悉的打开文件.选择文件的对话框,本例子分为两部分来进行,一个部分是选择器对话框构建部分,另一部分是文件过滤部分,用于过滤 ...

  4. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...

    尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...

  5. java上传大文件_Java超大文件上传解决办法

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  6. java 上传断点续传_JAVA大文件上传断点续传解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 Save 改进后的代码不需要for ...

  7. java多线程上传文件_Java大文件分片上传/多线程上传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  8. java 批量重命名_Java实现文件批量重命名

    Windows操作系统可以实现重命名文件操作,却不能实现批量重命名.本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规则批量重命名.用户可以给出重命名模板,程序可以根据模板对相应 ...

  9. java json上传文件_java实现文件上传

    最近自己在做一个小系统玩的时候涉及到了文件的上传,于是在网上找到Java上传文件的方案,最后确定使用common-fileupload实现上传操作. 需求说明 用户添加页面有一个"上传&qu ...

  10. java 断点上传_java HTTP文件断点上传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

最新文章

  1. mysql优化sql相关(持续补充)
  2. 淘宝上的所有cuda书籍调研
  3. 常用工具说明--搭建基于rietveld的CodeReview平台(未测试)
  4. 感谢党,软考过了。系统集成项目管理project师
  5. DevExpress GridView 添加和设置右键菜单
  6. java怎么预加载字典值,有选择地显示预加载内容提高网站的性能
  7. 累加寄存器(AC)入门
  8. 卡函数or1200基于simple-spi的SD卡驱动
  9. 需求分析说明书SRS
  10. python循环结构高一信息技术_高中信息技术《循环结构1》优质课教学设计、教案...
  11. android 模拟器 超时,Appcelerator Studio超时等待Android模拟器启动
  12. 表格票据识别人工智能OCR
  13. 关于Linux运行steam的解决方案
  14. docker安装Lefse和分析流程
  15. 祝萍:后疫情时代,医美运营既要走心也要反套路
  16. 服务中心-ServiceCenter
  17. video.js播放m3u8视频
  18. 修复液晶显示器屏幕上的划痕
  19. 【QT Graphics/View】自定义动态矩形框DyRectangle
  20. nova 尽然不支持 boot_volume 注入 key 和 passwd

热门文章

  1. 饥荒无条件制作下载_饥荒巨人国无条件制造版
  2. 2020-12-09 blastp参数学习
  3. 注册中心Eureka的使用
  4. 2022年上海房地产研究报告
  5. 每天一道博弈论之“肥猫的游戏”
  6. 反入侵体系建设入门-攻击场景梳理
  7. 可视化指标计算公式_技巧|1个小思路,解决不同量级间指标的可视化问题
  8. C#实现多人语音聊天
  9. ES6(ES2015)
  10. JSP是什么?JSP是什么意思?