1问题描述 当我们需要操作大于 4000 字节的数据(字段)时,我们就需要用到 oracle 的 CLOB 数据类 型。在对其进行操作时主要有以下三种方案:采用传统的 jbdc 方式、把 clob 以 string 方式处理和直接使用 CLOB 类型三种方案,下面分别作简要介绍。
2对 CLOB 数据类型的操作
2.1方式一 传统的 jdbc 方式写入 Blob/Clob 字段和写入其它类型字段的方式非常不同, 因为 Blob/Clob 自身有一个 cursor, 必须使用 cursor 对 Blob/Club 进行操作,因而在写入 Blob/Club 之前,必须获得 cursor 才能 进行写入,那就需要先插入一个 empty 的 Blob/Club,这将创建一个 Blob/Club 的 cursor,然 后再把这个 empty 的 Blob/Club 的 cursor 用 select 查询出来,这样通过两步操作,就获得了 Blob/Club 的 cursor,可以真正的写入 Blob/Club 数据了。这种方式比较麻烦,读写都要增加 不少工作量。有关此方法的具体实现代码请参照示例一。
2.2方式二 把 CLOB 以 String 方式处理 此方法主要是通过继承net.sf.hibernate.type.ImmutableType 类或 cirrus.hibernate.UserType 类来创建一个新的类如:StringClobType,然后在相应的配置文件里面,把该字段映射为 StringClobType 类型,即可正常操作。此方法的优点主要体现在具体实现操作的代码较为简 单,但在第一步的映射问题上,较难理解。有关此方法的具体实现代码请参照示例二。
2.3方式三 直接使用 CLOB 类型第三种方法是直接使用 clob 类型,它主要是在实体中增加一个 clobString 字段,通过对该字 段的读写,在 DAOImpl 层进行特殊处理后,转换为真正的 clob 类型,从而实现 clob 类型字段的 CRUD 操作。此方法主要优点体现在配置文件的映射类型上,只需要像映射其它基本 类型一样, 直接写上 type="clob" 就 OK 了。 这对初次遇到这种问题的人来说入门相对容易。
2.3.1使用方法 下面以文章(只考虑文章标题和文章内容)为例介绍其使用方法。
2.3.2基本配置 1. 实体类配置在正常情况下文章实体类如下所示:
packagetestCLOB;
publicclass Article
{
private String title;
private String content;
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public String getContent()
{
return content;
}
public void setContent(String content)
{ this.content = content; }
}
但是由于需要使用 CLOB 数据类型,该实体类需要进行如下变化:
package com.maskhr.jhb;
import java.sql.Clob;
public class Article
{ private String title;
private Clob content;
private String contentString;
public String getTitle()
{
return title;
}
public void setTitle(Stringtitle)
{
this.title = title;
}
public Clob getContent()
{
return content;
}
public void setContent(Clobcontent)
{
this.content = content;
}
public String getContentString()
{
return contentString;
}
public voidsetContentString(String contentString)
{
this.contentString = contentString;
}
}
其中 contentString 并不映射到数据库的 CLOB 字段,只是方便用户使用 get / set 处理 CLOB 字段
2. hibernate 映射文件 在该实体对应的映射文件里只需要增加下面一行,直接声明该字段为 clob 类型。
< propertyname="content " column="CONTENT_CLOB" type="clob"/>