您的位置:首页 > 数据库 > Oracle

hibernate在SSH框架操作ORACLE Clob字段类型的读写改

2008-08-06 17:58 459 查看
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");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息