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

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

阅读更多

一、MySQL与Oracle数据库如何处理Clob,Blob数据类型

(1)不通数据库中对应clob,blob的类型如下:
   MySQL中:clob对应text,blob对应blob
   DB2/Oracle中:clob对应clob,blob对应blob

(2)domain中对应的类型:
   clob对应String,blob对应byte[]
   clob对应java.sql.Clob,blob对应java.sql.Blob

(3)hibernate配置文件中对应类型:
   clob-->clob ,blob-->binary
   也可以直接使用数据库提供类型,例如:oracle.sql.Clob,oracle.sql.Blob

二、jdbc操作clob(以oracle为例)
首先操作clob/blob不像操作varchar类型那样简单,插入步骤一般分为两步:第一步插入一个空值,第二步锁住此行,更新clob/blob字段。

//插入空值
conn.setAutoCommit(false);
String sql = "INSERT INTO T_FILE(NAME, FILE_CONTENT) VALUES ('Jambhala', EMPTY_CLOB())";
PreparedStatement pstmt = conn.prepareStatement(sql); 
pstmt.executeUpdate();
//锁住此行
String sql_lockstr = "SELECT FILE_CONTENT FROM T_FILE WHERE NAME='Jambhala' FOR UPDATE";
pstmt = conn.prepareStatement(sql_lockstr); 
ResultSet rs = pstmt.executeQuery(); 
oracle.sql.Clob clob = (oracle.sql.Clob)rs.getClob(1);
java.io.OutputStream writer = clob.getAsciiOutputStream(); 
byte[] temp = newFileContent.getBytes(); 
writer.write(temp); 
writer.flush(); 
writer.close();
pstmt.close();

读取内容:
oracle.sql.Clob clob = rs.getClob("FILE_CONTENT");
if(clob != null){
    Reader is = clob.getCharacterStream();
    BufferedReader br = new BufferedReader(is);
    String s = br.readLine();
    while(s != null){
    	content += s+"<br>";
        s = br.readLine();
    }
}

三、jdbc操作blob
conn.setAutoCommit(false);
String sql = "INSERT INTO T_PHOTO(NAME, PHOTO) VALUES ('Jambhala', EMPTY_BLOB())";
pstmt = conn.prepareStatement(sql); 
pstmt = conn.executeUpdate();
sql = "SELECT PHOTO FROM T_PHOTO WHERE NAME='Jambhala'";
pstmt = conn.prepareStatement(sql); 
rs = pstmt.executeQuery(sql);
if(rs.next()){
   oracle.sql.Blob blob = (oracle.sql.Blob)rs.getBlob(1);
}
//write to a file
File file=new File("C:\\test.rar");
FileInputStream fin = new FileInputStream(file);
OutputStream out = blob.getBinaryOutputStream();
int count=-1,total=0;
byte[] data = new byte[blob.getBufferSize()];
while((count=fin.read(data)) != -1){
   total += count;
   out.write(data, 0, count);
} 

四、hibernate处理clob
MyFile file = new MyFile();
file.setName("Jambhala");
file.setContent(Hibernate.createClob(""));
session.save(file);
session.flush();
session.refresh(file, LockMode.UPGRADE);
oracle.sql.Clob clob = (oracle.sql.Clob)file.getContent();
Writer pw = clob.getCharacterOutputStream();
pw.write(longText);   //写入长文本
pw.close();
session.close();

五、使用hibernate处理blob
原理基本相同:
Photo photo = new Photo();
photo.setName("Jambhala");
photo.setPhoto(Hibernate.createBlob(""));
session.save(photo);
session.flush();

session.refresh(photo, LockMode.UPGRADE);  //锁住此对象
oracle.sql.Blob blob = photo.getPhoto();   //取得此blob的指针
OutputStream out = blob.getBinaryOutputStream();
//写入一个文件
File f = new File("C:\\test.rar");
FileInputStream fin = new FileInputStream(f);
int count=-1,total=0;
byte[] data = new byte[(int)fin.available()];
out.write(data);
fin.close();
out.close();
session.flush();


String DRIVER = "oracle.jdbc.driver.OracleDriver";
//Oracle连接用URL
private static final String URL = "jdbc:oracle:thin:@testora:1521:orac";
//用户名
private static final String USER = "scott";
//密码
private static final String PASSWORD = "pswd";
//数据库连接
private static Connection conn = null;
//SQL语句对象
private static Statement stmt = null;
//@roseuid 3EDA089E02BC
public LobPros(){}

//往数据库中插入一个新的Clob对象
//@param infile  数据文件
//@throws java.lang.Exception
//@roseuid 3EDA089E02BC
public static void clobInsert(String infile) throws Exception {
   //设定不自动提交
   boolean defaultCommit = conn.getAutoCommit(); 
   conn.setAutoCommit(false);
   try{
	//插入一个空的Clob对象
        stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
        //查询此Clob对象并锁定
        ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
        while(rs.next()){
	   //取出此Clob对象
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
           //向Clob对象中写入数据
           BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); 
           BufferedReader in = new BufferedReader(new FileReader(infile));
           int c;
           while((c=in.read()) != -1){
	      out.write(c);
           }
           in.close();
           out.close();
        }
        //正式提交
        conn.commit();
   }catch(Exception e){
      //出错回滚
      conn.rollback();
      throw e;
   }

   //恢复原提交状态
   conn.setAutoCommit(defaultCommit);
}

//修改Clob对象(是在原Clob对象基础上进行覆盖式的修改)
//@param infile  数据文件
//@throws java.lang.Exception
//@roseuid 3EDA089E02BC
public static void clobModify(String infile) throws Exception {
   //设定不自动提交
   boolean defaultCommit = conn.getAutoCommit(); 
   conn.setAutoCommit(false);
   try{
	//查询Clob对象并锁定
        ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
        while(rs.next()){
	   //获取此Clob对象
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
           //进行覆盖式修改
           BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream()); 
           BufferedReader in = new BufferedReader(new FileReader(infile)); 
           int c;
           while ((c=in.read())!=-1) { 
              out.write(c); 
           } 
           in.close(); 
           out.close(); 
        }
        //正式提交
        conn.commit();
   }catch(Exception e){
      //出错回滚
      conn.rollback();
      throw e;
   }
   //恢复原提交状态
   conn.setAutoCommit(defaultCommit);
}

//替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象
//@param infile  数据文件
//@throws java.lang.Exception
//@roseuid 3EDA04BF01E1
public static void clobReplace(String infile) throws Exception {
   //设定不自动提交
   boolean defaultCommit = conn.getAutoCommit();
   conn.setAutoCommit(false);
   try{
	//清空原CLOB对象
        stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
        //查询CLOB对象并锁定
        ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
        while (rs.next()) {
	   //获取此CLOB对象
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
           //更新数据
           BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
           BufferedReader in = new BufferedReader(new FileReader(infile)); 
           int c;
           while ((c=in.read())!=-1) { 
	      out.write(c); 
	   } 
	   in.close(); 
	   out.close();
        }
	//正式提交
	conn.commit();
   }catch(Exception e){
	//出错回滚
	conn.rollback(); 
	throw e;
   }
   //恢复原提交状态
   conn.setAutoCommit(defaultCommit);
}

//CLOB对象读取
//@param outfile  输出文件名
//@throws java.lang.Exception
//@roseuid 3EDA04D80116
public static void clobRead(String outfile) throws Exception {
   //设定不自动提交
   boolean defaultCommit = conn.getAutoCommit();
   conn.setAutoCommit(false);
   try{
        //查询CLOB对象
        ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");
        while (rs.next()) {
	   //获取CLOB对象
           oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
           //以字符形式输出
           BufferedReader in = new BufferedReader(clob.getCharacterStream()); 
           BufferedWriter out = new BufferedWriter(new FileWriter(outfile)); 
           int c;
           while ((c=in.read())!=-1) {
              out.write(c);
           }
	   out.close(); 
	   in.close();
        }
   }catch(Exception e){
       conn.rollback(); 
       throw e;
   }
   //恢复原提交状态
   conn.setAutoCommit(defaultCommit);
}

//向数据库中插入一个新的BLOB对象 
//@param infile  数据文件 
//@throws java.lang.Exception 
//@roseuid 3EDA04E300F6
public static void blobInsert(String infile) throws Exception { 
   //设定不自动提交
   boolean defaultCommit = conn.getAutoCommit(); 
   conn.setAutoCommit(false); 
   try { 
	//插入一个空的BLOB对象 
	stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())"); 
	//查询此BLOB对象并锁定 
	ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE"); 
	while (rs.next()) { 
	   //取出此BLOB对象 
	   oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); 
	   //向BLOB对象中写入数据 
	   BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); 
	   BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile)); 
	   int c; 
	   while ((c=in.read())!=-1) { 
		out.write(c); 
	   } 
	   in.close(); 
	   out.close(); 
	} 
	//正式提交 
	conn.commit(); 
    } catch (Exception e) { 
	//出错回滚 
	conn.rollback(); 
	throw e; 
    } 
    //恢复原提交状态 
    conn.setAutoCommit(defaultCommit); 
} 

//修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改) 
//@param infile  数据文件 
//@throws java.lang.Exception 
//@roseuid 3EDA04E90106 
public static void blobModify(String infile) throws Exception { 
    //设定不自动提交 
    boolean defaultCommit = conn.getAutoCommit(); 
    conn.setAutoCommit(false); 
    try { 
	//查询BLOB对象并锁定 
	ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE"); 
	while (rs.next()) { 
	   //取出此BLOB对象 
	   oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); 
	   //向BLOB对象中写入数据 
	   BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); 
	   BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile)); 
	   int c; 
	   while ((c=in.read())!=-1) { 
	      out.write(c); 
	   } 
	   in.close(); 
	   out.close(); 
	} 
	//正式提交 
	conn.commit(); 
    } catch (Exception e) { 
	//出错回滚 
	conn.rollback(); 
	throw e; 
    } 
    //恢复原提交状态 
    conn.setAutoCommit(defaultCommit); 
} 

//替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象) 
//@param infile  数据文件 
//@throws java.lang.Exception 
//@roseuid 3EDA0505000C 
public static void blobReplace(String infile) throws Exception { 
   //设定不自动提交 
   boolean defaultCommit = conn.getAutoCommit(); 
   conn.setAutoCommit(false); 
   try { 
	//清空原BLOB对象 
	stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'"); 
	//查询此BLOB对象并锁定 
	ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE"); 
	while (rs.next()) { 
	   //取出此BLOB对象 
	   oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); 
	   //向BLOB对象中写入数据 
	   BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream()); 
	   BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile)); 
	   int c; 
	   while ((c=in.read())!=-1) { 
	      out.write(c); 
	   } 
	   in.close(); 
	   out.close(); 
        } 
	//正式提交 
	conn.commit(); 
   } catch (Exception e) { 
	//出错回滚 
	conn.rollback(); 
	throw e; 
   } 
   //恢复原提交状态 
   conn.setAutoCommit(defaultCommit); 
} 

//BLOB对象读取 
//@param outfile  输出文件名 
//@throws java.lang.Exception 
//@roseuid 3EDA050B003B 
public static void blobRead(String outfile) throws Exception { 
   //设定不自动提交 
   boolean defaultCommit = conn.getAutoCommit(); 
   conn.setAutoCommit(false); 
   try { 
         //查询BLOB对象 
	 ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'"); 
	 while (rs.next()) { 
	    //取出此BLOB对象 
	    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL"); 
	    //以二进制形式输出 
	    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile)); 
	    BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream()); 
	    int c; 
	    while ((c=in.read())!=-1) { 
	       out.write(c); 
            } 
	    in.close(); 
	    out.close(); 
         } 
	 //正式提交 
         conn.commit(); 
   } catch (Exception e) { 
	//出错回滚 
	conn.rollback(); 
	throw e; 
   } 
   //恢复原提交状态 
   conn.setAutoCommit(defaultCommit); 
} 

//建立测试用表格 
//@throws Exception 
public static void createTables() throws Exception { 
   try { 
	stmt.executeUpdate("CREATE TABLE TEST_CLOB (ID NUMBER(3), CLOBCOL CLOB)"); 
	stmt.executeUpdate("CREATE TABLE TEST_BLOB (ID NUMBER(3), BLOBCOL BLOB)"); 
   } catch (Exception e) { } 
} 

//@param args - 命令行参数 
//@throws java.lang.Exception 
//@roseuid 3EDA052002AC 
public static void main(String[] args) throws Exception { 
   //装载驱动,建立数据库连接 
   Class.forName(DRIVER); 
   conn = DriverManager.getConnection(URL,USER,PASSWORD); 
   stmt = conn.createStatement(); 
   //建立测试表格 
   createTables(); 
   //CLOB对象插入测试 
   clobInsert("c:/clobInsert.txt"); 
   clobRead("c:/clobInsert.out"); 
   //CLOB对象修改测试 
   clobModify("c:/clobModify.txt"); 
   clobRead("c:/clobModify.out"); 
   //CLOB对象替换测试 
   clobReplace("c:/clobReplace.txt"); 
   clobRead("c:/clobReplace.out"); 
   //BLOB对象插入测试 
   blobInsert("c:/blobInsert.doc"); 
   blobRead("c:/blobInsert.out"); 
   //BLOB对象修改测试 
   blobModify("c:/blobModify.doc"); 
   blobRead("c:/blobModify.out"); 
   //BLOB对象替换测试 
   blobReplace("c:/blobReplace.doc"); 
   blobRead("c:/bolbReplace.out"); 
   //关闭资源退出 
   conn.close(); 
   System.exit(0); 
}
 
分享到:
评论
1 楼 Power_Song 2015-04-18  
  

相关推荐

    Mybatis 处理 CLOB、BLOB 类型数据

    Mybatis 处理 CLOB、BLOB 类型数据 MyBatis 处理 CLOB、BLOB 类型数据是指在使用 MyBatis ...通过使用 MyBatis 处理 CLOB 和 BLOB 类型数据,可以方便地存储和读取大字段类型的数据,提高应用程序的性能和可扩展性。

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

    - **数据量限制**:检查Oracle和MySQL对BLOB字段的大小限制,确保数据不会超出范围。Oracle的BLOB最大可存储4GB,而MySQL的LONGBLOB同样可存储4GB。 - **性能考虑**:大量BLOB数据的转换可能会消耗大量时间和带宽,...

    DELPHI的CLOB和BLOB存取处理.zip_DELPHI的CLOB和BLOB存取处理_hallzgz

    在数据库编程领域,CLOB(Character Large Object)和BLOB(Binary Large Object)...通过正确使用Stream对象、分块读写、异步操作,以及理解数据库特性和最佳实践,可以确保应用程序在处理大量数据时保持稳定和高效。

    判断blob字段是否为空

    在关系型数据库中,如Oracle、MySQL、SQL Server等,BLOB字段提供了一种高效的方式,用于处理和存储大数据量的非结构化信息。 ### 判断BLOB字段是否为空的必要性 在实际应用中,判断BLOB字段是否为空对于数据完整...

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

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

    解析使用jdbc,hibernate处理clob/blob字段的详解

    在Java的数据库操作中,`CLOB...总之,无论是使用JDBC还是Hibernate,处理`CLOB`和`BLOB`字段都需要特殊的处理方式,尤其是在Oracle等数据库中。了解这些处理方法对于开发涉及大数据量文本和二进制数据的应用至关重要。

    深入浅析mybatis oracle BLOB类型字段保存与读取

    在处理BLOB字段时,我们需要确保正确地映射和操作这些字段,以避免数据丢失或格式错误。 首先,我们来看表结构的创建。以下是一个包含BLOB字段的表`BLOB_FIELD`的示例: ```sql CREATE TABLE BLOB_FIELD ( ID ...

    oracle mysql sqlser2000对大数据对象的操作

    在IT领域,数据库管理系统(DBMS)如Oracle、MySQL和SQL Server 2000是处理大量数据的核心工具。这些系统对于大数据对象的操作至关重要,尤其是对于存储图像、音频、视频等非结构化数据的企业级应用。本文将深入探讨...

    hibernate保存blob,clob对象

    例如,Oracle和MySQL在处理大对象时有各自的API和策略。 总结,Hibernate通过`@Lob`注解支持BLOB和CLOB的持久化,开发者需要适当地将数据转换为对应的对象类型,然后使用Hibernate的CRUD操作进行保存和检索。同时,...

    java将图片写入数据库,并读出来(blob clob)

    其中,`imageData`是Blob字段,用于存储图片数据。 3. **读取图片并转换为Blob** 使用`FileInputStream`读取图片文件,然后将其转换为`Blob`对象。可以使用`PreparedStatement`的`setBlob()`方法将Blob对象设置为...

    ActiveXObject和Clob字段的插入更新

    此外,不同数据库管理系统(如MySQL、PostgreSQL、Oracle等)对Clob字段的支持和操作可能会有所不同,因此在使用时需要查阅相应的数据库文档。 总结,ActiveXObject和Clob字段分别代表了客户端脚本与服务器端组件的...

    DELPHI BLOB存取(ADO,ODAC)

    在IT行业中,数据库操作是开发过程中的重要环节,特别是在处理大量二进制数据时,如图像、音频或视频文件。BLOB(Binary Large Object)就是用于存储这类数据的数据类型。在Delphi编程环境下,我们可以使用两种主要...

    jdbc批量插入大字段

    在处理大量Blob数据时,传统的单条插入方式可能会导致性能低下,因为每条SQL语句都需要与数据库进行交互,这会增加网络传输和数据库处理的开销。因此,"jdbc批量插入大字段"这个话题旨在探讨如何高效地通过Java JDBC...

    Oracle的表结构转成Mysql的表结构

    - **数据类型转换**:Oracle中的`DATE`和`TIMESTAMP`类型会被转换为MySQL中的`DATETIME`类型,需要注意精度问题。 - **NUMBER类型的处理**:超大的`NUMBER`类型会直接转换为`BIGINT`,需要注意可能的精度损失。 - **...

    oracle+hibernate 处理blob +uploadify实例

    在IT领域,数据库管理和数据传输是至关...这种解决方案不仅适用于Oracle,理论上也适用于其他支持Blob类型的数据库,如MySQL和MSSQLServer。了解这些技术的组合使用,可以帮助开发者构建出高效、稳定的文件上传系统。

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

    在实际应用中,由于业务需求的变化或者数据处理的需要,有时候会涉及到将CLOB类型转换为其他类型的情况,比如VARCHAR2。这种转换的需求通常出现在以下几个场景: 1. **性能优化**:在某些情况下,CLOB类型的数据...

    mysql,sqlserver,oracle三种数据库的大对象存取解析.docx

    本文将对MySQL、SQL Server和Oracle这三种主流关系型数据库系统中的大对象存取进行详细解析。 **MySQL中的大对象存取** MySQL支持几种不同类型的BLOB类型,包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。这些类型...

    迁移mysql数据到oracle上

    - **大对象处理**:对于较大的BLOB/CLOB字段,需要注意特殊处理,确保数据不会丢失或损坏。 - **索引重建**:迁移完成后,在Oracle中重新创建索引,以优化查询性能。 - **事务管理**:如果源系统中有复杂的事务逻辑...

    ORACLE数据库中插入大字段数据的解决方法

    在实际应用中,需要确保代码正确处理了不同数据库之间的数据类型差异,比如MySQL的TEXT到ORACLE的CLOB,同时考虑到大字段的处理。 总结来说,处理ORACLE数据库中的大字段数据时,应关注存储模式选择、批量操作、...

Global site tag (gtag.js) - Google Analytics