Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Database/JDBC/SQL/JDO/Hibernate » DB2  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 [原创]大字段文本(CLOB)的数据库存取与页面显示
bawanglongqiqi





发贴: 73
积分: 37
于 2005-02-16 10:29 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
当开发Browser/Server结构的应用时,往往涉及到大于4K的大字段文本的数据库存取以及Web页面的显示问题,比如,新闻或技术论题的内容,或者某些项目的详述。而这些大字段文本在数据库中进行存储时,最好的办法是采用SQL99定义的CLOB字段类型来实现。如果不采用CMP进行存取管理,那么,手工写代码管理存储与显示有一些繁杂,本文力求能够给大家提供一种高效、运行稳定的代码段,供大家实现参考。

本文共分成以下几个部分:

l 大字段上载到服务器SERVLET

l 用JavaBean实现大字段的数据库存储

l 用JavaBean实现大字段的数据库提取

l CLOB内容的页面显示

推荐使用平台:

操作系统:TurboLinux 6.1 Data Server

应用服务器:IBM Websphere Application Server 3.5

数据库:IBM DB2 7.0



一、 大字段CLOB上载到服务器Servlet



在web页面上,通过制作post属性的form,让servlet响应form的action,就可以将客户端利用form上载的内容在Servlet中截获,并存储在String类型的实例中,参照如下代码段:

1、 Web页面(htm或jsp文件)

<form method = ”post” action = “/servlet/ClobHandlerServlet”>

<input type=”textarea” name=”content”>

<input type=”submit” label=”提交”>

</form>

2、 CLOB处理——ClobHandlerServelt

public class ClobHandlerServlet extends HttpServlet

{

public void service(ServletRequest arg1, ServletResponse arg2) throws ServletException, IOException

{

HttpServletRequest req = (HttpServletRequest)arg1;

HttpServletResponse res = (HttpServletResponse)arg2;

String content = req.getParameter(“content”);

}

}

这样,我们就把客户端上载的大字段内容存储到String 实例content中。



二、 用JavaBean实现大字段的数据库存储



接下来,我们将把实例content交给商业逻辑实现JavaBean——ClobHandler,这个Bean的主要作用有:

l 从Websphere Application Server的JNDI树中查找并获取本示例用DataSource;

l 创建一个新的连接;

l 实现CLOB字段添加(或修改);

l 实现CLOB字段提取。

本示例涉及到数据库连结与操作,我们通过J2EE推荐的DataSource来完成,有关在VAJ或WAS里配置数据源的详细信息请参照VAJ或WAS联机帮助或其他文献,这里不多重复。

配置成功的DataSource的JNDI名为:clobDS。

因为类ClobHandler是用来处理与数据库交换信息的专用类,所以有必要让它保留一个DataSource实例的引用,我们在ClobHandler构造时就完成这项工作:

public class ClobHandler

{

private static DataSource clobDS = null;

//class constructor

public ClobHandler ()

{

if(clobDS == null)

try

{

Context ctx = new InitialContext();

clobDS = (DataSource)ctx.lookup("jdbc/clobDS");

}

catch(Exception _ex)

{

System.err.println(“Exception when lookup DataSource :” + _ex);

}

}

接下来,创建一个用来获取连接的私有函数,因为涉及到自己写transaction,所以要将连接的autoCommit属性设置为false:

private Connection conn = null;

private void initConnection()

{

if(this.conn == null)

try

{

conn = clobDS.getConnection();

conn.setAutoCommit(false);

}

catch(Exception e)

{

System.out.println("Get a connection error:" + e);

}

}

好了,准备工作已经完成,现在开始进行数据操作,这里只介绍大字段的插入与读取,参考这些实现就可以方便的完成更新和删除等操作的实现。

假设存取表的关键字为ID(varchar2),大字段内容存储的字段名为CONTENT(CLOB),我们来完成插入函数insert:

public void insert(String id, String content)

首先要获得一个连接:

initConnection();

然后是对变量的定义:

PreparedStatement ps = null;

ResultSet rs = null;

Writer wt = null;

接下来,将进行Clob数据的插入,这个过程分成两步,第一步,将ID插入新记录,同时获得该操作返回的ResultSet;第二步,用此ResultSet进行CLOB的写入;第三步,完成提交,如果出现例外则进行回滚。代码实现为:

try

{

String sqlStr = “insert into TAB_TEST (id) values (“+id+”)”;

ps = this.conn.preparedStatement(sqlStr);

rs=ps.executeQuery();

while(rs.next())

{

Clob cb=rs.getClob(“content”);

wt=cb.getCharacterOutputStream();

wt.write(param.getContent());

wt.flush();

}

conn.commit();

conn.close();

}catch(Exception e)

{

System.out.println(“Function insert excetption : ” + e);

conn.rollback();

}

好了,到此为止,我们的上限可达到4G的文本数据,已经成功的插入了数据库,接下来,我们研究对它的读取与显示。



三、 用JavaBean实现大字段的数据库提取



还是在类ClobHandler中,实现CLOB字段提取的函数:

public String getContent(String id)

同样,需要先进行连接获取和变量声明:

initConnection();

PreparedStatement ps = null;

ResultSet rs = null;

String content = null;

接下来,对CLOB字段的读取,共三步:第一步,执行SQL查询并获得操作返回的ResultSet;第二步,将CLOB数据读入char[]中;第三步,形成存放内容的String对象并返回。详细代码段:

String sqlStr = “ select content from TAB_TEST where id=”+id;

ps = this.conn.preparedStatement(sqlStr);

rs=ps.executeQuery();

while(rs.next())

{

Clob cb=rs.getClob(“content”);

Reader instream = cb.getCharacterStream();

char buffer[] = new char[CLOB_SIZE_MAX];

int length=0;

while((length=instream.read(buffer))!=-1)

{

System.out.println("Read clob size : "+length);

}

content = new String(buffer);

}

return content;



通过调用此函数,Servlet或JSP就能获得需要的大字段内容content了,下一步,就是考虑怎么去显示它了。



四、 CLOB内容的页面显示



如果用Servlet做控制,那么,将获取的content对象放到request中,传给JSP,这里对用request传输BEAN不作说明,可参考相应 J2EE规范等资料。如果直接用JSP调用的获取方法,则content已经在JSP端。

在大字段中,包含回车、空格、TAB符号等,如果直接按String显示在JSP页上,则不能进行分段等显示。

其实,进行一个简单的转化,你的文章的原有格式就会正确的显示在WEB页面上,这个应用就是利用类StringTokenizer来完成。

在JSP页面中,用下面的代码进行显示:

<%

java.util.StringTokenizer st=new java.util.StringTokenizer(content,"\r");

while (st.hasMoreTokens())

{

String curstr=st.nextToken();

%>

<%= curstr %>

<%}%>

这里,是按照回车来进行分段显示的,也就是用"\r",当然,你可以完全定制你自己的显示模式,这里就不再详细叙述。

相信大家掌握了Clob和Blob之后,对WEB开发就会容易多了。


九佰 edited on 2005-02-16 11:01

作者 Re:[原创]大字段文本(CLOB)的数据库存取与页面显示 [Re:bawanglongqiqi]
tianmanchester





发贴: 95
积分: 30
于 2005-02-21 16:59 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
大虾救命:
我用JDK1.4.1 + JBuilder X 环境下尝试运行代码 ,

却老是提示找不到 getCharacterOutputStream() 方法,

是不是没有引用特殊的Class包呢,

恳求大虾贴完整的程序!!

万二分感谢ing



Catch me, if you can
作者 Re:[原创]大字段文本(CLOB)的数据库存取与页面显示 [Re:bawanglongqiqi]
bawanglongqiqi





发贴: 73
积分: 37
于 2005-02-25 10:09 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
是java.sql包里的东东,你import就好了
完整的代码因为一些原因不能公布,非常抱歉



作者 Re:[原创]大字段文本(CLOB)的数据库存取与页面显示 [Re:bawanglongqiqi]
lrabbit

老兔子



发贴: 31
积分: 1
于 2005-03-03 17:16 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
每个数据库大字段的处理方式都不大一样,譬如SQLServer和Oralce和DB2也不大一样,楼主的地这个帖子主题应该说明是在DB2的数据库中,因为例子中也只给出了对于DB2的操作。这方面的例子最好是参考数据库驱动提供商的文档和示例,其实没有什么特别难的地方。



flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923