﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-凝思轩-文章分类-站在他人的肩膀上</title><link>http://www.blogjava.net/Michael-Q/category/22684.html</link><description>-----程序者之路,始于JAVA......</description><language>zh-cn</language><lastBuildDate>Sat, 04 Aug 2007 22:01:51 GMT</lastBuildDate><pubDate>Sat, 04 Aug 2007 22:01:51 GMT</pubDate><ttl>60</ttl><item><title>JDBC高级应用</title><link>http://www.blogjava.net/Michael-Q/articles/134133.html</link><dc:creator>QBing_M</dc:creator><author>QBing_M</author><pubDate>Thu, 02 Aug 2007 16:40:00 GMT</pubDate><guid>http://www.blogjava.net/Michael-Q/articles/134133.html</guid><wfw:comment>http://www.blogjava.net/Michael-Q/comments/134133.html</wfw:comment><comments>http://www.blogjava.net/Michael-Q/articles/134133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Michael-Q/comments/commentRss/134133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Michael-Q/services/trackbacks/134133.html</trackback:ping><description><![CDATA[<p>JDBC高级应用</p>
<p>转自 <a href="http://www.blogcn.com/user69/galiasun/index.html">http://www.blogcn.com/user69/galiasun/index.html</a></p>
<p><br>本来想继续谈JDBC的高级连结方式,事务模式.但发现关于大对象存储有很多人在问,所以<br>先来插入一节关于大对象存储的内容,然后再接着原来的思路写下去.</p>
<p>JDBC的大对象存储听起来复杂,其实如果你明白了原理以后,就非常简单,网上有关这方面的<br>教材很少,而SUN的文档中,我从1.2开始看到一在仍然是错误的,不知道写文档的人长脑子没<br>有,就那几行代码你试试不就知道了,这么多次重抄下来还是错误的.</p>
<p><br>大对象分类:一般来说,大对象分为:大的文本对象,比如一个很长的文本(请你要注意什么是<br>文本文件,什么是二进制文件)文件,或者是你定义的一个长字符串,比如你定义了:<br>String s = "我们要去吃饭了......................然后睡觉!";<br>从吃饭到睡觉中间省略了实际的10000000000000字,虽然你不会真的定义这么称的String,但<br>有时会从什么地方得到这样的String,要写到数据库中.<br>另一种就是大的二进制对象,象执行文件,图象文件等,注意,word,excel,ppt这些"带格式"的文<br>档都应该以二进制对象存储.</p>
<p>一般来说,数据库如果支持大对象存储,会有这几种类型的SQL数据类型:<br>BLOB,CLOCB,NLOB,也有的数据数只有一种BLOB,基本上是这样的:BLOB用来存放二进制文件,而<br>CLOB用来存放文本文件,NLOB是对多字节文本文件支持.假如你的文本文件是纯英文的,放在<br>BLOB中当然可以,也就是说它是以byte格式存储的,而多字节是以CHAR格式存储的.</p>
<p>同样对于这几种类型的文档,有几种相对应的存取方式:<br>setter:<br>利用PreparedStatement的setXXX方法,<br>setAsciiStream()方法用于写入一般的文本流.setBinaryStream()方法用于写入二进制流<br>而setUnicodeStream()用于写好UNICODE编码的文本,与此相对应的ResultSet中三个getter方法<br>用于取回:getAsciiStream(),getBinaryStream(),getBinaryStream().<br>对于文件本身,要把它作为一个流,只要new InputStream(new FileInputStream("文件路径")<br>就可以了,但对于大的String对象,你不会写入文件再转换成输入流吧?<br>new StringBufferInputStream(String s),记住了.<br>JDBC2以后提供了java.sql.BLOB对象,我不建议大家使用它,一是很麻类,二是容易出错,要先插<br>入一个空的BLOB对象,然后再填充它,实在没有必要,直接setXXX就行了,我试过,至少mysql,<br>oracle,sql server是可以直接set的.<br>好了,我们先看一个例子如何写入文件到数据库:<br>数据结构:<br>create table test(<br>&nbsp; name varchar(200),<br>&nbsp; content BLOB<br>);<br>File f = new File("a.exe";//先生成File对象是为了取得流的长度.FileInputStram可以直接<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //传入文件路径<br>InputStream in = new InputStream(new FileInputStream(f));<br>PreparedStatement ps = conn.prepareStatement("insert into test (?,?)";<br>ps.setString(1,"a.exe");<br>ps.setBinaryStream(2,in,(int)f.length());<br>ps.executeUpdate();<br>f的长度一定要做从long到int的转换,SUN的文档中好几版都没有改过来.就这么简单,当然,不同的<br>数据库存本身要设置它允许的最大长度,MYSQL默认只能传1M的文件,要修改参数原能存更大的文件.<br>如果要从数库中取得文件:<br>PreparedStatement ps = conn.prepareStatement("select * from test where name=?");<br>ps.setString(1,"a.exe";<br>ResultSet rs = ps.executeQuery();<br>if(rs.next()){<br>&nbsp;InputStream in = rs.getBinaryStream("content";<br>}<br>得到in对象后,你可以进行任何处理,写向文件和写向页面只是out对象不同而已:<br>写向文件:<br>DateOutputStream out = new DateOutputStream(new FileOutputStream("b.exe");<br>写向页面:<br>response.reset();<br>response.setContType("类型";<br>ServletOutputSreamt out = response.getOutputSream();<br>得到out对象后,就可以输出了:<br>byte[] buf = new byte[1024];<br>int len = 0;<br>while((len = in.read(buf)) &gt;0)<br>&nbsp; out.write(buf,0,len);<br>in.close();<br>out.close();<br>对于向页面输入,要设置什么样的ContType,要看你想如何输出,如果你想让对方下载,就设为<br>"application/octet-stream",这样即使是文本,图象都会下载而不会在浏览器中打开.如果你要想<br>在浏览器中打开,就要设置相应的类型,还要在容器的配置文件中设置支持这种文档类型的输出,但<br>对于很多格式的文件,到底要输出什么类型,其实就是HTTP的MIME集,比如图片:image/gif,当然你如<br>果你的文件扩展名(ext)不确定,你也不要用if(ext.equals("gif")......这样来判断,我教你一个<br>技巧,我之所以说是技巧,是我没有在别的地方发现有人用这种方法,对我来说我是绝对不会把别人的<br>方法拿来说是我的技巧的:<br>构造一个file类型的URL,我们知道URL目前JAVA可以支持HTTP,FTP,MAILTO,FILE,LDAP等,从FILE类型<br>的URL就可以得到它的MIME:</p>
<p>URL u = new URL("<a href="file://a.exe/">file://a.exe</a>";<br>String mime = u.openConnection().getContentType();<br>这样你就可以直接response.setContType(mime);而不用一个一个类型判断了.<br>好了,大对象存储就说到这儿,不同的数据仍然和些特殊的规定,不在此一一列举了.<br></p>
<img src ="http://www.blogjava.net/Michael-Q/aggbug/134133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Michael-Q/" target="_blank">QBing_M</a> 2007-08-03 00:40 <a href="http://www.blogjava.net/Michael-Q/articles/134133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收集客户端开发经典javascript方法</title><link>http://www.blogjava.net/Michael-Q/articles/133467.html</link><dc:creator>QBing_M</dc:creator><author>QBing_M</author><pubDate>Mon, 30 Jul 2007 17:02:00 GMT</pubDate><guid>http://www.blogjava.net/Michael-Q/articles/133467.html</guid><wfw:comment>http://www.blogjava.net/Michael-Q/comments/133467.html</wfw:comment><comments>http://www.blogjava.net/Michael-Q/articles/133467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Michael-Q/comments/commentRss/133467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Michael-Q/services/trackbacks/133467.html</trackback:ping><description><![CDATA[收集客户端开发经典javascript方法，望各位补充！ <br><br>1。字符串替代方法。 <br>function String_Replace(srcString,findString,replaceString){ <br>return String_ReplaceB(srcString, findString, replaceString, 0); <br>} <br>function String_ReplaceB(expression, find, replacewith, start) { <br>var index = expression.indexOf(find, start); <br>if (index == -1) <br>return expression; <br><br>var findLen = find.length; <br>var newexp = ""; <br>newexp = expression.substring(0, index)+(replacewith)+(expression.substring(index+findLen)); <br><br>return String_ReplaceB(newexp, find, replacewith, index+1+findLen); <br>} <br><br>2。取字符串长度方法 <br>function String_GetLength(str){ <br>var i,rt=0; <br>for(i=0;i&lt;str.length;i++) <br>{ <br>rt++; <br>if(str.charCodeAt(i)&gt;256)rt++; <br>} <br>return rt; <br>} <br><br>3。求浮点数方法 <br>function getFloat(num) <br>{ <br>var num = parseFloat(num); <br>if(isNaN(num))num = 0; <br>return num; <br>} <br><br>4。求整数方法（用到浮点数取法） <br>function getInt(num) <br>{ <br>return parseInt(getFloat(num)); <br>} <br><br>5。判断文本域对象是否惟空 <br>function at_checkBlank(obj,caption) { <br>if(String_Replace(obj.value," ","")=="") <br>{ <br>obj.select(); <br>alert(caption+"不能为空&#161;"); <br>obj.focus(); <br>return false; <br>} <br>return true; <br>} <br><br>6。两个Select对象(llist,rlist)互相操作 <br>var llist = fmObj.AssignedUser;//左边已经选中项目 <br>var rlist = fmObj.WaitedUser;//右边未被选中的项目 <br>//双击右边select中的项目 <br>function AssignUser() { <br>if(rlist.selectedIndex &lt; 0 || rlist.selectedIndex &gt; rlist.options.length)return; <br>var i; <br><br>llist.options.length++; <br>llist.options[llist.options.length-1].value = rlist.options[rlist.selectedIndex].value; <br>llist.options[llist.options.length-1].text = rlist.options[rlist.selectedIndex].text; <br><br>for(i = rlist.selectedIndex; i &lt; rlist.options.length - 1; i ++) { <br>rlist.options[i].value = rlist.options[i+1].value; <br>rlist.options[i].text = rlist.options[i+1].text; <br>} <br>rlist.length --; <br>} <br>//把右边选中的加入左边 <br>function AssignRight_AssignSelected(){ <br>for(var i = rlist.length - 1; i &gt;= 0; i --) { <br>if(rlist.options[i].selected) { <br>llist.options.length++; <br>llist.options[llist.options.length-1].value = rlist.options[i].value; <br>llist.options[llist.options.length-1].text = rlist.options[i].text; <br><br>for(var j = i; j &lt; rlist.options.length - 1; j ++) { <br>rlist.options[j].value = rlist.options[j+1].value; <br>rlist.options[j].text = rlist.options[j+1].text; <br>} <br>rlist.length --; <br>} <br>} <br>} <br>//把右边所有加入左边 <br>function AssignRight_AssignAll(){ <br>for(var i = rlist.length - 1; i &gt;= 0; i --) { <br>llist.options.length++; <br>llist.options[llist.options.length-1].value = rlist.options[i].value; <br>llist.options[llist.options.length-1].text = rlist.options[i].text; <br><br>for(var j = i; j &lt; rlist.options.length - 1; j ++) { <br>rlist.options[j].value = rlist.options[j+1].value; <br>rlist.options[j].text = rlist.options[j+1].text; <br>} <br>rlist.length --; <br>} <br>} <br>//左边select项目双击 <br>function DenyUser() { <br>if(llist.selectedIndex &lt; 0 || llist.selectedIndex &gt; llist.options.length)return; <br>var i; <br>rlist.options.length++; <br>rlist.options[rlist.options.length-1].value = llist.options[llist.selectedIndex].value; <br>rlist.options[rlist.options.length-1].text = llist.options[llist.selectedIndex].text; <br>for(i = llist.selectedIndex; i &lt; llist.options.length - 1; i ++) { <br>llist.options[i].value = llist.options[i+1].value; <br>llist.options[i].text = llist.options[i+1].text; <br>} <br>llist.length --; <br>} <br>//把左边选中的项目加入右边 <br>function AssignRight_DenySelected() { <br>for(var i = llist.length - 1; i &gt;= 0; i --) { <br>if(llist.options[i].selected) { <br>rlist.options.length++; <br>rlist.options[rlist.options.length-1].value = llist.options[i].value; <br>rlist.options[rlist.options.length-1].text = llist.options[i].text; <br>for(j = llist.selectedIndex; j &lt; llist.options.length - 1; j ++) { <br>llist.options[j].value = llist.options[j+1].value; <br>llist.options[j].text = llist.options[j+1].text; <br>} <br>llist.length --; <br>} <br>} <br>} <br>//左边所有项目加入右边 <br>function AssignRight_DenyAll() { <br>for(var i = llist.length - 1; i &gt;= 0; i --) { <br>rlist.options.length++; <br>rlist.options[rlist.options.length-1].value = llist.options[i].value; <br>rlist.options[rlist.options.length-1].text = llist.options[i].text; <br>for(j = i; j &lt; llist.options.length - 1; j ++) { <br>llist.options[j].value = llist.options[j+1].value; <br>llist.options[j].text = llist.options[j+1].text; <br>} <br>llist.length --; <br>} <br>}&nbsp;<br>&nbsp;
<img src ="http://www.blogjava.net/Michael-Q/aggbug/133467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Michael-Q/" target="_blank">QBing_M</a> 2007-07-31 01:02 <a href="http://www.blogjava.net/Michael-Q/articles/133467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] JSP 中生成WORD文档</title><link>http://www.blogjava.net/Michael-Q/articles/133466.html</link><dc:creator>QBing_M</dc:creator><author>QBing_M</author><pubDate>Mon, 30 Jul 2007 17:00:00 GMT</pubDate><guid>http://www.blogjava.net/Michael-Q/articles/133466.html</guid><wfw:comment>http://www.blogjava.net/Michael-Q/comments/133466.html</wfw:comment><comments>http://www.blogjava.net/Michael-Q/articles/133466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Michael-Q/comments/commentRss/133466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Michael-Q/services/trackbacks/133466.html</trackback:ping><description><![CDATA[存了，相信以后会用到。。。<br>转自：<a href="http://blog.csdn.net/cool_rain_man/archive/2007/05/17/1613727.aspx">http://blog.csdn.net/cool_rain_man/archive/2007/05/17/1613727.aspx</a><br><br>在web-oa系统中,公文管理好象不可或缺,有时需要从数据库中查询一些数据以某种格式输出来，并以word文档的形式展现，有时许多word文档保存到数据库中的某个表的Blob字段里，服务器再把保存在Blob字段中的图片文件展现给用户。通过网上查找发现很少有关于此类的文章，现在整理起来供大家参考。<br><br><br>1&nbsp;在client端直接生成word文档<br>在jsp页面上生成word文档非常简单，只需把contentType=&#8221;text/html&#8221;改为contentType="application/msword;&nbsp;charset=gb2312"即可，代码如下:<br><br><br>&lt;%@&nbsp;page&nbsp;contentType="application/msword;&nbsp;charset=gb2312"&nbsp;%&gt;<br><br>通过设置可以使原来页面的内容在word中表现出来。<br><br><br>如果需要把word文档下载下来，只需在jsp页面上面加上如下代码：<br><br>&lt;%<br><br>response.setHeader("Content-Disposition",&nbsp;"attachment;filename=filename.doc");<br><br>%&gt;<br><br><br>其中filename.doc中filename是要下载的word文档的文件名，可以通过&lt;%=docName%&gt;来自行定制，如下<br><br>&lt;%<br><br>response.setHeader("Content-Disposition",&nbsp;"attachment;filename=&lt;%=docName%&gt;.doc");<br><br>%&gt;<br><br>这样提供一个提示信息供用户选择如下图所示<br><br><br>&nbsp;<br><br>小技巧：如果程序员需要在生成word文档的时候按照自己预先在word上设计好的格式，可以复制word格式然后粘贴到frontpage中，取html代码贴到jsp页面即可。<br><br><br>2&nbsp;在客户端输出存在数据库中的word实体<br>这里只讨论在client输出oracle中BLOB字段中的word文档实体。其中调用了类getBlobBean，该类提供了从oracle中取出blob功能，代码如下：<br><br>package&nbsp;yourpackage;<br><br><br>import&nbsp;javax.servlet.*;<br><br>import&nbsp;javax.servlet.http.*;<br><br>import&nbsp;java.io.*;<br><br>import&nbsp;java.util.*;<br><br>import&nbsp;oracle.sql.*;<br><br>import&nbsp;beans.yourbeanpackage.&nbsp;getBlobBean;<br><br><br>/**<br><br>&nbsp;*&nbsp;&lt;p&gt;Title:&nbsp;&lt;/p&gt;<br><br>&nbsp;*&nbsp;&lt;p&gt;Description:&nbsp;&lt;/p&gt;<br><br>&nbsp;*&nbsp;&lt;p&gt;Copyright:&nbsp;Copyright&nbsp;(c)&nbsp;2004&lt;/p&gt;<br><br>&nbsp;*&nbsp;&lt;p&gt;Company:&nbsp;&lt;/p&gt;<br><br>&nbsp;*&nbsp;@author&nbsp;not&nbsp;attributable<br><br>&nbsp;*&nbsp;@version&nbsp;1.0<br><br>&nbsp;*/<br><br><br>public&nbsp;class&nbsp;GetBlobServlet1&nbsp;extends&nbsp;HttpServlet&nbsp;{<br><br>//设置输出内容类型，这个设置很重要,否则客户端浏览器不能识别输出内容,导致弹出下载的对话框。<br><br>&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;CONTENT_TYPE&nbsp;=&nbsp;"application/msword;charset=gb2312";<br><br><br>&nbsp;&nbsp;//Initialize&nbsp;global&nbsp;variables<br><br>&nbsp;&nbsp;public&nbsp;void&nbsp;init()&nbsp;throws&nbsp;ServletException&nbsp;{<br><br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;//Process&nbsp;the&nbsp;HTTP&nbsp;Get&nbsp;request<br><br>&nbsp;&nbsp;public&nbsp;void&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;throws&nbsp;ServletException,&nbsp;IOException&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(CONTENT_TYPE);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;perform(request,response);<br><br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;public&nbsp;void&nbsp;perform(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response){<br><br>try{<br><br><br>//该类功能是从oracle哭中取出blob实体<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getBlobBean&nbsp;getBlob=new&nbsp;getBlobBean();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;sos&nbsp;=&nbsp;response.getOutputStream();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getBlob.connFunction();<br><br>oracle.sql.BLOB&nbsp;blob=getBlob.getBlob("cehui");<br><br>//输出word文档<br><br>if(blob!=null){<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;pi&nbsp;=&nbsp;blob.getBinaryStream();<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;blobsize&nbsp;=(int)blob.length();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;blobbytes&nbsp;=&nbsp;new&nbsp;byte[blobsize];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;bytesRead&nbsp;=&nbsp;0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((bytesRead&nbsp;=&nbsp;pi.read(blobbytes))&nbsp;!=&nbsp;-1)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sos.write(blobbytes,&nbsp;0,&nbsp;bytesRead);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pi.close();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sos.flush();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sos.close();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getBlob.dropConnFunction();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.toString());<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;//Clean&nbsp;up&nbsp;resources<br><br>&nbsp;&nbsp;public&nbsp;void&nbsp;destroy()&nbsp;{<br><br>&nbsp;&nbsp;}<br><br>}<br>
<img src ="http://www.blogjava.net/Michael-Q/aggbug/133466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Michael-Q/" target="_blank">QBing_M</a> 2007-07-31 01:00 <a href="http://www.blogjava.net/Michael-Q/articles/133466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]hibernate存取图片示例 </title><link>http://www.blogjava.net/Michael-Q/articles/133465.html</link><dc:creator>QBing_M</dc:creator><author>QBing_M</author><pubDate>Mon, 30 Jul 2007 16:56:00 GMT</pubDate><guid>http://www.blogjava.net/Michael-Q/articles/133465.html</guid><wfw:comment>http://www.blogjava.net/Michael-Q/comments/133465.html</wfw:comment><comments>http://www.blogjava.net/Michael-Q/articles/133465.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Michael-Q/comments/commentRss/133465.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Michael-Q/services/trackbacks/133465.html</trackback:ping><description><![CDATA[相信几天后，我也会遇到这样的问题，先收藏了。。<br>转自&nbsp; <a href="http://blog.csdn.net/jyh_jack/archive/2007/01/22/1490120.aspx">http://blog.csdn.net/jyh_jack/archive/2007/01/22/1490120.aspx</a><br><br>一般网站在处理用户上传图片时通常采用两种策略：一是直接把图片存入数据库中的Blob字段；二是数据库中只存储图片的在服务器上的路径信息 ，图片存放在分门别类的文件中，使用的时候从数据库读取路径信息到页面img元素即可．在此不讨论两种方案的优劣，我只是写了个hibernate的例子来实现第一种策略．例子很简单，t_user表主要两个字段，name和photo，其中photo字段类型为Blob．在此例中数据库我采用mysql，oracle的Blob字段比较特殊，你必须自定义类型，具体的请自行搜索，这方面的资料很多．<br><br>//User.java　　<br><br>package com.denny_blue.hibernate;<br><br>import java.io.Serializable;<br>import java.sql.Blob;<br><br>public class User implements Serializable{<br>private Integer id;<br>private String name;<br>private Blob photo;<br>/**<br>&nbsp;&nbsp;* @return the id<br>&nbsp;&nbsp;*/<br>public User(){<br>}<br>public Integer getId() {<br>&nbsp;&nbsp;return id;<br>}<br>/**<br>&nbsp;&nbsp;* @param id the id to set<br>&nbsp;&nbsp;*/<br>public void setId(Integer id) {<br>&nbsp;&nbsp;this.id = id;<br>}<br>/**<br>&nbsp;&nbsp;* @return the name<br>&nbsp;&nbsp;*/<br>public String getName() {<br>&nbsp;&nbsp;return name;<br>}<br>/**<br>&nbsp;&nbsp;* @param name the name to set<br>&nbsp;&nbsp;*/<br>public void setName(String name) {<br>&nbsp;&nbsp;this.name = name;<br>}<br>/**<br>&nbsp;&nbsp;* @return the photo<br>&nbsp;&nbsp;*/<br>public Blob getPhoto() {<br>&nbsp;&nbsp;return photo;<br>}<br>/**<br>&nbsp;&nbsp;* @param photo the photo to set<br>&nbsp;&nbsp;*/<br>public void setPhoto(Blob photo) {<br>&nbsp;&nbsp;this.photo = photo;<br>}<br><br>}<br><br><br>类User有３个属性，id,name,photo，相应的getter和setter方法以及一个无参构造函数．应该注意的是photo的类型java.sql.Blob<br><br>相应的user.hbm.xml应该如下：<br><br>&lt;?xml version="1.0"?&gt;<br>&lt;!DOCTYPE hibernate-mapping PUBLIC<br>"-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br>"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br>&lt;hibernate-mapping<br>package="com.denny_blue.hibernate"&gt;<br><br>&lt;class name="com.denny_blue.hibernate.User"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table="t_user"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic-insert="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;batch-size="3"&gt;<br>&nbsp;&nbsp;&lt;id name="id"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column="id"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="java.lang.Integer"&gt;<br>&nbsp;&nbsp; &lt;generator class="native"/&gt;<br>&nbsp;&nbsp;&lt;/id&gt;<br>&nbsp;&nbsp;&lt;property name="name" column="name" type="java.lang.String" lazy="true"/&gt;<br>&nbsp;&nbsp;&lt;property name="photo" column="photo" type="java.sql.Blob"/&gt;<br><br>&lt;/class&gt;<br><br>&lt;/hibernate-mapping&gt;<br><br>对应的hibernate.cfg.xml配置文件，不再列出，请参照hibernate文档自行设定．<br><br>ＯＫ，做了这一步，我们写个测试类来进行单元测试：<br><br>package com.denny_blue.test;<br><br>import java.io.FileInputStream;<br>import java.io.FileNotFoundException;<br>import java.io.FileOutputStream;<br>import java.io.IOException;<br>import java.io.InputStream;<br>import java.sql.Blob;<br><br>import org.hibernate.Hibernate;<br>import org.hibernate.HibernateException;<br>import org.hibernate.Session;<br>import org.hibernate.SessionFactory;<br>import org.hibernate.Transaction;<br>import org.hibernate.cfg.Configuration;<br><br>import com.denny_blue.hibernate.User;<br><br>import junit.framework.TestCase;<br><br>public class HibernateTest extends TestCase {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private Session session;<br>protected void setUp() throws Exception {<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp; Configuration config=new Configuration().configure();<br>&nbsp;&nbsp; SessionFactory sf=config.buildSessionFactory();<br>&nbsp;&nbsp; session=sf.openSession();<br>&nbsp;&nbsp;}catch(HibernateException e){<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}<br>}<br><br>protected void tearDown() throws Exception {<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;}catch(HibernateException e){<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}<br>}<br><br>public void testSave()throws FileNotFoundException,IOException{<br>&nbsp;&nbsp;User user=new User();<br>&nbsp;&nbsp;user.setName("jordan");<br>&nbsp;&nbsp;FileInputStream in=new FileInputStream("C:\\test.gif");<br>&nbsp;&nbsp;Blob photo=Hibernate.createBlob(in);<br>&nbsp;&nbsp;user.setPhoto(photo);<br>&nbsp;&nbsp;Transaction tx=null;<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp;tx=session.beginTransaction();<br>&nbsp;&nbsp;session.saveOrUpdate(user);<br>&nbsp;&nbsp;tx.commit();<br>&nbsp;&nbsp;}catch(HibernateException e){<br>&nbsp;&nbsp; if(tx!=null)<br>&nbsp;&nbsp;&nbsp;&nbsp;tx.rollback();<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}finally{<br>&nbsp;&nbsp; in.close();<br>&nbsp;&nbsp;}<br>}<br>public void testLoad()throws Exception{<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp; User user=(User)session.load(User.class, new Integer(1));<br>&nbsp;&nbsp; Blob photo=user.getPhoto();<br>&nbsp;&nbsp; InputStream in=photo.getBinaryStream();<br>&nbsp;&nbsp; FileOutputStream out=new FileOutputStream("C:\\out\\test2.gif");<br>&nbsp;&nbsp; byte [] buf=new byte[1024];<br>&nbsp;&nbsp; int len;<br>&nbsp;&nbsp; while((len=in.read(buf))!=-1){<br>&nbsp;&nbsp;&nbsp;&nbsp;out.write(buf, 0, len);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; in.close();<br>&nbsp;&nbsp; out.close();<br>&nbsp;&nbsp;}catch(HibernateException e){<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}<br>}<br><br>}<br>我们读取C盘目录下的test.gif并存储到数据库中，然后再取出来写入C:\out目录，此时你可以查看下数据表中photo显示为blob,表示已经成功存入．值的注意的代码片段就是：<br><br>FileInputStream in=new FileInputStream("C:\\test.gif");<br>&nbsp;&nbsp;Blob photo=Hibernate.createBlob(in);<br>我们这里是从磁盘中读取图片，实际应用中你可以利用上传组件得到图片的２进制数据流，并利用Hibernate.createBlob方法来构造相应的Blob对象．而取图片则使用<br><br>InputStream in=photo.getBinaryStream();<br><br>这只是个简单的测试类，如果我想从数据库中取出图片并现实在页面上该如何做呢？其实也很简单，我们先要写一个servlet，在它的service方法中取出图片，并＂画＂到指定页面上．<br><br>package com.easyjf.asp.action;<br><br>import java.io.InputStream;<br>import java.io.OutputStream;<br>import java.sql.Blob;<br><br>import javax.servlet.ServletException;<br>import javax.servlet.http.HttpServlet;<br>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;<br><br>import org.hibernate.HibernateException;<br>import org.hibernate.Session;<br>import org.hibernate.SessionFactory;<br>import org.hibernate.cfg.Configuration;<br>import com.denny)blue.hibernate.User;<br><br><br>public class Test extends HttpServlet {<br><br>/**<br>&nbsp;&nbsp;* Destruction of the servlet. &lt;br&gt;<br>&nbsp;&nbsp;*/<br>private Session session;<br>public void destroy() {<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;}catch(HibernateException e){<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}<br>}<br><br>/**<br>&nbsp;&nbsp;* Initialization of the servlet. &lt;br&gt;<br>&nbsp;&nbsp;*<br>&nbsp;&nbsp;* @throws ServletException if an error occure<br>&nbsp;&nbsp;*/<br>public void init() throws ServletException {<br>&nbsp;&nbsp;try{<br>&nbsp;&nbsp; Configuration config=new Configuration().configure();<br>&nbsp;&nbsp; SessionFactory sf=config.buildSessionFactory();<br>&nbsp;&nbsp; session=sf.openSession();<br>&nbsp;&nbsp;}catch(HibernateException e){<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;public void doGet(HttpServletRequest request,HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp; User user=(User)session.load(User.class, new Integer(1));<br>&nbsp;&nbsp; Blob photo=user.getPhoto();<br>&nbsp;&nbsp; InputStream in=photo.getBinaryStream();<br>&nbsp;&nbsp; OutputStream out=response.getOutputStream();<br>&nbsp;&nbsp; byte [] buf=new byte[1024];<br>&nbsp;&nbsp; int len;<br>&nbsp;&nbsp; while((len=in.read(buf))!=-1){<br>&nbsp;&nbsp;&nbsp;&nbsp;out.write(buf, 0, len);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; in.close();<br>&nbsp;&nbsp; out.close();<br>&nbsp;&nbsp;}catch(Exception e){<br>&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>}<br><br>通过response.getOutputStream取得输出流，其他就与上段代码一致．servlet写好了，怎么在页面调用呢？那就更简单啦，直接在页面的img标签的src属性上调用该servlet即可，如：<br><br>&lt;img id="test" src="/servlet/Test"/&gt;<br>
<img src ="http://www.blogjava.net/Michael-Q/aggbug/133465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Michael-Q/" target="_blank">QBing_M</a> 2007-07-31 00:56 <a href="http://www.blogjava.net/Michael-Q/articles/133465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]终于搞定关于Hibernte的Blob更新操作 </title><link>http://www.blogjava.net/Michael-Q/articles/133463.html</link><dc:creator>QBing_M</dc:creator><author>QBing_M</author><pubDate>Mon, 30 Jul 2007 16:51:00 GMT</pubDate><guid>http://www.blogjava.net/Michael-Q/articles/133463.html</guid><wfw:comment>http://www.blogjava.net/Michael-Q/comments/133463.html</wfw:comment><comments>http://www.blogjava.net/Michael-Q/articles/133463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Michael-Q/comments/commentRss/133463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Michael-Q/services/trackbacks/133463.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近研究的重点内容，先收集资料^.^转自 http://blog.csdn.net/zengbo0710/archive/2007/03/30/1547099.aspx看了N多的文档,都是一样的,不理解,完全是网络转载,一点不负责任.所以我把我的完整代码贴如下: sql: ============================================create table ...&nbsp;&nbsp;<a href='http://www.blogjava.net/Michael-Q/articles/133463.html'>阅读全文</a><img src ="http://www.blogjava.net/Michael-Q/aggbug/133463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Michael-Q/" target="_blank">QBing_M</a> 2007-07-31 00:51 <a href="http://www.blogjava.net/Michael-Q/articles/133463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 保存大字段数据到数据库(sqlserver) </title><link>http://www.blogjava.net/Michael-Q/articles/hibernate.html</link><dc:creator>QBing_M</dc:creator><author>QBing_M</author><pubDate>Mon, 30 Jul 2007 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/Michael-Q/articles/hibernate.html</guid><wfw:comment>http://www.blogjava.net/Michael-Q/comments/133462.html</wfw:comment><comments>http://www.blogjava.net/Michael-Q/articles/hibernate.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Michael-Q/comments/commentRss/133462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Michael-Q/services/trackbacks/133462.html</trackback:ping><description><![CDATA[<p>近期 需要操作hibernate把图片往sql 2005里添加，先搜集下资料。<br>以下载自<a href="http://blog.csdn.net/haofeng82/archive/2007/06/30/1672299.aspx">http://blog.csdn.net/haofeng82/archive/2007/06/30/1672299.aspx</a>&nbsp;&nbsp; 在此感谢<br><br>这里是以sqlserver为例子的&nbsp;，oracle的特殊性暂不考虑。</p>
<p>我感觉大字段的保存应该有如下几步：</p>
<p>1 首先你必须得到一个代表上传文件的数据流；</p>
<p>2 需要一张表存储大字段数据：包括内容，类型(mimetype)，这就要看你读取时如何操作文件了：</p>
<p>&nbsp;如果你想缓存到硬盘上的话可能需要一个文件路径字段，等等。</p>
<p>3 进行保存操作</p>
<p>假设你已经能够获得文件流对象了应该是一个inputstream，我们可以编写下面的代码保存数据到数据库：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran = session.beginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TblEAccessory test=new TblEAccessory();<br>&nbsp;&nbsp;&nbsp; test.setId("testId");<br>&nbsp;&nbsp;&nbsp; test.setFileCacheName(ufile.getBaseFileName());<br>&nbsp; test.setFileExt(ufile.getExt());</p>
<p>//这里没有设置mimetype,应该设置的</p>
<p>&nbsp;&nbsp;&nbsp; Blob b = Hibernate.createBlob(ufile.fileItem.getInputStream());<br>&nbsp;&nbsp;&nbsp; test.setFileContent(b);<br>&nbsp;&nbsp;&nbsp; session.save(test);<br>&nbsp;&nbsp;&nbsp; tran.commit();</p>
<p>&nbsp;</p>
<p>这里的ufile对象是封装了fileupload的fileItem的一个类的实例，主要是存储了上传文件的流。最关键的是</p>
<p>ufile.fileItem.getInputStream()，得到了文件的流对象，怎么得到并不是这里需要讨论的问题。</p>
<p>然后我们创建了一个hibernate 大字段，将值设置上就行了。</p>
<p>&nbsp;</p>
<p>--为什么没使用oracle作例子，因为好风最近做的项目老是使用sqlserver；再加上听说oracle的最新驱动已经解决了hibernate大字段的特殊操作，还没试过，看看。</p>
<p>--使用hibernate进行大字段操作还可以通过自定义类型实现，公司里用的就是这个，不过我懒，还是喜欢这种方法</p>
<img src ="http://www.blogjava.net/Michael-Q/aggbug/133462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Michael-Q/" target="_blank">QBing_M</a> 2007-07-31 00:34 <a href="http://www.blogjava.net/Michael-Q/articles/hibernate.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>