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

2024-05-15 05:08

本文主要是介绍jdbc操作Blob和Clob字段与字符串的转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

[b][size=large]另外需要注意的是:
如果你的单数据量只有几千个字符,建议按照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对象字节流获取(有可能就是以其它字节流方式获取) [/size][/b]

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

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


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

[b](3) BLOB字段转换成String字符串[/b]
 /**
* 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;
}


[b](4) CLOB字段转换成String字符串[/b]
/**
* 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;
}


[b](5) 将字符串转换成BLOB,或者CLOB字段类型[/b]
 /**注意笔者是 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();
}
}


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

这篇关于jdbc操作Blob和Clob字段与字符串的转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990896

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark