热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

JAVA操作CLOB类型的数据库字段还是有点麻烦,虽然CLOB不像BLOB那样是用二进制来存值,但不能当成普通的String来操作,当初操作ORACLE这种字段类型时,可把我折腾了半天,现将如何操作的

JAVA操作CLOB类型的数据库字段还是有点麻烦,虽然CLOB不像BLOB那样是用二进制来存值,但不能当成普通的String来操作,当初操作ORACLE这种字段类型时,可把我折腾了半天,现将如何操作的步骤写了个比较详细的例子和说明,以供大家参考.

这里只写最关键的几个地方,其它的地方平时该怎么写就怎么写

首先是POJO类:

  1. import java.sql.Clob;
  2. import java.util.Date;
  3. /**
  4. * @author coffee
  5. *
  6. */
  7. public class KybasicInfo implements java.io.Serializable {
  8. private Long infoId;
  9. private String infoTitle;
  10. private String infoKeyword;
  11. private Clob infoContent; //注意这个地方是java.sql.Clob类型的,生成默认是String类型的,需要手工改一下
  12. private String infoContentToString; //这个是和infoContent做转换时,手工添加的一个,不和数据库里的字段进行对应的
  13. private Long infoTop;
  14. private String userSno;
  15. private Date infoTime;
  16. private Long icId;
  17. private String infoStandby1;
  18. private String infoStandby2;
  19. private String infoStandby3;
  20. private Long infoStandby4;
  21. private Long infoStandby5;
  22. private Long infoStandby6;
  23. public KybasicInfo() {
  24. }
  25. public KybasicInfo(String infoTitle, String infoKeyword,
  26.     Clob infoContent, Long infoTop, String userSno,
  27.     Date infoTime, Long icId, String infoStandby1, String infoStandby2,
  28.     String infoStandby3, Long infoStandby4, Long infoStandby5,
  29.     Long infoStandby6) {
  30.    this.infoTitle = infoTitle;
  31.    this.infoKeyword = infoKeyword;
  32.    this.infoContent = infoContent;
  33.    this.infoTop = infoTop;
  34.    this.userSno = userSno;
  35.    this.infoTime = infoTime;
  36.    this.icId=icId;
  37.    this.infoStandby1 = infoStandby1;
  38.    this.infoStandby2 = infoStandby2;
  39.    this.infoStandby3 = infoStandby3;
  40.    this.infoStandby4 = infoStandby4;
  41.    this.infoStandby5 = infoStandby5;
  42.    this.infoStandby6 = infoStandby6;
  43. }
  44. public Long getInfoId() {
  45.    return this.infoId;
  46. }
  47. public void setInfoId(Long infoId) {
  48.    this.infoId = infoId;
  49. }
  50. public String getInfoTitle() {
  51.    return this.infoTitle;
  52. }
  53. public void setInfoTitle(String infoTitle) {
  54.    this.infoTitle = infoTitle;
  55. }
  56. public String getInfoKeyword() {
  57.    return this.infoKeyword;
  58. }
  59. public void setInfoKeyword(String infoKeyword) {
  60.    this.infoKeyword = infoKeyword;
  61. }
  62. public Clob getInfoContent() {
  63.    return this.infoContent;
  64. }
  65. public void setInfoContent(Clob infoContent) {
  66.    this.infoContent = infoContent;
  67. }
  68. public Long getInfoTop() {
  69.    return this.infoTop;
  70. }
  71. public void setInfoTop(Long infoTop) {
  72.    this.infoTop = infoTop;
  73. }
  74. public Date getInfoTime() {
  75.    return this.infoTime;
  76. }
  77. public void setInfoTime(Date infoTime) {
  78.    this.infoTime = infoTime;
  79. }
  80. public String getInfoStandby1() {
  81.    return this.infoStandby1;
  82. }
  83. public void setInfoStandby1(String infoStandby1) {
  84.    this.infoStandby1 = infoStandby1;
  85. }
  86. public String getInfoStandby2() {
  87.    return this.infoStandby2;
  88. }
  89. public void setInfoStandby2(String infoStandby2) {
  90.    this.infoStandby2 = infoStandby2;
  91. }
  92. public String getInfoStandby3() {
  93.    return this.infoStandby3;
  94. }
  95. public void setInfoStandby3(String infoStandby3) {
  96.    this.infoStandby3 = infoStandby3;
  97. }
  98. public Long getInfoStandby4() {
  99.    return this.infoStandby4;
  100. }
  101. public void setInfoStandby4(Long infoStandby4) {
  102.    this.infoStandby4 = infoStandby4;
  103. }
  104. public Long getInfoStandby5() {
  105.    return this.infoStandby5;
  106. }
  107. public void setInfoStandby5(Long infoStandby5) {
  108.    this.infoStandby5 = infoStandby5;
  109. }
  110. public Long getInfoStandby6() {
  111.    return this.infoStandby6;
  112. }
  113. public void setInfoStandby6(Long infoStandby6) {
  114.    this.infoStandby6 = infoStandby6;
  115. }
  116. public String getUserSno() {
  117.    return userSno;
  118. }
  119. public void setUserSno(String userSno) {
  120.    this.userSno = userSno;
  121. }
  122. public Long getIcId() {
  123.    return icId;
  124. }
  125. public void setIcId(Long icId) {
  126.    this.icId = icId;
  127. }
  128. public String getInfoContentToString() {
  129.    return infoContentToString;
  130. }
  131. public void setInfoContentToString(String infoContentToString) {
  132.    this.infoContentToString = infoContentToString;
  133. }
  134. }

hbm.xml配置文件

  1. xml version="1.0" encoding="utf-8"?>
  2. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  3. <hibernate-mapping>
  4.     <class name="kymanage.kybasic.vo.KybasicInfo" table="KYBASIC_INFO" schema="BL">
  5.         <id name="infoId" type="java.lang.Long">
  6.             <column name="INFO_ID" precision="22" scale="0" />
  7.             <generator class="sequence">
  8.             <param name="sequence">INFO_IDparam>
  9.             generator>
  10.         id>
  11.         <property name="infoTitle" type="java.lang.String">
  12.             <column name="INFO_TITLE" length="100" />
  13.         property>
  14.         <property name="infoKeyword" type="java.lang.String">
  15.             <column name="INFO_KEYWORD" length="100" />
  16.         property>
  17.         
  18.         <property name="infoContent" type="java.sql.Clob">
  19.             <column name="INFO_CONTENT" />
  20.         property>
  21.         <property name="infoTop" type="java.lang.Long">
  22.             <column name="INFO_TOP" precision="38" scale="0" />
  23.         property>
  24.         <property name="userSno" type="java.lang.String">
  25.             <column name="USER_SNO" length="100" />
  26.         property>
  27.         <property name="infoTime" type="java.util.Date">
  28.             <column name="INFO_TIME" length="7" />
  29.         property>
  30.         <property name="icId" type="java.lang.Long">
  31.             <column name="IC_ID" precision="38" scale="0" />
  32.         property>
  33.         <property name="infoStandby1" type="java.lang.String">
  34.             <column name="INFO_STANDBY1" length="100" />
  35.         property>
  36.         <property name="infoStandby2" type="java.lang.String">
  37.             <column name="INFO_STANDBY2" length="100" />
  38.         property>
  39.         <property name="infoStandby3" type="java.lang.String">
  40.             <column name="INFO_STANDBY3" length="100" />
  41.         property>
  42.         <property name="infoStandby4" type="java.lang.Long">
  43.             <column name="INFO_STANDBY4" precision="38" scale="0" />
  44.         property>
  45.         <property name="infoStandby5" type="java.lang.Long">
  46.             <column name="INFO_STANDBY5" precision="22" scale="0" />
  47.         property>
  48.         <property name="infoStandby6" type="java.lang.Long">
  49.             <column name="INFO_STANDBY6" precision="22" scale="0" />
  50.         property>
  51.     class>
  52. hibernate-mapping>

 

hibernate DAO类:

 

  1. import oracle.sql.CLOB;
  2. import java.io.IOException;
  3. import java.io.Writer;
  4. import java.sql.Clob;
  5. import java.sql.SQLException;
  6. import java.util.Date;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import org.apache.commons.logging.Log;
  10. import org.apache.commons.logging.LogFactory;
  11. import org.hibernate.Hibernate;
  12. import org.hibernate.LockMode;
  13. import org.hibernate.Query;
  14. import org.hibernate.Session;
  15. import org.hibernate.Transaction;
  16. import org.hibernate.lob.SerializableClob;
  17. import org.springframework.context.ApplicationContext;
  18. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  19. /**
  20. * kybasicInfo
  21. * @author coffee
  22. */
  23. public class KybasicInfoDAOImpl extends HibernateDaoSupport {
  24. protected void initDao() {
  25. }
  26. //新增,在action里将表单中的这个大文本按正常情况传过来,也就是传String类型过来,然后,再在DAO里做Clob类型转换,
  27. //这里面可能会有其它层来传参,但最终还是将传过来的Stirng转换成Clob型的,然后通过文件流形式写入到CLOB字段中去
  28. public void save(KybasicInfo kybasicInfo) {
  29.    try {
  30.     Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  31.     Transaction tran=session.beginTransaction();
  32.     kybasicInfo.setInfoContent(Hibernate.createClob(" "));//注意,这里的参数是个空格,先新增一个空的Clob进去
  33.     session.save(kybasicInfo);
  34.     session.flush();//强制执行
  35.     session.refresh(kybasicInfo,LockMode.UPGRADE);
  36.     SerializableClob sc=(SerializableClob)kybasicInfo.getInfoContent();//kybasicInfo.getInfoContent()是Clob类型的
  37.     Clob wrapclob=sc.getWrappedClob();//这里的Clob是java.sql.Clob
  38.     CLOB clob=(CLOB)wrapclob;//这里的CLOB是oracle.sql.CLOB
  39.     Writer writer=clob.getCharacterOutputStream();
  40.     writer.write(kybasicInfo.getInfoContentToString());//kybasicInfo.getInfoContentToString()是String类型的,在action里就是传这个进来,然后再通过文件流形式写成CLOB字段中
  41.     writer.close();
  42.     session.save(kybasicInfo);
  43.     tran.commit();
  44.    
  45.    } catch (RuntimeException re) {
  46.     throw re;
  47.    } catch (SQLException e) {
  48.     e.printStackTrace();
  49.    } catch (IOException e) {
  50.     e.printStackTrace();
  51.    }
  52. }
  53. //更新,操作的新增是一样的,都是先接收String类型的参数过来,然后再将String的转成CLOB类型的
  54. public void update(KybasicInfo persistentInstance) {
  55.    try {
  56.     Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  57.     Transaction tran=session.beginTransaction();
  58.     persistentInstance.setInfoContent(Hibernate.createClob(" "));
  59.     session.update(persistentInstance);
  60.     session.flush();
  61.     session.refresh(persistentInstance,LockMode.UPGRADE);
  62.     SerializableClob sc=(SerializableClob)persistentInstance.getInfoContent();
  63.     Clob wrapclob=sc.getWrappedClob();
  64.     CLOB clob=(CLOB)wrapclob;
  65.     Writer writer=clob.getCharacterOutputStream();
  66.     writer.write(persistentInstance.getInfoContentToString());
  67.     writer.close();
  68.     session.update(persistentInstance);
  69.     tran.commit();
  70.    } catch (RuntimeException re) {
  71.     throw re;
  72.    } catch (SQLException e) {
  73.     e.printStackTrace();
  74.    } catch (IOException e) {
  75.     e.printStackTrace();
  76.    }
  77. }
  78. //读取Clob字段值
  79. public KybasicInfo findById(java.lang.Long id) {
  80.    try {
  81.     KybasicInfo instance = (KybasicInfo) getHibernateTemplate().get(
  82.       "kymanage.kybasic.vo.KybasicInfo", id);
  83.     Clob clob=instance.getInfoContent();//取得Clob的值
  84.     if(clob!=null){
  85.      String clobString="";
  86.      try {
  87.       clobString = clob.getSubString(1, (int)clob.length());//将Clob类型的值转换成String类型的值
  88.       instance.setInfoContentToString(clobString);//通过setter方法,设置String值,然后就可以通过instance.getInfoContentToString()来取值了
  89.      } catch (SQLException e) {
  90.       e.printStackTrace();
  91.      }
  92.     }
  93.     return instance;
  94.    } catch (RuntimeException re) {
  95.     throw re;
  96.    }
  97. }
  98. public static KybasicInfoDAOImpl getFromApplicationContext(
  99.     ApplicationContext ctx) {
  100.    return (KybasicInfoDAOImpl) ctx.getBean("KybasicInfoDAO");
  101. }
  102. }

推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
丢失时
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有