首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 图形图象-> Maya教程
J2EE程序中使用oracle数据库LOB字段的总结(elathen)-JSP教程,J2EE/EJB/服务器
作者:网友供稿 点击:36
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
最近在j2ee的项目中需要使用lob字段保存文本信息以及图片和文件,到网上搜拉一下,还不少,仔细看拉一下,但都不是很全有的还有错误,经过几天的实践,把问题都解决拉,顺便总结一下,希望对需要的朋友有点参考

lob中我们用的比较多的主要有两种clob和blob,我们对两种类型分别讨论

1.clob是字符型lob,主要存储文本信息,,最长为4g.,在j2ee程序中,比如网页的textarea中的字符信息比较长,varchar2字段类型不能满足时,我们就得用clob数据类型,我们这次项目中就碰到这种情况.现在我们先说说如何存取clob字段

现在我要把网页中的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();

}

到jsp页面中,我们从vo中获取改文本信息。

<textarea rows="42" cols="68" name="contents" style="border-style: solid; border-color: #ffffff; font-family:仿宋_gb2312; font-size:14pt; line-height:200%; margin-top:8; margin-bottom:6" >

<%

string content = vo.getcontent();

string[] contentarray = content.split("&");

for(int i=0;i<contentarray.length;i++) {

string s= contentarray[i];

out.println(s);

}

%>

</textarea>

这样我们就保证什么格式保存就以什么格式显示。

2.blob字段,二进制lob,主要存储二进制数据,最长为4g,在j2ee程序中,一般类似于图片和文件的保存。当然也有另一种方法,就把图片和文件保存在硬盘上,数据库中只保存图片的链接地址和文件在服务器上的路径。如果遇到文件和图片比较重要的还是需要保存到数据库中(例如:我们做国土资源项目的时候,好多图片、文件就很重要,需要保存到数据库中),下面我写一个保存文件到数据库的blob字段和从数据库的blob字段中获取文件的方法(当然完全应用还要做其他工作,这里就不多说了,如果你不清楚的可以问我):

/**

* 把上传的文件保存到数据库的blob字段中

* @param strtablename 对应的表名称

* @param strcolumnname 表中保存文件的blob字段名称

* @param inputstream 输入的文件流

* @param sbsqlwhere where条件

* @throws java.lang.exception

*/

public static void fileupload(string strtablename,

string strcolumnname,

inputstream inputstream,

stringbuffer sbsqlwhere)

throws exception {

connection con = null;

resultset resultset = null;

statement stmt = null;

try {

//得到数据库连接

con = dbconnector.getconnection();

//构建查询语句

stringbuffer sbsql = new stringbuffer();

sbsql.append(" update ");

sbsql.append(strtablename);

sbsql.append(" set ");

sbsql.append(strcolumnname);

sbsql.append("=empty_blob() ");

sbsql.append(sbsqlwhere);

system.out.println(" update sql value is*******"+sbsql.tostring());

//获取数据库操作语句

stmt=con.createstatement();

//插入空的blob对象

stmt.executeupdate(sbsql.tostring());

con.setautocommit(false);

stringbuffer sbsqlblob = new stringbuffer();

sbsqlblob.append(" select ");

sbsqlblob.append(strcolumnname);

sbsqlblob.append(" from ");

sbsqlblob.append(strtablename);

sbsqlblob.append(sbsqlwhere);

sbsqlblob.append(" for update");

system.out.println(" select sql value is*********"+sbsql.tostring());

resultset =stmt.executequery(sbsqlblob.tostring());

while (resultset.next()) {

/* 取出此blob对象 */

oracle.sql.blob blob = (oracle.sql.blob)resultset.getblob("body");

/* 向blob对象中写入数据 */

bufferedoutputstream out = new bufferedoutputstream(blob.getbinaryoutputstream());

bufferedinputstream in = new bufferedinputstream(inputstream);

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

con.setautocommit(false);

con.commit();

} catch (exception ex) {

ex.printstacktrace();

throw ex;

} finally {

if (stmt != null) {

stmt.close();

}

if (resultset != null) {

resultset.close();

}

if (con!=null) {

con.close();

}

}

}



下面的方法是从数据库中得到上传的文件的输入流,把输入流写到servlet流中,再从页面中获取,servlet就不写了。

/**

* 方法描述:得到数据库上传的文件数据

*

* 输入参数: 1:表名(string)

* 2:字段名(string)

* 3: where条件(stringbuffer)

* 5: 输出流(servletoutputstream)

*

* 输出参数:void

* 编写人: */

public static void getdownfile(string strtablename,

string strcolumnname,

stringbuffer sbsqlwhere,

servletoutputstream sos) throws exception {

connection con = null;

preparedstatement ps = null;

resultset resultset = null;

try {

//得到数据库连接

con = dbconnector.getconnection();

stringbuffer sbsql = new stringbuffer();

//构建查询语句

sbsql.append(" select " + strcolumnname + " from " + strtablename);

sbsql.append(sbsqlwhere);



system.out.println(" sql value is:"+sbsqlwhere.tostring());



ps = con.preparestatement(sbsql.tostring());

//执行查询

resultset = ps.executequery();

while (resultset.next()) {

//读取数据流

inputstream is = resultset.getbinarystream(strcolumnname);



byte[] buf = new byte[2048];

while(is.read(buf)!=-1) {

//把数据流按块写到servlet的输出流中

sos.write(buf);

}



}

} catch (exception ex) {

ex.printstacktrace();

throw ex;

} finally {

if (ps != null) {

ps.close();

}

if (resultset != null) {

resultset.close();

}

if (con!=null) {

con.close();

}

}

}

图片的保存和文件的保存一样,如果不清楚的可以和我联系



后记:

平时总忙着做项目,闲的时候也很懒,总想把自己实际中的一些问题和解决方法小结一下,但总没完成,这是第一次写,写的不好或不清楚的地方请包涵,下次改进,也希望大家多提意见,大家一起进步!!!!!!!!!!!
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·C# 1.x 实现 "强类型元素唯一的 ArrayList"-.NET教程,C#语言
·NET(C#)连接各类数据库-集锦-.NET教程,C#语言
·快速測試 Tomcat + Oracle 9i + JSP-JSP教程,Jsp/Servlet
·使用.NET读取XML文件-.NET教程,XML应用
·XML 实用工具类-JSP教程,Java与XML
·如何把ASP编写成DLL-ASP教程,ASP应用
·vb.net中不需要EXCEL导出成XSL-.NET教程,VB.Net语言
·Asp之Request对象(1)-ASP教程,ASP应用
·C#读硬盘序列号的原代码-.NET教程,C#语言
·取得的IP/用户名等信息-ASP教程,ASP应用
最新文章
·linux操作系统上摄像头的使用小技巧_linux教程
·c#动态生成树型结构的web程序设计_c#应用
·一个联盟该如何来吸引站长加盟_网赚技巧
·童之磊:中文在线的“二次创业”_站长访谈
·实体店铺如何与网店结合提高销售额的经验_站长心得
·20年之后,个人站长发展项目的一些奇思怪想_站长心得
·google adsense的菜鸟常识_google推广
·如何利用google增加你的网站访问量_google推广
·专业的seo,为什么不承诺排名_seo网站优化
·用专业代码给网站增加搜索引擎_站长心得
相关主题
  • j2ee程序员应该掌握的linux知识-JSP教程,J2EE/EJB/服务器
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭