- 浏览: 589402 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (231)
- JAVA (64)
- Oracle (50)
- JAVA IDE (10)
- AJax (8)
- Spring (12)
- hibernate (10)
- Struts (9)
- Jquery (7)
- EXT js (9)
- Tomcat (2)
- MySql (13)
- SQLServer 2005 (3)
- java script (10)
- DB2 (6)
- Linux (15)
- solaris (3)
- 开发模式 (16)
- windows (15)
- 硬件 (2)
- PHP (3)
- 框架整合 (17)
- Weblogic (12)
- JBOSS (1)
- 协议 (7)
- 云计算 (6)
- JSF (1)
- richfaces (1)
- python (1)
最新评论
-
woshiicesky:
怎么使用的?
解决jdk1.7 不支持TLS1.2的问题 -
sunzbking:
哇!大佬谢谢分享解决问题啦
解决jdk1.7 不支持TLS1.2的问题 -
doren:
谢谢,很好解决我们的问题
解决jdk1.7 不支持TLS1.2的问题 -
贝塔ZQ:
PageOffice插件,挺好使得,可以试试
POI解析Excel 文件读取,修改,另存等功能 -
程俊2009:
需要用哪些jar,可以说下吗
jdom读写XMl文件
一.写入BLOB
1.先在blob中插入empty_blob()
2.获得对刚刚插入记录的引用
BLOB blob = (BLOB) rs.getBlob("你的blob字段名称");
3.写入
OutputStream out = blob.getBinaryOutputStream();
out.write(ENCYPWD);//注意这里
二.读出BLOB
1.blob = rs.getBlob("你的blob字段名称");
、
2.InputStream is = blob.getBinaryStream();
int length = (int) blob.length();
byte[] buffer = new byte[length];
is.read(buffer);
is.close();
3.你有了is就随便处理了
比如说输出到一个文件
FileOutputStream fo = new FileOutputStream(filename);//数据到的文件名
fo.write(buffer);
fo.close();
环境:
Database: Oracle 9i
App Server: BEA Weblogic 8.14
表结构:
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob)
CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob) JAVA可以通过JDBC,也可以通过JNDI访问并操作数据库,这两种方式的具体操作存在着一些差异,由于通过App Server的数据库连接池JNDI获得的数据库连接提供的java.sql.Blob和java.sql.Clob实现类与JDBC方式提供的不同,因此在入库操作的时候需要分别对待;出库操作没有这种差异,因此不用单独对待。
一、BLOB操作
1、入库
(1)JDBC方式
//通过JDBC获得数据库连接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//锁定数据行进行更新,注意“for update”语句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是传入的byte数组,定义:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close(); (2)JNDI方式
//通过JNDI获得数据库连接
Context context = new InitialContext();
ds = (DataSource) context.lookup("ORA_JNDI");
Connection con = ds.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象empty_blob()
st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");
//锁定数据行进行更新,注意“for update”语句
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Blob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server对应的可能会不同)
weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");
OutputStream outStream = blob.getBinaryOutputStream();
//data是传入的byte数组,定义:byte[] data
outStream.write(data, 0, data.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close(); 2、出库
//获得数据库连接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要“for update”
ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");
if (rs.next())
{
java.sql.Blob blob = rs.getBlob("BLOBATTR");
InputStream inStream = blob.getBinaryStream();
//data是读出并需要返回的数据,类型是byte[]
data = new byte[input.available()];
inStream.read(data);
inStream.close();
}
inStream.close();
con.commit();
con.close(); 二、CLOB操作
1、入库
(1)JDBC方式
//通过JDBC获得数据库连接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//锁定数据行进行更新,注意“for update”语句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB
oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是传入的字符串,定义:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close();
(2)JNDI方式
//通过JNDI获得数据库连接
Context context = new InitialContext();
ds = (DataSource) context.lookup("ORA_JNDI");
Connection con = ds.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//插入一个空对象empty_clob()
st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");
//锁定数据行进行更新,注意“for update”语句
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");
if (rs.next())
{
//得到java.sql.Clob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server对应的可能会不同)
weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");
Writer outStream = clob.getCharacterOutputStream();
//data是传入的字符串,定义:String data
char[] c = data.toCharArray();
outStream.write(c, 0, c.length);
}
outStream.flush();
outStream.close();
con.commit();
con.close(); 2、出库
//获得数据库连接
Connection con = ConnectionFactory.getConnection();
con.setAutoCommit(false);
Statement st = con.createStatement();
//不需要“for update”
ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
Reader inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是读出并需要返回的数据,类型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
con.close();
需要注意的地方:
1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob几种类型的区别
2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob几种类型的区别
由于需要做一个JSP网页实现上传、下载文件的功能,所以这几天都在研究用什么方式,看了不少代码和方法。终于实现了,现在和大家分享,
希望对做相似功能的兄弟们有所帮助。
我用的是myeclipse开发环境。数据库客户端是Oracle9i.
1、下载SmartUpload.jar。
http://www.ciw.com.cn/blog/UploadFiles/2006-8/816529534.rar
下载以后改名为“SmartUpload.jar”。
给自己的工程导入SmartUpload.jar包。
2、设计表结构
表名:demo.file (用户是demo)
列: id varchar(20)
file blob (用clob也可以)
3、建立上传文件选择网页 upload.htm
代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://localhost:8080/jspsmartfile/jsp/uploadTemplate.jsp -->
<HTML><HEAD>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#e6e6e6><BR>
<FORM action="upload_oracle.jsp" encType=multipart/form-data method=post>
<TABLE>
<TBODY>
<TR>
<TD><FONT color=#000000 face=helv,helvetica size=1> File
: </FONT> <INPUT size=60 type=file name="file"></TD>
<TD align=right><INPUT type=submit value=上传 name="send"></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>
4、建立上传文件处理网页 upload_oracle.jsp
代码:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="oracle.sql.*"%>
<%@ page import="java.io.*"%>
<%@ page import=" oracle.jdbc.OracleResultSet"%>
<%@ page import="com.jspsmart.upload.*" %>
<jsp:useBean id="UploadBean" scope="page" class="book.book" />
<%--上传到ORACLE BOLB--%>
<%
//实例化上载bean
com.jspsmart.upload.SmartUpload mySmartUpload=new com.jspsmart.upload.SmartUpload();
//初始化
mySmartUpload.initialize(pageContext);
//设置上载的最大值
mySmartUpload.setMaxFileSize(500 * 1024*1024);
//上载文件
mySmartUpload.upload();
//循环取得所有上载的文件,由于刚才的上传选择文件网页upload,htm只有一个文件所以只循环一次,如果需要一次上传多个文件,则修改upload,htm,增加多个文件选择INPUT
for (int i=0;i<mySmartUpload.getFiles().getCount();i++){
//取得上载的文件
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
if (!myFile.isMissing())
{
//取得上载的文件的文件名
String myFileName=myFile.getFileName();
//取得不带后缀的文件名
String suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));
//取得后缀名
String ext= mySmartUpload.getFiles().getFile(0).getFileExt();
//取得文件的大小
int fileSize=myFile.getSize();
//保存路径
// String aa=getServletContext().getRealPath("/")+"jsp\\";
//String trace=aa+myFileName;
//取得别的参数
String explain=(String)mySmartUpload.getRequest().getParameter("text");
String send=(String)mySmartUpload.getRequest().getParameter("send");
//将文件保存在服务器端,
//myFile.saveAs("/image/"+myFileName, mySmartUpload.SAVE_VIRTUAL); //保存到工程的相对地址中,也就是你的工程的某个目录下。
myFile.saveAs("c:/temp/"+myFileName,mySmartUpload.SAVE_PHYSICAL); //绝对地址
//如果只需要将上传文件保存在服务器的某个文件夹下,那么可以将下面的数据库操作代码删除掉
//以下就开始操作上传文件,通过流将上传文件插入oracle的blob字段里
java.io.File file = new java.io.File("c:/temp/"+myFileName); //从刚才上传的临时文件夹找到文件
java.io.FileInputStream fis = new java.io.FileInputStream(file);
out.println(file.length());
//数据库连接可以自己修改。用java bean也可以
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@172.16.1.200:1521:mis", "demo","demo");
conn.setAutoCommit(false);
oracle.sql.BLOB blob = null; //注意此处的Blob格式一定要是oracle.sql.BLOB
//插入Blob的时候是先插一个空的Blob然后用UPDATE修改它
PreparedStatement pstmt = conn.prepareStatement("insert into demo.file (id,file ) values(?,empty_blob())");
pstmt.setString(1,"10000");
pstmt.executeUpdate();
pstmt.close();
pstmt = conn.prepareStatement("select file from demo.file where id= ? for update");
pstmt.setString(1,"10000");
ResultSet rs = pstmt.executeQuery();
if (rs.next()) blob = (oracle.sql.BLOB)((OracleResultSet)rs).getBlob(1);
pstmt = conn.prepareStatement("update demo.file set file=? where id=?");
OutputStream out1 = blob.getBinaryOutputStream(); // 建立输出流
byte[] data = new byte[(int)fis.available()];
fis.read(data);
out1.write(data);
out1.close();
fis.close();
pstmt.setBlob(1,blob);
pstmt.setString(2,"fankai");
pstmt.executeUpdate();
pstmt.close();
conn.commit();
conn.close();
out.println((myFileName+" 上载成功!!!").toString());
}
else
{ out.println(("上载失败!!!").toString()); }
} //与前面的if对应
%>
5、测试上传文件。
可以通过运行以上两个网页。如果运行完毕可以在数据库相应字段找到自己的上传文件(查看数据库字段的大小是否与上传文件大小相同,
如果有PL/SQL工具则可以直接预览数据库里的内容是不是刚才上传的文件。)。
6、建立下载网页 download_oracle.jsp
代码:
<html>
<head>
<title>文件下载</title>
</head>
<body>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="oracle.sql.*"%>
<%@ page import="java.io.*"%>
<%@ page import=" oracle.jdbc.OracleResultSet"%>
<%@ page import="com.jspsmart.upload.*" %>
<%--从ORALCE数据库取得文件下载到本地--%>
<%
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@172.16.1.200:1521:mis", "demo","demo");
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
// 查询BLOB对象
ResultSet rs = stmt.executeQuery("SELECT file FROM demo.file WHERE id='10001'");
while (rs.next())
{
//取出此BLOB对象
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("image");
BufferedOutputStream out_1 = new BufferedOutputStream(new FileOutputStream("c:/1.jpg"));
BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
int c;
while ((c = in.read()) != -1)
{ out_1.write(c);
}
in.close();
out_1.close();
}
rs.close();
stmt.close();
conn.close();
out.println("下载成功!!");
%>
</body>
</html>
7、测试下载部分程序。
运行下载网页之后可以看见对应路径下有相应的文件就表示成功了!
发表评论
-
POI 实现Excel文件中点击超链接跳转到某sheet页某列某行的功能
2017-05-02 16:03 1521import java.io.FileOutputStrea ... -
解决jdk1.7不支持TSL1.2的问题(续)
2017-02-16 16:16 3943解决jdk1.7 不支持TLS1.2的问题 续 ... -
查询JDK默认支持的SSL/TSL版本
2017-02-16 15:58 8761public static void main(String ... -
查询jdk支持的加密算法和支持协议
2017-02-09 17:43 1856import java.security.*; ... -
解决jdk1.7 不支持TLS1.2的问题
2017-02-09 17:24 35478场景 java程序使用https方式调用nessus ... -
Java GC的工作原理详解
2016-03-09 15:17 961JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM ... -
Java性能调优工具
2016-02-23 15:39 7431、JDK命令行工具 1.1、jps命令 jps用于列出 ... -
linux 设置tomcat 自启动
2014-06-11 19:21 930想tomcat开机自启动必须还得设置/etc/rc.d/rc ... -
Redhat Enterprise Linux 6.4 安装Oracle JDK替换OpenJDK
2014-06-11 11:13 1495缺省java版本为OpenJDK 1.7: # ja ... -
IO三种方式:BIO,NIO,AIO (异步读写asynchronous IO)
2014-02-28 14:26 1347dk1.6及之前都只实现BIO 和 NIOjdk1.7开始支 ... -
Java性能的十一个用法
2013-02-22 16:34 967Java语言习惯用语 1。 ... -
Java编码易疏忽的十个问题
2013-02-20 17:30 971在Java编码中,我们容易犯一些错误,也容易疏忽一些问题,因 ... -
jdom读写XMl文件
2012-12-29 12:28 2203昨天写的一个使用jdom读写xml文件的一个例子: / ... -
Java虚拟机的统计监测工具:jstat
2012-10-22 10:22 1494jstat:是JDK自带的虚拟机统计监测工具在命令行中执 ... -
JVM -XX: 参数介绍
2012-10-22 10:20 1476功能开关: 参数 默 ... -
spring mvc(基于注解)
2012-10-18 16:10 1355web.xml 配置: <servlet> ... -
hibernate注解大全
2012-10-18 14:16 1133/** * * @content ejb3 ... -
2012年10月编程语言排行榜
2012-10-16 13:00 1235谷歌Dart在本月首次进入了TIOBE排名前50位,也是 ... -
mysql+jdk+tomcat绿色版整合
2012-07-10 15:32 0闲来没事整理的,相互学习一下,首先是下载解压版的mysql和t ... -
POI解析Excel 文件读取,修改,另存等功能
2012-06-28 10:36 18096package com; import java. ...
相关推荐
Java对Oracle数据库中BLOB字段的处理涉及多个层面,包括读取、写入、更新以及跨数据库操作等。 ### Java处理Oracle BLOB字段的基本方法 #### 1. 读取BLOB字段 在Java中,读取Oracle数据库中的BLOB字段通常通过`...
### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...
Oracle数据库在存储大对象(BLOB)数据时,提供了高效且灵活的方式,使得二进制数据如图片、文档等能够安全地保存在数据库中。批量导出Oracle数据库中的BLOB字段生成图片,是一项常见的需求,尤其对于那些需要将...
使用 JAVA 读取 ORACLE BLOB 字段实现上传下载 BLOB(Binary Large Objects)是一种二进制大对象类型,常用于存储大对象,例如图形、声音等。我们可以将 BLOB 区分为三种形式:声像数据、二进制数据和大文本数据。...
这篇博客文章“JAVA操作Oracle blob类型”将深入探讨如何在Java应用程序中有效地管理和操作Oracle数据库中的BLOB字段。本文将详细讲解相关知识点,包括连接数据库、插入BLOB数据、查询BLOB数据以及更新和删除BLOB...
视频第六部分共七部分 下载全才可以解压 博文链接:https://dlivan.iteye.com/blog/116258
jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc ...
视频第一部分共七部分 下载全才可以解压 博文链接:https://dlivan.iteye.com/blog/116256
视频第七部共七部 下载全才可以解压 博文链接:https://dlivan.iteye.com/blog/116262
在Java的JDBC4.0版本中,Oracle数据库的BLOB类型数据操作变得更加方便。BLOB(Binary Large Object)是用来存储大对象,如图像、音频或视频文件等二进制数据的数据库字段类型。以下是对使用JDBC4.0操作Oracle中BLOB...
本教程将详细讲解如何批量导出Oracle数据库中的BLOB字段并生成文件,适用于需要定期或一次性处理大量图片或其他BLOB数据的场景。 首先,确保你已经在本地安装了Oracle客户端。Oracle客户端提供了SQL*Plus和其他工具...
本篇将详细介绍如何使用Java将MP3等二进制文件存入Oracle数据库中的BLOB字段。 首先,我们需要了解Oracle JDBC驱动,这是Java与Oracle数据库交互的基础。Oracle提供了一个名为ojdbc的JDBC驱动,它可以连接到Oracle...
Oracle数据库系统支持多种复杂的数据类型,其中包括BLOB(Binary Large Object),用于存储非结构化的大数据,如图片、音频或视频文件。而MySQL同样提供了BLOB类型,用于相似的用途。本篇将详细讲解如何在Oracle与...
指定文件夹下的所有文件上传至oracle的blob字段,java实现
综上所述,使用Hibernate和JDBC读取Oracle数据库中的Blob数据涉及多个步骤,包括实体类的设计、数据库操作和文件流的处理。理解这些知识点对于处理大对象存储至关重要。在实际项目中,根据需求和性能考虑,选择合适...