`

java oracle setblob lob字段的问题

阅读更多

Oracle的lob字段处理起来和普通的字段差异很大,具体的来说,增加的时候必须先用“空”值填上,然后查询一下获得lob对象,在把数据填到对象中,再更新回去;读的时候和其他普通值差异不大,不过要用流的方式读出;删除一样;修改的时候则和新增差不多,先select,得到lob对象,流写入后再更新回去。相关的java类型,不能用jdbc自己的,用oracle驱动提供的。
下面具体的看看代码,先准备一张表,

create table blobtable(

CHAPTER_DESCR VARCHAR2(40),

DIAGRAM_NO NUMBER(8),
DIAGRAM BLOB--存放图片
);

同时准备2张图片,做测试用。因为是演示,所以类的写法不够精炼。首先看看增加,下面是辅助方法,获得数据库联接,用的是超级用户
public static Connection getConnection() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:testdb", "sys as sysdba",
"sys");
return con;
}
--增加的方法,过程是先写入空,再select for update,最后update
public static void insert() throws Exception {

Connection con = getConnection();
con.setAutoCommit(false);//很关键,否则下面的update会抱错
PreparedStatement p = null;
p = con
.prepareStatement("INSERT INTO blobtable (chapter_descr,diagram_no,diagram)values(?,?,?)");
p.setString(1, "testname");
p.setInt(2, 27);
p.setBlob(3, BLOB.empty_lob());//此BLOB乃oracle.sql.BLOB类
p.executeUpdate();
p.close();
p = con
.prepareStatement("select diagram from blobtable where chapter_descr=? for update");
// select for update的好处是先锁住此行,防止并发问题
p.setString(1, "testname");
ResultSet rs = p.executeQuery();
rs.next();
oracle.sql.BLOBblob = (oracle.sql.BLOB) rs.getBlob("diagram");
FileInputStream in = new FileInputStream(
"D:\\My Documents\\testjpg.JPG");
OutputStream outB = blob.getBinaryOutputStream();
byte[] buf = new byte[blob.getBufferSize()];//缓冲的大小用这种方式获得性能最好
int len;
while ((len = in.read(buf)) > 0) {
outB.write(buf, 0, len);
}
outB.close();
in.close();
p.close();
p = con
.prepareStatement("update testname set diagram =? where chapter_descr=?");
p.setBlob(1, blob);
p.setString(2, "testname");
p.executeUpdate();
con.commit();
con.close();

}
--读的方法,比较好懂,注意的blob类型的不能直接查询,只能写到外部文件中
public static void read(String fileName) throws Exception {
Connection con = getConnection();

PreparedStatement p = null;

p = con
.prepareStatement("select diagram from testname where chapter_descr=?");
p.setString(1, "testname");
ResultSet rs = p.executeQuery();
rs.next();
oracle.sql.BLOBblob = (oracle.sql.BLOB) rs.getBlob("diagram");
FileOutputStream out = new FileOutputStream(fileName);
InputStream bos = blob .getBinaryStream();

byte[] buf = new byte[blob.getBufferSize()];
int len;
while ((len = bos.read(buf)) > 0) {
out.write(buf, 0, len);
}
bos.close();
out.close();
p.close();

con.close();

}
--修改,和增加类似,少了以前的insert语句的部分
public static void update() throws Exception {

Connection con = getConnection();
con.setAutoCommit(false);
PreparedStatement p = null;
p = con
.prepareStatement("select diagram from testname where chapter_descr=? for update");
p.setString(1, "testname");
ResultSet rs = p.executeQuery();
rs.next();
oracle.sql.BLOB blob= (oracle.sql.BLOB) rs.getBlob("diagram");
FileInputStream in = new FileInputStream("D:\\My Documents\\forest.jpg");
OutputStream outB = blob.getBinaryOutputStream();
byte[] buf = new byte[blob.getBufferSize()];
int len;
while ((len = in.read(buf)) > 0) {
outB.write(buf, 0, len);
}
outB.close();
in.close();
p.close();
p = con
.prepareStatement("update testname set diagram =? where chapter_descr=?");
p.setBlob(1, blob);
p.setString(2, "testname");
p.executeUpdate();
con.commit();
con.close();

}
写个main方法,调用一下看看结果,
public static void main(String[] args) throws Exception {
insert();
read("d:/test.jpg");
update();
read("d:/test2.jpg");
}
此程序在oracle 10g+jdk1.6上调式通过。

<!--无觅插件 -->
分享到:
评论

相关推荐

    阿里巴巴开源的基于MySQL的分布式数据库服务中间件 Cobar.zip

    若特殊需求需要这三种字段,禁止使用PreparedStatement的setBlob()或setBinaryStream()方法设置参数。不支持SAVEPOINT操作。不支持SET语句的执行,事务和字符集设置语句除外对于拆分表(一个表的数据被映射到多个...

    2107381120 王孟丽 实验2 (1).docx

    2107381120 王孟丽 实验2 (1).docx

    Java项目如何打成可以运行Jar包

    Java项目如何打成可以运行Jar包

    node-v12.22.8-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    海信 LED32K360X3D(0000)BOM1 自动重启问题软件升级数据 务必确认机编一致 强制刷机 整机USB升级程序

    MT5505机芯升级方法: 1、下载数据,压缩包解压,升级软件文件夹名字为Hisense_5505,文件夹下包含“机型名.pkg”以及version.txt 2、将文件夹Hisense_5505,整个文件夹拷贝至U盘根目录下 3、电视关机,插入U盘(USB3或者靠近高频头的USB口),重新启动电视机,电视机自动检测到升级软件之后并进行升级 4、在升级过程中屏幕有相关提示,升级完成后能自动开机。(建议是升级完成之后拔下U盘设备以免下次开机进行重复性升级) 注意: 1、(U盘要求使用FAT32格式,建议4G-8G的品牌U盘,刷机成功率会高) 2、升级到结束,大约需要8-30分钟,中途绝对不能断电 3、升级重启第一次进入系统,请等完全正常进入开机桌面之后,才能拨下U盘 4、如无法升级,将Hisense 5505文件夹内“机型名.pkg”的文件重命名为“upgrade.pkg”,此时插上U盘开机,电视就会默认为强制升级模式

    batik-awt-util-1.7.jar

    Batik是为想使用svg格式图片来实现各种功能的应用程序和Applet提供的一个基于java的工具包

    node-v14.10.1-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    520表白html5爱心代码源码合集.zip

    520表白html5爱心代码520表白html5爱心代码源码合集.zip 520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zip520表白html5爱心代码源码合集.zi

    Qt 5开发及实例(第4版)含典型案例视频分析源代码+ppt超详细资料.zip

    Qt 5开发及实例(第4版)含典型案例视频分析源代码+ppt超详细资料.zip 第1部分为Qt基础,在上一版的基础上增加了Qt操作表格处理软件Excel数据和字处理软件Word数据的内容。 第2部分为Qt综合实例,重新设计了电子商城系统、MyWord字处理软件、微信客户端程序。 第3部分为Qt扩展应用OpenCV,首先配置OpenCV-3.4.3,然后介绍典型图片处理。 第4部分为QML和Qt Quick及其应用,介绍了QML及Qt Quick相关内容, 【综合实例】为多功能文档查看器。第5部分为附录,介绍了C++相关知识和Qt 5简单调试。

    JavaScript_MultiOn API.zip

    JavaScript

    eclipse安装教程.rar

    eclipse安装

    DeNoise-tensorflow-master.zip

    DeNoise-tensorflow-master.zip

    C#源码用于查看和显示电脑已连接的WIFI密码

    C#源码用于查看和显示电脑已连接的WIFI密码

    字符串的逆序:输入为字符串,输出为字符串的逆序

    字符串的逆序,输入为字符串,输出为字符串的逆序,供学习参考。

    JavaScript_你可以用来替换momentjs ESLint Plugin的函数列表.zip

    JavaScript

    node-v6.14.4-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.6.0-headers.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于java实现的智慧医院门诊管理系统项目源码+设计文档+实验报告+详细资料.zip

    基于java实现的智慧医院门诊管理系统项目源码+设计文档+实验报告+详细资料.zip

    node-v20.1.0-headers.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    JavaScript_帮助你为Reactjs、Emberjs、Angular等选择一个MV框架Todo应用.zip

    JavaScript

Global site tag (gtag.js) - Google Analytics