`
qindongliang1922
  • 浏览: 2190654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117712
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126126
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60066
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71442
社区版块
存档分类
最新评论

jdbc操作Blob和Clob字段与字符串的转换

阅读更多
Oracle的数据库里对于大字段存储,通常有3种类型,一种就是所谓的Blob类型,另一种就是Clob类型,第三种是NClob类型,关于这三者者的使用范围,应该说没有严格意义上的要求,但大部分场景下我用经常使用Blob存储二进制数据类型的东西,例如图片,单子流等,而使用Clob来存储大型文本数据,例如一篇文献,或一个xml等等,但是更好的情况下建议使用NClob来存储双字节的文本数据,三者的存储方式如下表格所示

BLOBbyte
CLOBchar
NCLOBdouble char

使用时候,需要注意,一般使用char类型,或者double char类型,不会出现乱码情况,而使用byte类型存储文本类型,非常容易出现乱码,这一点,笔者深有体会,也许你存文本进BLOB字段时你可能感觉没问题,但是在取出来转换时一些特殊符号,有时候就莫名其妙的乱码了。所以对于文本类型,建议还是使用CLOB,或者NCLOB存储,以避免一些乱码问题.


另外需要注意的是:
如果你的单数据量只有几千个字符,建议按照varchar/varchar2方式存储,这样提高访问速度。但是对于几万或者更多的字符量,建议按照lob(clob/nclob)方式。

以下有几点请注意:
(1)面对插入的情况,应该首先对插入的blob/clob所在字段,赋予一个empty_blob()或empty_clob。再以更新方式,流形式插入
(2)所有的blob/clob对象(jdbc基本标准)没有实现对象序列化,一般第三方(vender)类包可能会重新实现,比如weblogic的jDriver for oracle
(3)在从数据库获取clob/blob字段的时候,不一定就以blob/clob对象字节流获取(有可能就是以其它字节流方式获取)


下面给出blob与clob字段,在向数据库插入,以及读取时与字符串互相转换代码

(1) 插入BLOB字段类型
 File file = new File("E:\\测试图片\\dog.jpg");  
    int length = (int)file2.length();  
    InputStream f = new FileInputStream(file);  
    ps.setBinaryStream(1, f, length); 


(2) 数据库插入CLOB字段类型
 File file = new File("E:\\测试数据\\文献评估.txt");  
    int length = (int)file.length();  
    InputStream f = new FileInputStream(file);  
    ps.setAsciiStream(1, f, length);  

(3) BLOB字段转换成String字符串
 /**
	  * Blob字段的通用转换
	  * 注意可能出现乱码
	  * @return 转好的字符串,
	  * **/
	 public  String BlobToString(Blob blob){  
		   StringBuffer str=new StringBuffer();
		   //使用StringBuffer进行拼接
		   InputStream in=null;//输入字节流
		    try {  
		              in = blob.getBinaryStream();  
		            //一般接下来是把in的字节流写入一个文件中,但这里直接放进字符串  
		            byte[] buff=new byte[(int) blob.length()];  
		    //      byte[] buff=new byte[1024];  
		         //    byte[] b = new byte[blob.getBufferSize()];  
		        for(int i=0;(i=in.read(buff))>0;){  
		            str=str.append(new String(buff));  
		        }
		        return str.toString();
		       
		        
		        }catch (Exception e) {  
		        e.printStackTrace();  
		         } finally{
		        	 try{
		        	 in.close();
		        	 }catch(Exception e){
		        		 System.out.println("转换异常");
		        		 e.printStackTrace();
		        	 }
		         } 
		    return null;  
		}


(4) CLOB字段转换成String字符串
/**
	  * Clob字段的通用转换
	  * @return 转好的字符串,
	  * **/
	    public static String ClobToString(CLOB clob) throws SQLException, IOException {   
	        String reString = "";   //拼接变量
	        Reader is = clob.getCharacterStream();// 得到流   
	        BufferedReader br = new BufferedReader(is);   
	        String s = br.readLine();   
	        StringBuffer sb = new StringBuffer();   
	        while (s != null) {  
	        sb.append(s);   
	        s = br.readLine();   
	        }   
	    reString = sb.toString(); //转换成字符串,进行返回  
	    return reString;   
	    }   


(5) 将字符串转换成BLOB,或者CLOB字段类型
 /**注意笔者是 Oracle11g
	  * @param 需要转换的参数
	  * 字符串转换成BLOB,CLOB,以及BLOB,CLOB转换成字符串
	 * @throws Exception 
	  * 
	  * */
	 public void covert(String str) throws Exception{
	     
		  try {
			  Clob c = new SerialClob(str.toCharArray());//String 转 clob
			 	        Blob b = new SerialBlob(str.getBytes("GBK"));//String 转 blob
			  	//      也可以这样不传字符集名称,默认使用系统的
			  	//      Blob b = new SerialBlob(s1.getBytes());
			 	         
			  	        String clobString = c.getSubString(1, (int) c.length());//clob 转 String
			  	        String blobString = new String(b.getBytes(1, (int) b.length()),"GBK");//blob 转 String
			  	//      前面若没传入字符集名称,则这里也不需要传入,以免出错
			  	//      String blobString = new String(b.getBytes(1, (int) b.length()));
			  	         
			 	        System.out.println(clobString);
			 	        System.out.println(blobString);
			
		} catch (SerialException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }


至此,大字段的数据类型的转换,插入,都可以实现了,另外需要注意的是,笔者的测试是在JDK7的版本和Oracle 11g的数据库下测试的,一些低的版本的JDK有些API可能不一样。



分享到:
评论
1 楼 eshore_pal 2013-08-19  
楼主有没有遇到过这种情况:通过ps.setString(4, log.getOutputData());outputdata数据库字段类型是NCLOB,如果outputdata字段长度太长就会出现乱码的情况。测试过1900个字符不会有乱码,超过1900个字符就出现乱码了。

相关推荐

    JDBC中操作Blob、Clob等对象

    ### JDBC中操作Blob、Clob等对象 ...通过以上的示例可以看出,操作Blob和Clob数据实际上与处理普通的字符串或整型数据类似,只需要掌握相应的API即可。这对于处理多媒体文件或大量文本数据的应用程序来说是非常有用的。

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

    CLOB 字段可以存储大量的 Unicode 字符串数据,并提供了高效的读写机制。 将 Image 类型数据导出到 Oracle 的 CLOB 字段中 为了将 SQL Server 中的 Image 类型数据导出到 Oracle 的 CLOB 字段中,我们需要使用Java...

    hibernate保存blob,clob对象

    在上面的代码中,`SerialBlob`是JDBC API提供的一个类,用于将字节数组转化为Blob对象,而`StringClob`可能需要特定的库来实现,如Apache Commons Lang的`StringUtils.toClob()`方法。 在检索大型对象时,Hibernate...

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

    - **图片转二进制/字符串**:对图片进行读取,如果是使用`CLOB`,需要将图片转换为Base64字符串;如果是`BLOB`,则直接读取二进制流。 - **插入数据**:通过SQL插入语句,将转换后的图片数据插入到相应的字段中。 ...

    解析jdbc处理oracle的clob字段的详解

    - JDBC提供了对CLOB字段的操作接口,包括`java.sql.Clob`,通过它可以在数据库和应用程序之间读写CLOB数据。 3. **empty_clob()函数**: - 在插入CLOB数据时,如果值是空的,可以使用Oracle SQL的`empty_clob()`...

    oracle Blob Clob 大数处理 代码

    在创建表时,可以添加Blob或Clob字段来存储大对象。例如: ```sql CREATE TABLE MyTable ( ID NUMBER PRIMARY KEY, BlobData BLOB, ClobData CLOB ); ``` 2. **插入数据**: 插入Blob数据通常需要使用`UTL...

    关于Clob类型在Hibernate中 的应用小结

    在写入时,先将字符串转换为Clob对象,再由Hibernate处理;读取时,将Clob内容转化为字符串。这种方式适用于数据量不是特别大的情况,因为所有数据都需要在内存中进行转换。 3. **直接使用Clob类型**: Hibernate...

    各大数据库类型与JDBC中介数据类型的转换对比

    ### 各大数据库类型与JDBC中介数据类型的转换对比 在进行数据库开发时,了解不同数据库管理系统(DBMS)的数据类型及其与Java Database Connectivity (JDBC)中的数据类型的对应关系至关重要。这有助于确保数据能够...

    Oracle函数_JDBC常用写法

    4. **转换函数**:如`CAST`用于类型转换,`TO_NUMBER`将字符串转换为数值,`TO_CLOB`和`TO_BLOB`用于转换大对象。 在`oracle日期函数集锦.txt`中,我们可能会看到更多关于日期处理的函数,比如`EXTRACT`用于提取...

    Spring+Hibernate处理Oracle lob字段(一)

    最后,当从数据库中读取LOB数据时,可以将其转换为文件或字符串: ```java Blob blob = myEntity.getImage(); InputStream blobInputStream = blob.getBinaryStream(); // 使用blobInputStream写出到文件... Clob ...

    Struts2 Hibernate存取Oracle数据库中的BLOB数据.pdf

    - LONG和LONG RAW:用于存储可变长的字符串数据和二进制数据,但有长度限制,每个表中只能有一个LONG字段,并且最长为2GB。 - CLOB(字符大对象):用于存储大型文本数据,与字符集相关联,支持文本型数据,如历史...

    java 多线程操作数据库

    示例中,`ThreadUseExtends`类的构造函数接收BLOB和CLOB文件名作为参数,并在运行时读取这些文件的内容,将其转换为字节数组或字符串,然后插入到数据库相应的字段中。 5. **并发控制与事务管理**:在多线程环境下...

    Base64及oracle11g的jar.zip

    在处理CLOB数据时,如果需要将二进制数据(例如图片或PDF文件)存储到CLOB字段,我们可以先用Base64编码将二进制数据转换为字符串,然后存入CLOB;读取时再进行反向解码,恢复为原始的二进制数据。 在Java中,操作...

    jdbc连接及数据库操作

    连接字符串格式为: ``` Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); jdbc:odbc:[odbcsource] ``` 其中`odbcsource`是ODBC数据源名称。 2. **Native-API驱动**:这种方式不通过ODBC,而是直接使用数据库...

    JDBC中的Results相关函数

    例如,对于日期类型,最好使用`getDate()`、`getTime()`或`getTimestamp()`而不是转换为字符串后再解析。对于数值类型,使用`getBigDecimal()`来处理可能的精度丢失问题。对于Blob和Clob类型,直接获取对应的对象...

    Hibernate操作数据库大字段的示例(附源码及详细开发使用方法)。

    2. **查询大字段**:查询时,大字段将以字符串形式返回,可以直接访问。 ```java Long articleId = ...; Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Article...

    巧妙解决Oracle NClob读写问题(经验分享)

    另一个被提及的方法是`setStringForClob`,这可能是一个自定义方法,旨在将字符串写入NCLOB字段。然而,这种方法也不够优雅,因为它可能需要额外的转换和处理,增加了代码复杂性。 在Oracle官方文档中,推荐了一种...

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据

    在Java开发中,当需要与Oracle数据库交互时,特别是涉及到XML数据的存储,XMLType是Oracle提供的一种专门用于存储XML格式数据的类型。本文将详细探讨如何使用Java的JDBC和MyBatis框架来处理Oracle中的XMLType数据。 ...

Global site tag (gtag.js) - Google Analytics