欢迎光临
我们一直在努力

J2EE程序中使用oracle数据库LOB字段的总结(elathen)-JSP教程,J2EE/EJB/服务器

建站超值云服务器,限时71元/月

最近在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();

}

}

}

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

后记:

平时总忙着做项目,闲的时候也很懒,总想把自己实际中的一些问题和解决方法小结一下,但总没完成,这是第一次写,写的不好或不清楚的地方请包涵,下次改进,也希望大家多提意见,大家一起进步!!!!!!!!!!!

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » J2EE程序中使用oracle数据库LOB字段的总结(elathen)-JSP教程,J2EE/EJB/服务器
分享到: 更多 (0)

相关推荐

  • 暂无文章