java clob 处理大字段-详细
string ==> clob //处理 大字段 CLOB eventEvents.setEventContent(Hibernate.createClob(" "));eventRepository.addEvent(eventEvents);/* 处理clob字段 */SerializableClob sc = (SerializableClob)eventEvents.getEventContent();//Clob wrapclob = sc.getWrappedClob();// 这里的Clob是java.sql.ClobCLOB clob = (CLOB) wrapclob;// 这里的CLOB是oracle.sql.CLOBWriter writer = clob.getCharacterOutputStream();writer.write(eventVO.getEventContent());// kybasicInfo.getInfoContentToString()是String类型的,在action里就是传这个进来,然后再通过文件流形式写成CLOB字段中writer.close();clob ==> string //处理大字段try {Clob clob=event.getEventContent();evo.setEventContent(IOUtils.toString(clob.getCharacterStream()));String eventContent = IOUtils.toString(clob.getCharacterStream());ServletActionContext.getRequest().setAttribute("eventContent",eventContent);System.out.println("CLOB = "+clob.getCharacterStream());public void modifyEvent(EventEvents event) throws DAOException {this.update(event);this.getMyHibernateTemplate().flush();this.getMyHibernateTemplate().refresh(event);}
JAVA操作CLOB类型的数据库字段还是有点麻烦,虽然CLOB不像BLOB那样是用二进制来存值,但不能当成普通的String来操作,当初操作ORACLE这种字段类型时,可把我折腾了半天,现将如何操作的步骤写了个比较详细的例子和说明,以供大家参考.这里只写最关键的几个地方,其它的地方平时该怎么写就怎么写首先是POJO类:import java.sql.Clob;import java.util.Date;/**** @author coffee**/public class KybasicInfo implements java.io.Serializable {private Long infoId;private String infoTitle;private String infoKeyword;private Clob infoContent; //注意这个地方是java.sql.Clob类型的,生成默认是String类型的,需要手工改一下private String infoContentToString; //这个是和infoContent做转换时,手工添加的一个,不和数据库里的字段进行对应的private Long infoTop;private String userSno;private Date infoTime;private Long icId;private String infoStandby1;private String infoStandby2;private String infoStandby3;private Long infoStandby4;private Long infoStandby5;private Long infoStandby6;public KybasicInfo() {}public KybasicInfo(String infoTitle, String infoKeyword, Clob infoContent, Long infoTop, String userSno, Date infoTime, Long icId, String infoStandby1, String infoStandby2, String infoStandby3, Long infoStandby4, Long infoStandby5, Long infoStandby6) { this.infoTitle = infoTitle; this.infoKeyword = infoKeyword; this.infoContent = infoContent; this.infoTop = infoTop; this.userSno = userSno; this.infoTime = infoTime; this.icId=icId; this.infoStandby1 = infoStandby1; this.infoStandby2 = infoStandby2; this.infoStandby3 = infoStandby3; this.infoStandby4 = infoStandby4; this.infoStandby5 = infoStandby5; this.infoStandby6 = infoStandby6;}public Long getInfoId() { return this.infoId;}public void setInfoId(Long infoId) { this.infoId = infoId;}public String getInfoTitle() { return this.infoTitle;}public void setInfoTitle(String infoTitle) { this.infoTitle = infoTitle;}public String getInfoKeyword() { return this.infoKeyword;}public void setInfoKeyword(String infoKeyword) { this.infoKeyword = infoKeyword;}public Clob getInfoContent() { return this.infoContent;}public void setInfoContent(Clob infoContent) { this.infoContent = infoContent;}public Long getInfoTop() { return this.infoTop;}public void setInfoTop(Long infoTop) { this.infoTop = infoTop;}public Date getInfoTime() { return this.infoTime;}public void setInfoTime(Date infoTime) { this.infoTime = infoTime;}public String getInfoStandby1() { return this.infoStandby1;}public void setInfoStandby1(String infoStandby1) { this.infoStandby1 = infoStandby1;}public String getInfoStandby2() { return this.infoStandby2;}public void setInfoStandby2(String infoStandby2) { this.infoStandby2 = infoStandby2;}public String getInfoStandby3() { return this.infoStandby3;}public void setInfoStandby3(String infoStandby3) { this.infoStandby3 = infoStandby3;}public Long getInfoStandby4() { return this.infoStandby4;}public void setInfoStandby4(Long infoStandby4) { this.infoStandby4 = infoStandby4;}public Long getInfoStandby5() { return this.infoStandby5;}public void setInfoStandby5(Long infoStandby5) { this.infoStandby5 = infoStandby5;}public Long getInfoStandby6() { return this.infoStandby6;}public void setInfoStandby6(Long infoStandby6) { this.infoStandby6 = infoStandby6;}public String getUserSno() { return userSno;}public void setUserSno(String userSno) { this.userSno = userSno;}public Long getIcId() { return icId;}public void setIcId(Long icId) { this.icId = icId;}public String getInfoContentToString() { return infoContentToString;}public void setInfoContentToString(String infoContentToString) { this.infoContentToString = infoContentToString;}}hbm.xml配置文件<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="kymanage.kybasic.vo.KybasicInfo" table="KYBASIC_INFO" schema="BL"> <id name="infoId" type="java.lang.Long"> <column name="INFO_ID" precision="22" scale="0" /> <generator type="java.lang.String"> <column name="INFO_TITLE" length="100" /> </property> <property name="infoKeyword" type="java.lang.String"> <column name="INFO_KEYWORD" length="100" /> </property> <!--注意:这里要将默认生成的String类型改成java.sql.Clob--> <property name="infoContent" type="java.sql.Clob"> <column name="INFO_CONTENT" /> </property> <property name="infoTop" type="java.lang.Long"> <column name="INFO_TOP" precision="38" scale="0" /> </property> <property name="userSno" type="java.lang.String"> <column name="USER_SNO" length="100" /> </property> <property name="infoTime" type="java.util.Date"> <column name="INFO_TIME" length="7" /> </property> <property name="icId" type="java.lang.Long"> <column name="IC_ID" precision="38" scale="0" /> </property> <property name="infoStandby1" type="java.lang.String"> <column name="INFO_STANDBY1" length="100" /> </property> <property name="infoStandby2" type="java.lang.String"> <column name="INFO_STANDBY2" length="100" /> </property> <property name="infoStandby3" type="java.lang.String"> <column name="INFO_STANDBY3" length="100" /> </property> <property name="infoStandby4" type="java.lang.Long"> <column name="INFO_STANDBY4" precision="38" scale="0" /> </property> <property name="infoStandby5" type="java.lang.Long"> <column name="INFO_STANDBY5" precision="22" scale="0" /> </property> <property name="infoStandby6" type="java.lang.Long"> <column name="INFO_STANDBY6" precision="22" scale="0" /> </property> </class></hibernate-mapping>hibernate DAO类:import oracle.sql.CLOB;import java.io.IOException;import java.io.Writer;import java.sql.Clob;import java.sql.SQLException;import java.util.Date;import java.util.Iterator;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.hibernate.Hibernate;import org.hibernate.LockMode;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.lob.SerializableClob;import org.springframework.context.ApplicationContext;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;/*** kybasicInfo** @author coffee**/public class KybasicInfoDAOImpl extends HibernateDaoSupport {protected void initDao() {}//新增,在action里将表单中的这个大文本按正常情况传过来,也就是传String类型过来,然后,再在DAO里做Clob类型转换,//这里面可能会有其它层来传参,但最终还是将传过来的Stirng转换成Clob型的,然后通过文件流形式写入到CLOB字段中去public void save(KybasicInfo kybasicInfo) { try { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); Transaction tran=session.beginTransaction(); kybasicInfo.setInfoContent(Hibernate.createClob(" "));//注意,这里的参数是个空格,先新增一个空的Clob进去 session.save(kybasicInfo); session.flush();//强制执行 session.refresh(kybasicInfo,LockMode.UPGRADE); SerializableClob sc=(SerializableClob)kybasicInfo.getInfoContent();//kybasicInfo.getInfoContent()是Clob类型的 Clob wrapclob=sc.getWrappedClob();//这里的Clob是java.sql.Clob CLOB clob=(CLOB)wrapclob;//这里的CLOB是oracle.sql.CLOB Writer writer=clob.getCharacterOutputStream(); writer.write(kybasicInfo.getInfoContentToString());//kybasicInfo.getInfoContentToString() 是String类型的,在action里就是传这个进来,然后再通过文件流形式写成CLOB字段中 writer.close(); session.save(kybasicInfo); tran.commit(); } catch (RuntimeException re) { throw re; } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}//更新,操作的新增是一样的,都是先接收String类型的参数过来,然后再将String的转成CLOB类型的public void update(KybasicInfo persistentInstance) { try { Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); Transaction tran=session.beginTransaction(); persistentInstance.setInfoContent(Hibernate.createClob(" ")); session.update(persistentInstance); session.flush(); session.refresh(persistentInstance,LockMode.UPGRADE); SerializableClob sc=(SerializableClob)persistentInstance.getInfoContent(); Clob wrapclob=sc.getWrappedClob(); CLOB clob=(CLOB)wrapclob; Writer writer=clob.getCharacterOutputStream(); writer.write(persistentInstance.getInfoContentToString()); writer.close(); session.update(persistentInstance); tran.commit(); } catch (RuntimeException re) { throw re; } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}//读取Clob字段值public KybasicInfo findById(java.lang.Long id) { try { KybasicInfo instance = (KybasicInfo) getHibernateTemplate().get( "kymanage.kybasic.vo.KybasicInfo", id); Clob clob=instance.getInfoContent();//取得Clob的值 if(clob!=null){ String clobString=""; try { clobString = clob.getSubString(1, (int)clob.length());//将Clob类型的值转换成String类型的值 instance.setInfoContentToString(clobString);//通过setter方法,设置String值,然后就可以通过instance.getInfoContentToString()来取值了 } catch (SQLException e) { e.printStackTrace(); } } return instance; } catch (RuntimeException re) { throw re; }}public static KybasicInfoDAOImpl getFromApplicationContext( ApplicationContext ctx) { return (KybasicInfoDAOImpl) ctx.getBean("KybasicInfoDAO");}}