`

SSH中操作Oracle Clob类型字段

 
阅读更多

说明:使用以下方法时首先确认你已经配置好了

如果运行报:org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); :Session session = getHibernateTemplate().getSessionFactory().openSession();记得关闭session

 

以下内容转自http://hi.baidu.com/sunjsp/blog/item/9ca1fedb73c86e60d0164ec2.html

 

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();//
这里的Clobjava.sql.Clob
    CLOB clob=(CLOB)wrapclob;//
这里的CLOBoracle.sql.CLOB
    Writer writer=clob.getCharacterOutputStream();
    writer.write(kybasicInfo.getInfoContentToString());//kybasicInfo.getInfoContentToString()
String类型的,action里就是传这个进来,然后再通过文件流形式写成CLOB字段中
    writer.close();

    session.update(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");
}
}

分享到:
评论

相关推荐

    java中操作oracle的CLOB字段精解

    Java 中操作 Oracle 的 CLOB 字段是一种常见的操作,在实际开发中,我们经常需要在 Oracle 数据库中存储和读取大型文本数据,这时就需要使用 CLOB(Character Large OBject)类型的字段来存储这些数据。下面我们将...

    关于oracle clob 类型字段重建索引SQL及修复用户表空间索引空间的存储过程

    在Oracle数据库中,CLOB(Character Large Object)类型字段用于存储大量的文本数据,如XML文档、长篇文章等。由于其特殊性,处理CLOB类型的字段时可能会遇到性能问题,特别是当涉及索引时。本话题将围绕如何针对...

    ORACLE中CLOB字段转String类型

    ### ORACLE中CLOB字段转String类型 在Oracle数据库中,`CLOB`(Character Large Object)是一种用于存储大量文本数据的数据类型。由于其能够存储非常大的文本块(最大可达4GB),因此常被用于存储文章、报告或任何...

    运用Java如何存取Oracle中的CLOB类型字段

    在IT领域,尤其是在数据库操作与Java编程的交集部分,理解和掌握如何在Java中存取Oracle数据库中的CLOB(Character Large Object)类型字段是至关重要的技能。CLOB数据类型主要用于存储大量的文本信息,如文章、报告...

    sql server中的image类型的数据导出到oracle的clob字段中

    SQL Server 中 Image 类型数据导出到 Oracle 的 CLOB 字段中 在进行数据库迁移或数据交换时,需要将不同数据库管理系统之间的数据类型进行转换。在本文中,我们将讨论如何将 SQL Server 中的 Image 类型数据导出到 ...

    读取oracle数据库中clob字段的值

    ### 读取Oracle数据库中CLOB字段的值 在处理Oracle数据库时,经常会遇到需要读取CLOB(Character Large Object)类型字段的情况。CLOB主要用于存储大量的文本数据,如文章、文档等内容。由于CLOB类型的数据量可能...

    jdbc读写Oracle的CLOB字段

    JDBC读写Oracle的CLOB字段

    Oracle如何对CLOB行字段来执行全文检索

    Oracle 数据库中,CLOB 行字段是一种常用的数据类型,用于存储大文本数据。然而,在 Oracle8i 版本之前,对大字段 CLOB 仍然不支持在 where 子句直接的 Like 操作。这使得开发者无法直接对 CLOB 字段中的内容进行 ...

    jdbc 处理clob类型字段

    本主题主要探讨如何使用JDBC有效地操作Oracle数据库中的CLOB类型字段,包括插入(Insert)、删除(Delete)、更新(Update)和查询(Select)等操作。 首先,我们需要理解CLOB的基本概念。CLOB是一种数据库对象,...

    dblink_clob字段异常解决方案

    CLOB(Character Large OBject)是Oracle数据库中的一个数据类型,用于存储大量的字符数据。CLOB字段可以存储大量的文本数据,如文章、报表、图像等。 dblink_clob字段异常的原因 当我们使用DBLink连接远程数据库...

    asp.net操作oracle clob字段demo

    本篇将详细讲解如何在ASP.NET中操作Oracle的CLOB字段。 首先,要进行Oracle数据库操作,我们需要安装Oracle的数据提供程序,如ODP.NET(Oracle Data Provider for .NET)。这个驱动程序允许ASP.NET应用程序与Oracle...

    CLOB 字段类型报错 ORA-01704: 文字字符串过长的解决

    在Oracle数据库中,CLOB(Character Large Object)字段类型用于存储大量的文本数据,如XML文档、长篇文章或者大量字符数据。然而,当你尝试向CLOB字段插入数据时,如果超过了Oracle规定的最大限制,就会遇到“ORA-...

    java读写oracle clob字段

    本教程将介绍如何使用Java来读取和写入Oracle数据库中的CLOB字段。 首先,我们需要引入相关的Java和Oracle JDBC驱动库。在上述代码中,我们看到`import oracle.jdbc.driver.OracleDriver;`,这表示我们将使用Oracle...

    Oracle的CLOB大数据字段类型操作方法

    下面我们将深入探讨Oracle中的CLOB类型及其操作方法。 首先,当普通的VARCHAR2类型无法满足存储需求,超过其最大长度4000个字符时,CLOB就显得尤为重要。在Oracle中,VARCHAR2作为字段类型的最大存储量为4000个字符...

    mysql和Oracle在对clob和blob字段的处理

    - 存储机制:MySQL的`TEXT`和`BINARY`系列数据类型通常存储在数据页中,而Oracle的`CLOB`和`BLOB`可以存储在表空间中,允许更大的数据量。 - 索引支持:Oracle支持对`CLOB`和`BLOB`字段建立索引,而MySQL的索引...

    ibatis 读取oracle clob类型

    ibatis 读取oracle clob类型

    关于Oracle的 Clob数据类型在Hibernate中的应用小结

    在Hibernate框架中,Clob类型的字段处理是数据库操作中的一个关键环节,尤其是在处理大量文本数据时。以下是对Oracle Clob在Hibernate中应用的详细总结: 3.1 传统的JDBC方式: 在没有使用ORM框架之前,我们通常...

    JAVA对clob的操作

    在JAVA中,操作Oracle数据库中的BLOB和CLOB类型字段是一种常见的需求。然而,网络上关于JAVA对Oracle中BLOB、CLOB类型字段的操作说明往往不够全面、不够准确,甚至有的简直就是胡说八道。因此,本文旨在总结JAVA对...

Global site tag (gtag.js) - Google Analytics