`

java操作oracle之Blob

    博客分类:
  • JAVA
阅读更多

 

一.写入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>&nbsp;&nbsp;File  

      :&nbsp;</FONT>&nbsp;&nbsp;<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、测试下载部分程序。

   运行下载网页之后可以看见对应路径下有相应的文件就表示成功了!

 

分享到:
评论
1 楼 zq784161329 2011-06-16  
不错  .... 学习了

相关推荐

    java对oracle数据库中blob字段的处理

    Java对Oracle数据库中BLOB字段的处理涉及多个层面,包括读取、写入、更新以及跨数据库操作等。 ### Java处理Oracle BLOB字段的基本方法 #### 1. 读取BLOB字段 在Java中,读取Oracle数据库中的BLOB字段通常通过`...

    java中读取ORACLE中BLOB字段存储的图片

    ### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...

    批量导出ORACLE数据库BLOB字段生成图片

    Oracle数据库在存储大对象(BLOB)数据时,提供了高效且灵活的方式,使得二进制数据如图片、文档等能够安全地保存在数据库中。批量导出Oracle数据库中的BLOB字段生成图片,是一项常见的需求,尤其对于那些需要将...

    使用JAVA读取ORACLE_BLOB字段实现上传下载.doc

    使用 JAVA 读取 ORACLE BLOB 字段实现上传下载 BLOB(Binary Large Objects)是一种二进制大对象类型,常用于存储大对象,例如图形、声音等。我们可以将 BLOB 区分为三种形式:声像数据、二进制数据和大文本数据。...

    JAVA操作Oracle blob类型

    这篇博客文章“JAVA操作Oracle blob类型”将深入探讨如何在Java应用程序中有效地管理和操作Oracle数据库中的BLOB字段。本文将详细讲解相关知识点,包括连接数据库、插入BLOB数据、查询BLOB数据以及更新和删除BLOB...

    java操作oracle 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 操作oracle blob数据jdbc ...

    java操作oracle blob类型(上)

    视频第一部分共七部分 下载全才可以解压 博文链接:https://dlivan.iteye.com/blog/116256

    java操作oracle blob类型(下)

    视频第七部共七部 下载全才可以解压 博文链接:https://dlivan.iteye.com/blog/116262

    使用JDBC4.0操作Oracle中BLOB类型的数据方法

    在Java的JDBC4.0版本中,Oracle数据库的BLOB类型数据操作变得更加方便。BLOB(Binary Large Object)是用来存储大对象,如图像、音频或视频文件等二进制数据的数据库字段类型。以下是对使用JDBC4.0操作Oracle中BLOB...

    批量导出ORACLE数据库BLOB字段生成文件

    本教程将详细讲解如何批量导出Oracle数据库中的BLOB字段并生成文件,适用于需要定期或一次性处理大量图片或其他BLOB数据的场景。 首先,确保你已经在本地安装了Oracle客户端。Oracle客户端提供了SQL*Plus和其他工具...

    oracle_java_blob

    本篇将详细介绍如何使用Java将MP3等二进制文件存入Oracle数据库中的BLOB字段。 首先,我们需要了解Oracle JDBC驱动,这是Java与Oracle数据库交互的基础。Oracle提供了一个名为ojdbc的JDBC驱动,它可以连接到Oracle...

    oracle中的BLOB(照片)转换到mysql中

    Oracle数据库系统支持多种复杂的数据类型,其中包括BLOB(Binary Large Object),用于存储非结构化的大数据,如图片、音频或视频文件。而MySQL同样提供了BLOB类型,用于相似的用途。本篇将详细讲解如何在Oracle与...

    文件上传至oracle blob字段的java实现

    指定文件夹下的所有文件上传至oracle的blob字段,java实现

    使用hibernate对oracle读取blob

    综上所述,使用Hibernate和JDBC读取Oracle数据库中的Blob数据涉及多个步骤,包括实体类的设计、数据库操作和文件流的处理。理解这些知识点对于处理大对象存储至关重要。在实际项目中,根据需求和性能考虑,选择合适...

Global site tag (gtag.js) - Google Analytics