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

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.beginTr ansaction(); 
    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"); 
} 
} 



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值