数据库在当今的应用越来越广泛了,同样伴随着领域的广泛,存储的内容也不在是只有数值、字符、boolean几种类型,而是越来越多样化。在这样的前提下就出现了Blob和Clob两个类型。下面我将对这个两个类型在JDBC中的应用,进行一个简短的介绍
Blob是指二进制大对象也就是英文Binary Large Object的所写,而Clob是指大字符对象也就是英文Character Large Object的所写。由此可见这两个类型都是用来存储大量数据而设计的,其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。
那么有人肯定要问既然已经有VARCHAR和VARBINARY两中类型,为什么还要再使用另外的两种类型呢?其实问题很简单,VARCHAR和 VARBINARY两种类型是有自己的局限性的。首先说这两种类型的长度还是有限的不可以超过一定的限额,以VARCHAR再ORA中为例长度不可以超过 4000;那么有人又要问了,LONGVARCHAR类型作为数据库中的一种存储字符的类型可以满足要求,存储很长的字符,那为什么非要出现CLOB类型呢?其实如果你用过LONGVARCHAR类型就不难发现,该类型的一个重要缺陷就是不可以使用LIKE这样的条件检索。(稍候将介绍在CLOB中如何实现类似LIKE的模糊查找)另外除了上述的问题外,还又一个问题,就是在数据库中VARCHAR和VARBINARY的存取是将全部内容从全部读取或写入,对于100K或者说更大数据来说这样的读写方式,远不如用流进行读写来得更现实一些。
在JDBC中有两个接口对应数据库中的BLOB和CLOB类型,java.sql.Blob和java.sql.Clob。和你平常使用数据库一样你可以直接通过ResultSet.getBlob()方法来获取该接口的对象。与平时的查找唯一不同的是得到Blob或Clob的对象后,我们并没有得到任何数据,但是我们可以这两个接口中的方法得到数据
例如:
Blob b=resultSet.getBlob(1);
InputStream bin=b.getBinaryStryeam();
Clob c=resultSet.getClob(2);
Reader cReader=c.getCharacterStream():
关于Clob类型的读取可以使用更直接的方法,就是直接通过ResultSet.getCharacterStream();方法获得字符流,但该方法并不安全,所以建议还是使用上面例子的方法获取Reader。
另外还有一种获取方法,不使用数据流,而是使用数据块。
例如
Blob b=resultSet.getBlob(1);
byte data=b.getByte(0,b.length());
Clob c=resultSet.getClob(2);
String str=c.getSubString(0,c.length()):
在这里我要说明一下,这个方法其实并不安全,如果你很细心的话,那很容易就能发现getByte()和getSubString()两个方法中的第二个参数都是int类型的,而BLOB和CLOB是用来存储大量数据的。而且Bolb.length()和Clob.length()的返回值都是long类型的,所以很不安全。这里不建议使用。但为什么要在这里提到这个方法呢?稍候告诉你答案,这里你需要记住使用数据块是一种方法。
在存储的时候也同样的在PreparedStatement和CallableStatememt中,以参数的形式使用setBlob()和 setClob方法把Blob和Clob对象作为参数传递给SQL。这听起来似乎很简单对吧,但是并非我们想象的这样,很不幸由于这两个类型的特殊, JDBC并没有提供独立于数据库驱动的Blob和Clob建立对象。因此需要自己编写与驱动有关的代码,但这样又牵掣到移植性。怎样才是解决办法呢?这就要用到前面说过的思想了使用数据块进行写操作。同样用PreparedStatement和CallableStatememt类,但参数的设置可以换为 setAsciiStream、setBinaryStream、setCharacterStream、setObject(当然前3个同样存在长度的问题)
下面给大家个例子以方便大家理解
public void insertFile(File f) throws Exception{
FileInputStream fis=new FileInputStream(f,Connection conn);
byte[] buffer=new byte[1024];
data=null;
int sept=0;int len=0;
while((sept=fis.read(buffer))!=-1){
if(data==null){
len=sept;
data=buffer;
}else{
byte[] temp;
int tempLength;
tempLength=len+sept;
temp=new byte[tempLength];
System.arraycopy(data,0,temp,0,len);
System.arraycopy(buffer,0,temp,len,sept);
data=temp;
len=tempLength;
}
if(len!=data.length()){
byte temp=new byte[len];
System.arraycopy(data,0,temp,0,len);
data=temp;
}
}
String sql="insert into fileData (filename,blobData) value(?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,f.getName());
ps.setObject(2,data);
ps.executeUpdate();
}
最后由于刚刚说过Clob类型读取字符的长度问题,这里再给大家一段代码,希望对你有帮助
public static String getClobString(ResultSet rs, int col) {
try {
Clob c=resultSet.getClob(2);
Reader reader=c.getCharacterStream():
if (reader == null) {
return null;
}
StringBuffer sb = new StringBuffer();
char[] charbuf = new char[4096];
for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
sb.append(charbuf, 0, i);
}
return sb.toString();
} catch (Exception e) {
return "";
}
}
另外似乎前面还提到过LIKE检索的问题。LONGVARCHAR类型中不可以用LIKE查找(至少ORA中不可以使用,其他的数据库我没有试过),在ORA中我们可以使用这样一个函数dbms_lob.instr来代替LIKE来个例子吧
select docid,dat0 from text where dbms_lob.instr(dat0,'魏',1,1)>0
在text表中有两个字段docid用来放文档编号dat0为clob类型存放文章内容;这句话的意思就是检索第一条dat0中出现第一次"魏"字的数据。听起来这个检索的数据有点象google的“手气不错”
以上只是对数据库中比较特殊的两个类型做了简单的说明,希望能对你有所帮助;另外笔者也只是对ORA数据库有一点点的了解,其他的数据库不是很清楚,如果有什么不对的地方也请各位指出,可以通过邮件联系我zuyingwei@hotmail.com或merlin_wei@hotmail.com
分享到:
相关推荐
Oracle的LOB解决方案进一步完善了其数据库管理系统,使得存储和访问大非结构化数据变得更加便捷和统一。 总的来说,这篇文章深入浅出地讲解了Oracle数据库如何使用LOB类型存储非结构化数据,以及如何通过JDBC接口...
##### 解决方案 1. **插入数据时的编码转换**: - 将中文数据从 GB2312 转换成 ISO8859_1 编码格式再插入数据库。 ```java String gbData = "中文"; String isoData = ECov.gb2asc(gbData); // 使用自定义方法...
为了解决这些问题,他提出了将Excel文件直接存储在Oracle数据库的BLOB字段中的方案。 Oracle的BLOB类型允许存储高达4GB的二进制数据,适合Excel文件的存储需求。然而,由于BLOB数据的特殊性,不能像普通字段那样...
总结来说,MySQL、SQL Server和Oracle都提供了各自的大对象存储解决方案,主要通过BLOB或类似的类型实现,存取大对象时通常涉及流操作。在使用过程中,需要注意每个数据库系统的具体限制和配置,以及选择合适的数据...
在设计和实现大对象数据存取的解决方案时,还需要考虑数据的持久化、备份恢复、安全性以及性能优化等问题。例如,使用物化视图或索引来加速查询,或者使用分区策略来管理大型LOB表,以提高查询和维护的效率。 综上...
在Oracle中处理大对象时,理解这些限制和解决方案是非常重要的,特别是在处理大数据量或长文本内容的应用场景下。同时,需要注意的是,对于存储大量数据的字段,应该考虑性能和存储效率,合理使用索引和分区策略,以...
这款组件提供了快速且可靠的Oracle数据存取解决方案,旨在优化应用程序性能并提升开发效率。 首先,OraDirect .NET的核心功能在于其与Oracle数据库的直接通信能力。它绕过了传统的Oracle客户端库,如ODP.NET,减少...
在Oracle中,LOB分为两类:BLOB用于存储二进制数据,而CLOB用于存储文本数据。由于Word文件通常包含文本、图片、表格等复杂元素,因此它们属于二进制数据,应使用BLOB类型存储。在Oracle中定义BLOB字段后,可以通过...
通过Oracle的LOB数据类型和PB的API,开发者可以轻松地实现对大型二进制对象的存储和检索,这对于需要处理大量多媒体数据的应用程序(如医疗保险系统)来说,是非常有价值的解决方案。同时,这种方法也展示了关系型...
在C++ Builder中,由于没有内置的BLOB操作类,使用`SafeArray`和`Variant`提供了一种通用且灵活的解决方案。这种方法不仅可以处理BLOB数据,还可以扩展到处理其他类型的LOB数据,如CLOB。通过这种方式,开发者可以在...
无论是简单大对象的批量传输,还是智能大对象的高效随机访问,都能为开发者提供灵活且高效的解决方案。想要了解更多关于GBase 8s的信息,可以访问官方网站www.gbase.cn获取详细文档和技术支持。
Oracle数据库的大型对象(LOBS)存储技术应运而生,为这类非结构化数据提供了有效的管理和存储解决方案。 大型对象数据存储技术,顾名思义,是将大型、非结构化的数据块直接存储在数据库中,以便利用数据库的管理...
【论文贡献】该论文介绍了如何基于OCI封装数据引擎,实现对Oracle中的海量数据进行存取操作,这对于解决三维GIS中海量数据的存储和访问问题提供了有效的解决方案。通过这样的数据引擎组件,可以更高效、安全地管理和...
此外,Oracle数据库提供的大数据字段支持,如BLOB和CLOB类型,也可以用于存储航空物探的大规模二进制或文本数据。同时,Oracle的事务处理能力、并发控制和数据完整性机制,确保了在高并发环境下数据的一致性和可靠性...
总的来说,"odac 9.4.14 professional Retail for delphi XE bpl版" 是为 Delphi XE 用户提供的一个强大且稳定的 Oracle 数据存取解决方案,旨在简化 Oracle 数据库的开发工作,并提供高效的数据库访问性能。
在IT行业中,数据库管理和数据存取是至关重要的环节,尤其是对于开发者来说。...C++ Builder是一种集成开发环境(IDE),它提供了C++语言的编译器和RAD(快速...对于处理大量非结构化数据的应用,这样的解决方案非常实用。
1. **使用CLOB类型**:当VARCHAR2类型无法满足需求时,CLOB是理想的解决方案,它能处理远超VARCHAR2的字符串长度。 2. **分段操作**:对于非常大的字符串,可以将其分段并逐段追加到CLOB中,以避免一次性加载整个...
在兰州重粒子加速器(HIRFL)的Web网络数据库架构...通过结合多种编程技术和数据库操作,提出了一个高效的解决方案,并详细阐述了其技术细节和实现过程。这对于在高性能计算环境下进行大规模数据管理具有重要的借鉴意义。
这个文件通常会包含版本变更日志、系统需求、兼容性说明以及可能的已知问题和解决方案。 总之,ODAC是开发人员在Delphi和C++ Builder环境下构建Oracle数据库应用程序的强大工具,其丰富的功能和优秀的性能使其成为...
Oracle支持的LOBs数据类型包括BLOB(Binary Large Object)和CLOB(Character Large Object)两种,它们用于存储大量无格式的二进制数据或字符数据,容量最大可达4Gbyte。由于波形序列数据类似于声音流数据,因此更...