锁定老帖子 主题:java操作oracle之Blob
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-08
一.写入BLOB
1.先在blob中插入empty_blob()
2.获得对刚刚插入记录的引用 BLOB blob = (BLOB) rs.getBlob("你的blob字段名称"); 3.写入 OutputStream out = blob.getBinaryOutputStream(); out.write(ENCYPWD);//注意这里 二.读出BLOB
1.blob = rs.getBlob("你的blob字段名称"); 、 2.InputStream is = blob.getBinaryStream(); int length = (int) blob.length(); byte[] buffer = new byte[length]; is.read(buffer); is.close();
3.你有了is就随便处理了 比如说输出到一个文件 FileOutputStream fo = new FileOutputStream(filename);//数据到的文件名 fo.write(buffer); fo.close();
环境: Database: Oracle 9i App Server: BEA Weblogic 8.14 表结构: CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob) CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob) JAVA可以通过JDBC,也可以通过JNDI访问并操作数据库,这两种方式的具体操作存在着一些差异,由于通过App Server的数据库连接池JNDI获得的数据库连接提供的java.sql.Blob和java.sql.Clob实现类与JDBC方式提供的不同,因此在入库操作的时候需要分别对待;出库操作没有这种差异,因此不用单独对待。 一、BLOB操作 1、入库 (1)JDBC方式
//通过JDBC获得数据库连接 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test"); con.setAutoCommit(false); Statement st = con.createStatement(); //插入一个空对象empty_blob() st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())"); //锁定数据行进行更新,注意“for update”语句 ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update"); if (rs.next()) { //得到java.sql.Blob对象后强制转换为oracle.sql.BLOB oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR"); OutputStream outStream = blob.getBinaryOutputStream(); //data是传入的byte数组,定义:byte[] data outStream.write(data, 0, data.length); } outStream.flush(); outStream.close(); con.commit(); con.close(); (2)JNDI方式 //通过JNDI获得数据库连接 Context context = new InitialContext(); ds = (DataSource) context.lookup("ORA_JNDI"); Connection con = ds.getConnection(); con.setAutoCommit(false); Statement st = con.createStatement(); //插入一个空对象empty_blob() st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())"); //锁定数据行进行更新,注意“for update”语句 ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update"); if (rs.next()) { //得到java.sql.Blob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server对应的可能会不同) weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR"); OutputStream outStream = blob.getBinaryOutputStream(); //data是传入的byte数组,定义:byte[] data outStream.write(data, 0, data.length); } outStream.flush(); outStream.close(); con.commit(); con.close(); 2、出库 //获得数据库连接 Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false); Statement st = con.createStatement(); //不需要“for update” ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1"); if (rs.next()) { java.sql.Blob blob = rs.getBlob("BLOBATTR"); InputStream inStream = blob.getBinaryStream(); //data是读出并需要返回的数据,类型是byte[] data = new byte[input.available()]; inStream.read(data); inStream.close(); } inStream.close(); con.commit(); con.close(); 二、CLOB操作
1、入库 (1)JDBC方式 //通过JDBC获得数据库连接 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test"); con.setAutoCommit(false); Statement st = con.createStatement(); //插入一个空对象empty_clob() st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())"); //锁定数据行进行更新,注意“for update”语句 ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update"); if (rs.next()) { //得到java.sql.Clob对象后强制转换为oracle.sql.CLOB oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR"); Writer outStream = clob.getCharacterOutputStream(); //data是传入的字符串,定义:String data char[] c = data.toCharArray(); outStream.write(c, 0, c.length); } outStream.flush(); outStream.close(); con.commit(); con.close(); (2)JNDI方式 //通过JNDI获得数据库连接 Context context = new InitialContext(); ds = (DataSource) context.lookup("ORA_JNDI"); Connection con = ds.getConnection(); con.setAutoCommit(false); Statement st = con.createStatement(); //插入一个空对象empty_clob() st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())"); //锁定数据行进行更新,注意“for update”语句 ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update"); if (rs.next()) { //得到java.sql.Clob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server对应的可能会不同) weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR"); Writer outStream = clob.getCharacterOutputStream(); //data是传入的字符串,定义:String data char[] c = data.toCharArray(); outStream.write(c, 0, c.length); } outStream.flush(); outStream.close(); con.commit(); con.close(); 2、出库 //获得数据库连接 Connection con = ConnectionFactory.getConnection(); con.setAutoCommit(false); Statement st = con.createStatement(); //不需要“for update” ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1"); if (rs.next()) { java.sql.Clob clob = rs.getClob("CLOBATTR"); Reader inStream = clob.getCharacterStream(); char[] c = new char[(int) clob.length()]; inStream.read(c); //data是读出并需要返回的数据,类型是String data = new String(c); inStream.close(); } inStream.close(); con.commit(); con.close();
需要注意的地方: 1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob几种类型的区别 2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob几种类型的区别
由于需要做一个JSP网页实现上传、下载文件的功能,所以这几天都在研究用什么方式,看了不少代码和方法。终于实现了,现在和大家分享,
希望对做相似功能的兄弟们有所帮助。
我用的是myeclipse开发环境。数据库客户端是Oracle9i.
1、下载SmartUpload.jar。 http://www.ciw.com.cn/blog/UploadFiles/2006-8/816529534.rar 下载以后改名为“SmartUpload.jar”。 给自己的工程导入SmartUpload.jar包。
2、设计表结构 表名:demo.file (用户是demo) 列: id varchar(20) file blob (用clob也可以)
3、建立上传文件选择网页 upload.htm
代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from url=(0057)http://localhost:8080/jspsmartfile/jsp/uploadTemplate.jsp --> <HTML><HEAD> <META content="text/html; charset=gb2312" http-equiv=Content-Type> <META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD> <BODY bgColor=#e6e6e6><BR> <FORM action="upload_oracle.jsp" encType=multipart/form-data method=post>
<TABLE> <TBODY> <TR> <TD><FONT color=#000000 face=helv,helvetica size=1> File : </FONT> <INPUT size=60 type=file name="file"></TD> <TD align=right><INPUT type=submit value=上传 name="send"></TD> </TR> </TBODY> </TABLE> </FORM> </BODY> </HTML>
4、建立上传文件处理网页 upload_oracle.jsp
代码:
<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%@ page import="oracle.sql.*"%> <%@ page import="java.io.*"%> <%@ page import=" oracle.jdbc.OracleResultSet"%> <%@ page import="com.jspsmart.upload.*" %> <jsp:useBean id="UploadBean" scope="page" class="book.book" />
<%--上传到ORACLE BOLB--%> <% //实例化上载bean com.jspsmart.upload.SmartUpload mySmartUpload=new com.jspsmart.upload.SmartUpload(); //初始化 mySmartUpload.initialize(pageContext); //设置上载的最大值 mySmartUpload.setMaxFileSize(500 * 1024*1024); //上载文件 mySmartUpload.upload(); //循环取得所有上载的文件,由于刚才的上传选择文件网页upload,htm只有一个文件所以只循环一次,如果需要一次上传多个文件,则修改upload,htm,增加多个文件选择INPUT for (int i=0;i<mySmartUpload.getFiles().getCount();i++){ //取得上载的文件 com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i); if (!myFile.isMissing()) { //取得上载的文件的文件名 String myFileName=myFile.getFileName(); //取得不带后缀的文件名 String suffix=myFileName.substring(0,myFileName.lastIndexOf('.')); //取得后缀名 String ext= mySmartUpload.getFiles().getFile(0).getFileExt(); //取得文件的大小 int fileSize=myFile.getSize(); //保存路径 // String aa=getServletContext().getRealPath("/")+"jsp\\"; //String trace=aa+myFileName; //取得别的参数 String explain=(String)mySmartUpload.getRequest().getParameter("text"); String send=(String)mySmartUpload.getRequest().getParameter("send"); //将文件保存在服务器端,
//myFile.saveAs("/image/"+myFileName, mySmartUpload.SAVE_VIRTUAL); //保存到工程的相对地址中,也就是你的工程的某个目录下。 myFile.saveAs("c:/temp/"+myFileName,mySmartUpload.SAVE_PHYSICAL); //绝对地址
//如果只需要将上传文件保存在服务器的某个文件夹下,那么可以将下面的数据库操作代码删除掉
//以下就开始操作上传文件,通过流将上传文件插入oracle的blob字段里 java.io.File file = new java.io.File("c:/temp/"+myFileName); //从刚才上传的临时文件夹找到文件 java.io.FileInputStream fis = new java.io.FileInputStream(file); out.println(file.length());
//数据库连接可以自己修改。用java bean也可以 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@172.16.1.200:1521:mis", "demo","demo"); conn.setAutoCommit(false);
oracle.sql.BLOB blob = null; //注意此处的Blob格式一定要是oracle.sql.BLOB //插入Blob的时候是先插一个空的Blob然后用UPDATE修改它 PreparedStatement pstmt = conn.prepareStatement("insert into demo.file (id,file ) values(?,empty_blob())"); pstmt.setString(1,"10000"); pstmt.executeUpdate(); pstmt.close(); pstmt = conn.prepareStatement("select file from demo.file where id= ? for update"); pstmt.setString(1,"10000"); ResultSet rs = pstmt.executeQuery(); if (rs.next()) blob = (oracle.sql.BLOB)((OracleResultSet)rs).getBlob(1);
pstmt = conn.prepareStatement("update demo.file set file=? where id=?"); OutputStream out1 = blob.getBinaryOutputStream(); // 建立输出流
byte[] data = new byte[(int)fis.available()]; fis.read(data); out1.write(data); out1.close(); fis.close();
pstmt.setBlob(1,blob); pstmt.setString(2,"fankai");
pstmt.executeUpdate(); pstmt.close();
conn.commit(); conn.close();
out.println((myFileName+" 上载成功!!!").toString()); } else { out.println(("上载失败!!!").toString()); } } //与前面的if对应 %>
5、测试上传文件。 可以通过运行以上两个网页。如果运行完毕可以在数据库相应字段找到自己的上传文件(查看数据库字段的大小是否与上传文件大小相同,
如果有PL/SQL工具则可以直接预览数据库里的内容是不是刚才上传的文件。)。
6、建立下载网页 download_oracle.jsp
代码:
<html> <head> <title>文件下载</title> </head> <body> <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%@ page import="oracle.sql.*"%> <%@ page import="java.io.*"%> <%@ page import=" oracle.jdbc.OracleResultSet"%> <%@ page import="com.jspsmart.upload.*" %>
<%--从ORALCE数据库取得文件下载到本地--%> <% Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@172.16.1.200:1521:mis", "demo","demo"); conn.setAutoCommit(false); Statement stmt = conn.createStatement(); // 查询BLOB对象
ResultSet rs = stmt.executeQuery("SELECT file FROM demo.file WHERE id='10001'"); while (rs.next()) { //取出此BLOB对象
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("image"); BufferedOutputStream out_1 = new BufferedOutputStream(new FileOutputStream("c:/1.jpg")); BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
int c; while ((c = in.read()) != -1) { out_1.write(c); } in.close(); out_1.close(); }
rs.close(); stmt.close(); conn.close(); out.println("下载成功!!"); %> </body> </html>
7、测试下载部分程序。 运行下载网页之后可以看见对应路径下有相应的文件就表示成功了!
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-06-16
不错 .... 学习了
|
|
返回顶楼 | |
发表时间:2011-08-10
插入张图片,图片在plsql显示正常,但是二进制数据是乱码,现在无法显示出来,
二进制数据为:(ÿØÿà JFIF ?? ? ? ÿÛ C ?????????? ? $.' ",#(7),01444'9=82<.342ÿÛ C? 2!!22222222222222222222222222222222222222222222222222ÿÀ ? v `??" ????ÿÄ ???????? ???????? ÿÄ µ ??????????? ?}??? ??!1A?Qa?"q2‘¡?#B±ÁRÑð$3br‚ .....................) 请问如何解决 插入代码: weblogic.jdbc.vendor.oracle.OracleThinBlob blob = null; OutputStream os = null; if(rs.next()) { try { blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob(1); os = blob.getBinaryOutputStream(); os.write(sPhoto,0,sPhoto.length); }catch(Exception ex){ ex.printStackTrace(); } finally{ os.close(); } } |
|
返回顶楼 | |
浏览 5899 次