J2EE程序中使用oracle数据库LOB字段的总结(elathen)

东安信息港 网络编程学习中心&Zhouwen @ 2005-01-08 16:41

最近在J2EE的项目中需要使用LOB字段保存文本信息以及图片和文件,到网上搜拉一下,还不少,仔细看拉一下,但都不是很全有的还有错误,经过几天的实践,把问题都解决拉,顺便总结一下,希望对需要的朋友有点参考

LOB中我们用的比较多的主要有两种CLOB和BLOB,我们对两种类型分别讨论

1.CLOB是字符型LOB,主要存储文本信息,,最长为4G.,在J2EE程序中,比如网页的textarea中的字符信息比较长,Varchar2字段类型不能满足时,我们就得用CLOB数据类型,我们这次项目中就碰到这种情况.现在我们先说说如何存取CLOB字段
以下为内容:


东安县白牙市镇宥江桥村采取多种措施,提供各种方便,积极大胆地引进外地种植大户到村里发展水果生产。东安县到目前为止,东安县已引进席青松等3名外地水果种植大户,东安县更新改造新柑桔园2个面积150亩,低改果园面积87亩,全村正呈现出一派退耕还果的喜人景象。

红网永州东安县讯 通讯员唐德光 张雄 杨安平报道 日前,。东安县又有22名组工东安信息港干部在新一轮干部调整中因为工作成绩突出、群众测评得分较高被提拔到新的岗位任职。与此同时,4名东安县组工干部因综合测评不合格被调离组工岗位。这是该县组织系统着力实施“畅通工程”取得的又一项成果。东安县
东安信息港在深化和拓展“树组工干部形象”学习教育活动中,着力推行“三项制度”,实施畅通工程,即力争二年内对东安信息港全县组工干部进行3次轮训,组工干部提拔、交通使用率达到50%以上。一是着力推行组工东安信息港干部执证上岗制度。二是着力推行“五星组工”综合考评制度。每年年中、年终,由东安县委组织部、组工干部本人、所在单位的班子成员和有关干部群众分别按照考评细则对组工干部进行组织考评、自评、他评,评出一星至五星组工。东安信息港三是推行组工干部作风监督员制度。东安县范围内聘请29名政治业务素质高、党性原则强的作风监督员对组工干部行为进行监督,并逐月将监督情况报县委组织部。自实施“畅通工程”以来,东安县先后对全县组工干部进行了二次考核培训和综合测评,发放《组工干部的任职资东安信息港格证》203份,48名组工干部被提拔重用,12名组工干部走上了正职领导岗位,5名组工干部受到了警示谈话,7人被调离组工岗位东安信

 东安
今年4月17日,本报曾在头版刊发《国徽明悬照丹心》长篇通讯,详细报道了东安
周益群的先进事迹。3月21日,东安县东安监狱
一名犯人叫嚷法律对他不公,挥着钢刀要自杀。东安
十余狱警与之紧张对峙,一起恶性事故一触即发。危难之际,东安信
周益群挺身而出,凭着多年军、警生涯训练有素的冷静、智慧和果断,成功夺下钢刀。
   东安
周益群是一位有着17年军龄的老兵,1994年9月转业到东安县人民检察院反贪局工作,4年后被任命为该院驻东安东安监狱检察室
副主任。近两年来,他先后42次依法提出暂缓呈报假释、减刑的建议,100%被东安
监管部门采纳。他受理并移送起诉再犯罪案件29件,立案监督7案7人,没出现过一件错案冤案。数年来,东安
周益群兢兢业业工作,赢得了东安
上级领导和同事的敬重和赞誉。
青山口是东安白牙市镇茶源村3组的一个自然村,村民10多年来不种田,但家家盖起了小洋楼,户户安装了电话、有线电视等,摩托车几乎成了每个家庭必备的代步工具。
   究竟是什么使得东安青山口村民如此富足呢?近日,来到青山口村探个究竟。
   来到距离东安县城不足1公里的青山口村,眼前到处是一片片水面,不见一丘禾田,大大小小的水塘一口连一口,星罗棋布,每口较大的水塘边都有用红砖或树木搭起的简易棚子,几千只鸭在水面上啄食。不远处,几位村民正在向鱼塘水面撒饲料。看到这一景象,我们都明白了,原来东安这里的村民不是在种田,而是靠养鱼、养鸭走上了致富路。
   见我们到来,忙碌的东安村民放下手中的饲料盆迎了过来,知道我们的来意后,一中年男子指着一位皮肤黝黑40出头的男子告诉我们“他就是我们村最有名的养鱼、养鸭大户唐林仕。众人点将,唐林仕不好意思地说:“我只是比别人先搞了几年,从90年代初,我就将一丘稻田试着改了鱼池,收入比种稻谷划算,后来,政府号召调整种养结构,我就将4.5亩责任田全部改成了鱼池,同时饲养鸭子,实行立体养殖。”“将良田改做鱼池,那吃饭怎么办?合算么?”见我们心存疑虑,快言快语的村民唐远东当即给我们算了一笔账:“种一亩水稻,两季总收入不过1000多元,若利用我们这里泉眼多、活水多、灌水方便的优势,将稻田改成鱼塘一年可产鲜鱼500多公斤,收入在3000元左右,加之在水面上养鸭,实行立体养殖,每亩收入6000元以上。像我前年将3.5亩责任田改成了鱼池后,每年可产成鱼上万斤,加上所养的5000多只肥鸭,年收入在5万元以上。”
   “如此好的立体养殖效益,组里有多少户参与了吗?村里又是如何引导你们进行规模化经营的呢?”正当我们准备打破砂锅问到底时,一辆红色的嘉陵摩托车突然驶入我们身边停下,唐远东赶快说道:“支书唐又林来了,这些情况他最清楚。”于是,唐支书给我们详细介绍起东安青山口的发展情况。”青山口村有33户150多村民,全组有稻田91.5亩。从2000年开始,大批村民利用便利的水利条件和靠近县城的市场优势,将稻田改鱼池,镇政府和村里积极引导,制订了许多优惠措施,鼓励村民发展立体养殖,规模经营,几年下来,农民收入十分可观。目前,该村已有62亩稻田被改作鱼池,32户从事养鱼、养鸭,每年出活鱼5万公斤以上,出栏肥鸭10万羽,人平纯收入在4000元以上。
   唐支书一边给我们介绍情况,一边与几位养殖户一起陪我们参观村里那一口接一口的鱼池,一座挨一座的鸭棚,看着鱼儿在欢跳,群鸭在啄食,我们不仅为青山口村民们那敏锐的市场眼光,规模化的经营思路所折服,肥鱼结伴游乐,白鸭成群嬉戏,已构成东安青山口村独特的风景,也给村民带来了新年的希望。东安信息港报导
下面来介绍一下东安的特产
东安特产



/*结束

现在我要把网页中的textarea元素的信息保存到数据库的CLOB字段中, 我们都知道textarea中的信息当然不能直接保存成CLOB,我们在后台得到的是String类型的,不多说拉,我们还是以一个实例讲吧!

先建一个test表,表有2个字段:ID,CONTENTS,其中CONTENTS保存CLOB类型的文本数据

create table TEST
(
 ID         VARCHAR2(18) not null,
 CONTENTS   CLOB,
)

接着我们编写一个测试用的jsp文件ClobTest.jsp,代码如下



<%@ page language="java" contentType="text/html; charset=gb2312" %>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>Clob对象的存取测试</title>

</head>



<body>

<form name="test" method="post" action="clobTest.action">

 <table width="80%" height="88"  border="0" align="center" cellpadding="0" cellspacing="0">

   <tr>

        <td height="30" align="center">输入ID号<input type="text" name="ID">

   </tr>

   <tr>

     <td align="center">

<textarea rows="28" cols="68" name="CONTENTS">

注册用户需遵守:

    尊重会员个人隐私、保障会员隐私安全是CSDN的一项基本政策,CSDN不会公开、编辑或透露会员的注册资料,除非符合以下情况:
   (1) 根据中华人民共和国国家安全机构、公安部门的要求及根据相应的法律程序要求。
   (2) 维护CSDN的商标所有权及其它权益。
   (3) 在紧急情况下竭力维护会员个人、其它社会个体和社会大众的安全。
   (4) 严重违反CSDN有关规定。
   CSDN保留结束会员使用网络服务资格的权利,并保证结束会员资格后仍为会员保密所有个人隐私。

     </textarea>    

        </td>

   </tr>

      <tr>

         <td align="center">

          <input type="submit" name="Submit" value="提交">

         </td>

      </tr>

 </table>

</form>

</body>

</html>

点击”提交”按钮,我们在后台的到的是2个String类型的对象

String strID = request.getParameter(“ID”);

String strCONTENTS = request.getParameter(“CONTENTS”);

接着我们要做的任务就是如何把String类型CONTENTS存到数据库中的CLOB类型字段中!

注意:LOB数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的LOB对象,CLOB类型的空对象为EMPTY_CLOB(),BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定,继而将空对象修改为所要插入的LOB对象。

//我们先插入一个空的CLOB对象

 public int insertEmptyClob() throws Exception {

   Statement statement = null;

   int intResult = -1;

   try {

     //创建数据库操作语句

statement = connection.createStatement();

//定义SQL语句

String strSQL = “INSET INTO TEST (ID,CONTENTS) VALUES(strID, EMPTY_CLOB())”;

     //执行SQL语句

     intResult = statement.executeUpdate(strSQL);

System.out.println(" intResult valus is"+intResult);

     return intResult;

   } catch(Exception e) {

     e.printStackTrace();

     return -1;

   } finally {

     if (statement != null) {

       statement.close();

     }

   }

 }

//把strCONTENT插入CLOB字段

 public void insertClob() throws Exception {

   Statement statement = null;

   ResultSet resultset = null;

   try {

     //设置不自动提交

     connection.setAutoCommit(false);

     //创建数据库操作语句

statement = connection.createStatement();

//定义SQL语句

String strSQL = “SELECT CONTENTS  FROM TEST  WHERE ID=strID"”

     resultset = statement.executeQuery(strSQL);

     oracle.sql.CLOB contents = null;

     while(resultset.next()) {

       //取出CLOB对象

       contents = (oracle.sql.CLOB)resultset.getClob("CONTENTS");

     }

     Writer out = contents.getCharacterOutputStream();

     out.write(strContents);

     out.flush();

out.close();

//数据库提交

     connection.commit();

   } catch(Exception e) {

     e.printStackTrace();

   }finally{

     if(resultset != null) {

       resultset.close();

     }

     if(statement != null) {

       statement.close();

     }

   }

 }

OK,我们已经把这段文本以CLOB字段的形式保存到数据库中了,在实际应用中,如果要保存或修改一条记录,我们要分2步做,先保存或修改非LOB字段类型的字段,再保存或修改LOB字段!接下来我们来把刚才保存到数据库中的CLOB字段读到jsp页面中去。

我们在保存的时候,CLOB字段会把上面textarea中的文本按原来的格式一行一行(包括空格)都保存到CLOB字段中,读取的时候我们只要按照原来格式读起出来就行了(我这里自己用了一个小处理方法,但如果你有更好的方法请告诉我)。在这里我们把CLOB读到StringBuffer中,为了保存不同行我在行之间加了个“&”字符来区分。最后转化成String

放到VO中,这样就保证从前台到后台,从后台到前台的数据传递的一致性!代码如下:







 /**

  * 获取CLOB文本对象

  * @param sbSQL

  * @return

  * @throws java.lang.Exception

  */

 public String selectIncludeClob(StringBuffer sbSQL) throws Exception {

   Statement stmt = null;

   ResultSet rs = null;

   StringBuffer sbResult = new StringBuffer();

   try {

     //设定数据库不自动提交

     //connection.setAutoCommit(false);

     //创建数据库操作语句

     stmt = connection.createStatement();

     //获取结果集

     rs = stmt.executeQuery(sbSQL.toString());



     while(rs.next()) {

       CLOB clob = (CLOB)rs.getClob("CONTENTS");

       Reader isClob = clob.getCharacterStream();

       BufferedReader bfClob = new BufferedReader(isClob);

       String strClob = bfClob.readLine();

       while(strClob != null) {

         sbResult.append(strClob);

         sbResult.append("&");

         strClob = bfClob.readLine();

       }

     }

     //提交事务

    // connection.commit();

   } catch(Exception e) {

     e.printStackTrace();

     throw e;

   } finally {

     if(rs != null) {

       rs.close();

     }

     if(stmt != null) {

       stmt.close();

     }

   }

   return sbResult.toString();

 }

posted on 2005-05-27 09:36  轻松逍遥子  阅读(664)  评论(1编辑  收藏  举报