`
xiaobai233
  • 浏览: 59805 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java操作Oracle数据库中的Clob,Blob字段

阅读更多
说明1:首先所有的文件都是以二进制存储
       2:二进制文件有.doc .xls .jpg
         文本文件有   .txt .html .xml

先在oracle数据库中建一张表用与测试

create table CDL_TEST
(
  SID  VARCHAR2(20) not null,
  IMG  BLOB,       //存储二进制
  DOC  CLOB,     //存储文本
  DATA NUMBER
)
-- 约束

alter table CDL_TEST
  add constraint CDL_SID primary key (SID)


测试代码如下:

package DataBaseUtil;
import java.sql.*;
import java.util.Scanner;
import java.io.*;
import oracle.sql.BLOB;

class InitDB{
 private static Connection con=null;
 private static Statement stmt=null;
 private static ResultSet rs=null;
 InitDB(){
  try{
  Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
      String url="jdbc:oracle:thin:@localhost:1521:ORCL";  //ORCL 是sid
  String user="cdl";  
  String password="1";  
  con= (Connection) DriverManager.getConnection(url,user,password);
  InitDB.setCon(con);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
 public void closCon(){
  try{
   con.close();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void stmt(){
  try{
   con.close();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void rs(){
  try{
   con.close();
  }catch(Exception e){
   e.printStackTrace();
  }
 }

 public static Connection getCon() {
  return con;
 }

 public static void setCon(Connection con) {
  InitDB.con = con;
 }

 public static ResultSet getRs() {
  return rs;
 }

 public static void setRs(ResultSet rs) {
  InitDB.rs = rs;
 }

 public static Statement getStmt() {
  return stmt;
 }

 public static void setStmt(Statement stmt) {
  InitDB.stmt = stmt;
 }
}

/*
 * 插入Blob数据 如:图片
 */
class InsertBlobData{
 private ResultSet rs=null;
 private InitDB idb=null;
 InsertBlobData(){
   idb=new InitDB();
 }
 public  void insertBlob(String sql1) throws SQLException{
  Connection con=idb.getCon();
  try{
   con.setAutoCommit(false);//不设置自动提交
   BLOB blob = null; //插入空的Blob
   PreparedStatement pstmt = con.prepareStatement("insert into cdl_test(sid,img) values(?,empty_blob())");
   pstmt.setString(1,"100"); 
   pstmt.executeUpdate(); 
   pstmt.close(); 
   rs=con.createStatement().executeQuery(sql1);
   while(rs.next()){
     System.out.println("rs length is:");
     oracle.sql.BLOB  b=(oracle.sql.BLOB )rs.getBlob("img");
     System.out.println("cloblength is:"+b.getLength());
     File f=new File("d:\\img\\1.jpg");
     System.out.println("file path is:"+f.getAbsolutePath());
     BufferedInputStream in=new BufferedInputStream(new FileInputStream(f));  
     BufferedOutputStream  out=new BufferedOutputStream(b.getBinaryOutputStream()); 
     int   c;   
     while ((c=in.read())!=-1)   {   
      out.write(c);   
     }   
     in.close();   
     out.close();
   }
   con.commit();
  }catch(Exception e){
   con.rollback();//出错回滚
   e.printStackTrace();
  } 
 }
}
/*
 * 插入大文本如:1.txt
 */
class InsertClobData{
 private ResultSet rs=null;
 private InitDB idb=null;
 InsertClobData(){
   idb=new InitDB();
 }
 public  void insertClob(String sql1) throws SQLException{
  Connection con=idb.getCon();
  try{
   con.setAutoCommit(false);//不设置自动提交
   BLOB blob = null; //插入空的Clob
   PreparedStatement pstmt = con.prepareStatement("insert into cdl_test(sid,doc) values(?,empty_clob())");
   pstmt.setString(1,"101"); 
   pstmt.executeUpdate(); 
   pstmt.close(); 
   rs=con.createStatement().executeQuery(sql1);
   while(rs.next()){
    System.out.println("sdfasdfas");
    oracle.sql.CLOB  cb=(oracle.sql.CLOB)rs.getClob("doc");
    File f=new File("d:\\doc\\1.txt");
    System.out.println("file path is:"+f.getAbsolutePath());
    BufferedWriter out = new BufferedWriter(cb.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(f));
    int c;
    while ((c=in.read())!=-1) {
        out.write(c);
    }
    in.close();   
    out.close();
   }
   con.commit();
  }catch(Exception e){
   con.rollback();//出错回滚
   e.printStackTrace();
  } 
 }
}
/*
 * 读取图片
 */
class ReadBlobData{
 private ResultSet rs=null;
 private InitDB idb=null;
 ReadBlobData(){
   idb=new InitDB();
 }
 public void getBlob(String sql2) throws SQLException{
  Connection con=idb.getCon();
  con.setAutoCommit(false);
  try{
   System.out.println("sq2 is:"+sql2);
   System.out.println("stmt is:"+con);
   rs=con.createStatement().executeQuery(sql2);
   while(rs.next()){
    System.out.println("rs length is:");
    Blob b=(Blob)rs.getBlob("img");
    File f=new File("D:\\saveimg\\1.jpg");
    FileOutputStream fos=new FileOutputStream(f);
    InputStream is=b.getBinaryStream();//读出数据后转换为二进制流
    byte[] data=new byte[1024];
    while(is.read(data)!=-1){
     fos.write(data);
    }
    fos.close();
    is.close();
   }
  con.commit();//正式提交
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   //rs.close();
  }
 }
}
/*
 * 读取大文本
 */
class ReadClobData{
 private ResultSet rs=null;
 private InitDB idb=null;
 ReadClobData(){
   idb=new InitDB();
 }
 public void getClob(String sql2) throws SQLException{
  Connection con=idb.getCon();
  try{
   con.setAutoCommit(false);//不设置自动提交
   System.out.println("sq2 is:"+sql2);
   rs=con.createStatement().executeQuery(sql2);
   while(rs.next()){
    oracle.sql.CLOB clob=(oracle.sql.CLOB)rs.getClob("doc");
    File f=new File("d:\\savedoc\\1.txt");
    BufferedReader in = new BufferedReader(clob.getCharacterStream());
    //setCharacterStream()方法,可用于将CLOB字段与字节流相关联,
             BufferedWriter out = new BufferedWriter(new FileWriter(f));
             int c;
             while ((c=in.read())!=-1) {
                  out.write(c);
              }
    out.close();
    in.close();
   }
  con.commit();//正式提交
  rs.close();
  }catch(Exception e){
   e.printStackTrace();
   con.rollback();
  }
 }
}
public class TestBlob {
 public static void main(String []args){
  String sql1="select * from cdl_test  for update";//悲观锁锁定需更新的行
  String sql2="select * from cdl_test";
  System.out.println("\t\t\t欢迎使用:");
  System.out.println("1:插入图片");
  System.out.println("2:插入文本");
  System.out.println("3:读取图片");
  System.out.println("4:读取文本");
  System.out.println("5:退出");
  System.out.println("请选择:")
  while(true){
   try{
    Scanner sc=new Scanner(System.in);
    int i=sc.nextInt();
    System.out.println("sss:"+i);
    switch(i){
     case 1:
      InsertBlobData isd=new InsertBlobData();
      isd.insertBlob(sql1); break;
     case 2:
      InsertClobData icd=new InsertClobData();
      icd.insertClob(sql1); break;
     case 3:
      ReadBlobData rb=new ReadBlobData();
      rb.getBlob(sql2); break;
     case 4:
      ReadClobData rc=new ReadClobData();
      rc.getClob(sql2); break;
     case 5:
      System.exit(0);
    }
   }catch(Exception e){
    e.printStackTrace();
   }
  }
 }
}

分享到:
评论

相关推荐

    读取oracle数据库中clob字段的值

    在Java中,读取Oracle数据库中的CLOB字段可以通过以下步骤实现: 1. **获取CLOB对象**: 首先,通过执行查询语句并从结果集中获取CLOB对象。示例代码中的`lookmail[6]`表示从查询结果的第7个元素(下标为6)获取...

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

    批量导出Oracle数据库中的BLOB字段生成图片,是一项常见的需求,尤其对于那些需要将数据库中的图片资源导出到本地文件系统的情况。下面将详细介绍这一过程及其相关知识点。 首先,我们需要理解BLOB类型。BLOB...

    Oracle导出Clob,Blob工具

    2. **Oracle.ManagedDataAccess.dll**:这是Oracle官方提供的Managed Driver,它是一个.NET Framework库,允许开发者在.NET环境中直接访问Oracle数据库,支持Clob和Blob操作。 3. **SqlSugar.dll**:这是一个流行的...

    mysql和Oracle在对clob和blob字段的处理

    本文将深入探讨这两个数据库系统如何处理`CLOB`(Character Large Object)和`BLOB`(Binary Large Object)字段,这两种字段类型主要用于存储大量文本或二进制数据。 `CLOB`用于存储非结构化的字符数据,如长篇...

    oracle数据库的clob大字段在jdbc中的处理方式

    在Java中,当我们需要通过JDBC(Java Database Connectivity)接口与Oracle数据库交互时,处理CLOB字段可能会遇到一些挑战。这篇文档将详细阐述如何在JDBC中有效地读取和操作Oracle数据库的CLOB字段,并将其转换为...

    ORACLE中CLOB字段转String类型

    在Oracle数据库中,将CLOB字段转换为字符串类型是常见需求之一。通过使用`DBMS_LOB`包、内置函数如`SUBSTR`以及`TO_CHAR`,可以有效地实现这一目标。此外,还需注意性能优化措施,例如分段读取和合理设计查询逻辑,...

    kettle通过java代码将数据库blob 字段抽取到本地文件

    kettle通过java代码将数据库blob 字段抽取到本地文件

    如何将DB2数据库中的大对象(BLOB,CLOB)数据类型复制到Oracle数据库中

    - **联邦能力**:利用WII的联邦功能,先将DB2中的非BLOB字段复制到Oracle目标表中。 - **标志字段**:在Oracle目标表上添加一个额外的“flag”字段,初始值设为“1”。此字段用于识别哪些记录需要更新BLOB数据。 ...

    Mybatis 处理 CLOB、BLOB 类型数据

    在 Oracle 数据库中,BLOB 类型对应的数据库类型是 BLOB,在 MySQL 中对应的类型是 BLOB。 MyBatis 提供了对 CLOB 和 BLOB 类型的内置支持,通过将 CLOB 类型映射到 Java 的 String 类型,BLOB 类型映射到 byte[] ...

    Hibernate操作Oarcle中Clob、Blob字段小结

    - 包含在`bigstring_oracle_src`可能有示例代码,展示了如何在Java中创建Clob和Blob对象,以及如何通过Hibernate进行插入、更新和查询操作。 总之,理解并熟练掌握Hibernate对Oracle中的Clob和Blob字段的操作,是...

    Oracle导出Clob,Blob工具版本2

    Oracle数据库在存储大对象(BLOB和CLOB)时提供了强大的功能,但处理这些类型的数据进行导入导出可能会带来挑战。"Oracle导出Clob,Blob工具版本2" 是一个专为解决这个问题而设计的应用程序,它改进了对CLOB...

    数据库读取clob字段

    在Oracle数据库中读取CLOB字段通常涉及数据库连接、SQL查询、CLOB对象处理以及资源管理等多个环节。上述示例展示了如何在Java中实现这一过程。需要注意的是,在实际应用中还应该考虑更多的异常处理机制,以确保程序...

    clob-blob.rar_blob and clob_clob_java CLOB_java oracle cl_oracle

    在Java中,我们通常使用JDBC(Java Database Connectivity)来连接和操作数据库。对于CLOB和BLOB字段,Oracle JDBC驱动提供了`oracle.jdbc.driver.OracleClob`和`oracle.jdbc.driver.OracleBlob`类,它们实现了Java...

    oracle blob 字段 读写 delphi

    本篇文章将深入探讨如何在Delphi中对Oracle数据库的BLOB字段进行读写操作。 首先,你需要在Delphi项目中引入Oracle数据库访问的相关组件,如DBExpress或ADO。DBExpress是Delphi内置的一个轻量级数据库访问框架,而...

    oracle(blob转换为clob)

    在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...

    图片存入Oracle中,用clob和blob两种方式

    在数据库管理中,存储非结构化数据如图片、音频或视频文件时,通常会使用`CLOB`(Character Large Object)和`BLOB`(Binary Large Object)这两种数据类型。Oracle数据库系统支持这两种数据类型,用于存储大量文本...

    Oracle如何对CLOB行字段来执行全文检索

    Oracle 数据库中,CLOB 行字段是一种常用的数据类型,用于存储大文本数据。然而,在 Oracle8i 版本之前,对大字段 CLOB 仍然不支持在 where 子句直接的 Like 操作。这使得开发者无法直接对 CLOB 字段中的内容进行 ...

    数据库中clob类型转换的问题 数据库中clob类型转换的问题

    一种常见的解决方案是在执行此操作之前先备份原数据,并使用适当的逻辑将CLOB字段中的数据截断至VARCHAR2可接受的范围内,或者在必要时将较长的数据拆分为多个VARCHAR2字段。 #### 问题2:兼容性问题 不同的数据库...

    sql server中的image类型的数据导出到oracle的clob字段中

    我们使用了 Java 语言和 JDBC 驱动程序来实现数据的导出,并将 Image 类型数据写到文件中,然后将文件中的数据读取出来,并将其设置到 Oracle 的 CLOB 字段中。这种方法可以帮助我们实现不同数据库管理系统之间的...

Global site tag (gtag.js) - Google Analytics