JAVA处理Oracle数据库CLOB读写操作

Oracle中大字段的存储使用CLOB类型,但是该类型却不能像其他类型一样直接在POJO中读写。针对这个问题,网上有各种不同的方法,但是有些却太过复杂,有些又言语不清,看不明白,所以我在此讲述一下其中一种最简单的方法。

在创建POJO时,多创建一个String类型来处理这个CLOB的读写。

现在有数据库字段如下:

  id varchar2(32) not null primary key,
  title varchar2(255) unique,
  content clob,

那么POJO中的字段如下:

private String id;
private String title;
private Clob content;
private String contentString;  //存放content内容


contentString 用于与页面交互,即页面显示时读取的是些变量,页面提交时内容也存放在此变量中。但在框架的映射中并不配置此变量,如下:

<id name="id" type="java.lang.String">
	<column name="ID" length="18" /> 
	<generator class="assigned"></generator>
</id> 
<property name="title" type="java.lang.String">
	<column name="TITLE"/>    
</property>
<property name="content" type="java.sql.Clob">
	<column name="CONTENT"/>    
</property>

下边来看看在JAVA中如何使用。

读取时,先将content(CLOB)中的内容放到contentString(String)中,然后可以再页面直接使用contentString 。

JAVA中:

webContent = list.get(0);	//list 是从数据库中查询出的所有内容
if(webContent.getContent() != null && !"".equals(webContent.getContent())) {
	Clob clob = webContent.getContent();
	try {
		//getSubString(L, L) 方法将Clob 转成String;参数1:开始位置(第1个数为:1),参数2:长度
		String content = webContent.getContent().getSubString(1L, (int)clob.length());
		webContent.setContentString(content);
	} catch (SQLException e) {
		System.out.println("内容读取错误!");
		e.printStackTrace();
	}
}

页面中使用时就和平常的String一样:

<%=webContent.getContentString() %>
<!--在struts2中也可以这样写-->
${webContent.contentString}

写入时,将contentString(String)中的内容赋值到content(CLOB)中,直接如其他变量一般存储就行。

String content = (String) request.getParameter("contentString");
if(content != null && !"".equals(content)) {
	webContent.setContent(Hibernate.createClob(content));
	/*
	 * 如没有使用Hibernate
	 * java.sql.Clob clob = new javax.sql.rowset.serial.SerialClob(content.toCharArray());
	 * webContent.setContent(clob);
	 */
} else {
	content="";
	webContent.setContent(Hibernate.createClob(content));
}
this.getHibernateTemplate().saveOrUpdate(webContent);

如未用Hibernate时,使用注释的内容,有可能报如下错误:

java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob

如报此错误,DAO中保存时如下:

String sql = "insert into tableName(id, title, content) values ('1', 'test', ?) ";  
PreparedStatement pstmt=con.prepareStatement(sql);  

java.io.Reader clobReader = new java.io.StringReader(contentString);   
psm.setCharacterStream(1, clobReader, str.length());


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值