string ==> clob //处理 大字段 CLOB eventEvents.setEventContent(Hibernate.createClob(" ")); eventRepository.addEvent(eventEvents); /* 处理clob字段 */ SerializableClob sc = (SerializableClob)eventEvents.getEventContent();// Clob wrapclob = sc.getWrappedClob();// 这里的Clob是java.sql.Clob CLOB clob = (CLOB) wrapclob;// 这里的CLOB是oracle.sql.CLOB Writer 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",eve ntContent); 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 class="sequence"> <param name="sequence">INFO_ID</param> </generator> </id> <property name="infoTitle" 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"); } }