java读写Oracle Blob字段
来源:互联网 发布:如何联系淘宝卖家 编辑:程序博客网 时间:2024/05/05 03:12
前几天一直在研究Oracle Text,其中用到了Blob类型,如果用过Oracle数据库并且用Blob类型存储文件(word, excel,txt…)的同学来说,肯定不陌生了。现在就做个笔记。
Blob类型字段是Oracle数据库中的一个修饰属性,他可以实现对文本,视频,图片等的存储。视频好像可以存储4G一下的内容,可以参考:http://www.cnblogs.com/wuhenke/archive/2010/10/25/1860809.html(感谢作者的提供)。
接下来让我一起学习一下:
首先 创建一个数据库带有Blob字段的表:blob_test
create table blob_test( id number, name varchar2(50), word blob )
,数据库的表已经建立完成,接下来连接数据库,
package demo;import java.sql.Connection;import java.sql.DriverManager;/**@Author koala*@version CreateTime 2016年10月23日下午7:42:25*@Function oracle DBConnect */public class DBConnection { public static Connection getDBConnection() throws Exception { Connection con = null; String driver = "oracle.jdbc.driver.OracleDriver";// database driver String url = "jdbc:oracle:thin:@localhost:1521:ORCL";// database URL String user = "C##koala"; // database name String password = "123456"; // database Password Class.forName(driver); con = DriverManager.getConnection(url, user, password); return con; }}
数据库的连接部分也写完来,接下来让我写一个上传和一个下载的类,
package demo;import java.io.*;import java.sql.*;import oracle.jdbc.OraclePreparedStatement;import oracle.jdbc.OracleResultSet;import oracle.sql.BLOB;import demo.DBConnection;/**@Author koala*@version CreateTime 2016年10月23日下午7:58:17*@Function blob_test 用blob字段进行上传*/public class Blob_test { public static void main(String[] args) throws SQLException { Connection con = null; long start = System.currentTimeMillis(); // 我们做一个上传时间的测试 OraclePreparedStatement pstmt = null; //最好用OraclePreparedStatement 对象 InputStream fin = null; OutputStream outStream = null; //输入流 String path = "e:/111.docx"; //这里的文档是我要上传的文档 File file = new File(path); try { con = DBConnection.getDBConnection(); con.setAutoCommit(false); //这里一定要设置false不然会报错 String sql = "insert into blob_test values(?,?,?)"; // blob字段有些特殊,因为它不是普通的存储,而是分离存储的,ORACLE使得它类似于一个对象,有引用和实体,先要创建一个空内容的对象(BLOB.empty_lob()),然后再填充或修改内容,然后再回写回去。 pstmt = (OraclePreparedStatement) con.prepareStatement(sql); for (int i = 0; i < 3; i++) { String name = "koala_" + i; int id = 1; pstmt.setInt(1, id + i); pstmt.setString(2, name); Blob word = BLOB.empty_lob(); pstmt.setBlob(3, word); pstmt.execute(); } System.out.println("insert is finally"); Statement stmt = con.createStatement(); // SELECT <BLOB字段> FROM <表名称> WHERE <关键字>=<插入关键值> FOR UPDATE;--FOR UPDATE是必须的。 //其实也就是得到具体的行和列,然后去更新blob的内容。 OracleResultSet rs = (OracleResultSet) stmt.executeQuery("select id,word from blob_test for update"); while (rs.next()) { //得到word(blob)字段,给字段写入内容。 BLOB blob = (BLOB) rs.getBlob("word"); outStream = blob.getBinaryOutputStream(); fin = new FileInputStream(file); byte[] b = new byte[blob.getBufferSize()]; int len = 0; while ((len = fin.read(b)) != -1) { outStream.write(b, 0, len); } fin.close(); outStream.flush(); outStream.close(); } System.out.println("update is finally"); //提交操作 con.commit(); } catch (Exception e) { e.printStackTrace(); } con.close(); long end = System.currentTimeMillis(); //计算上传一共花来多长的时间 System.out.println(end - start); }}
这样文件的上传操作就写完了,接下来我们看一下如何做文件的下载
其实下载过程也是很简单的,和上传操作类似,也是需要找到该条记录,然后找到blob字段,最后将blob字段的内容输出到文件里面。
package demo;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import oracle.jdbc.OracleResultSet;import oracle.sql.BLOB;/**@Author koala*@version CreateTime 2016年10月23日下午8:37:05*@Function 获取数据库中blob的数据*/public class getBlob_test { public static void main(String[] args) throws SQLException { Connection con = null; long start = System.currentTimeMillis(); String path = "E:\\222.docx"; //目标文件 File file = new File(path); try { con = DBConnection.getDBConnection(); con.setAutoCommit(false); Statement stmt = con.createStatement(); OracleResultSet rs = (OracleResultSet) stmt.executeQuery("select id,word from blob_test where id=1"); if (rs.next()) { BLOB blob = (BLOB) rs.getBlob("word"); FileOutputStream output = new FileOutputStream(file); InputStream input = blob.getBinaryStream(); byte[] buffer = new byte[blob.getBufferSize()]; // 如果用1024可能会丢失一些内容,所以我们直接写blob内容最大的范围 int len = 0; while ((len = input.read(buffer)) != -1) { output.write(buffer, 0, len); } input.close(); output.flush(); output.close(); System.out.println("download is finally"); } } catch (Exception e) { e.printStackTrace(); } con.close(); long end = System.currentTimeMillis(); System.out.println(end - start); }}
这样文档的上传和下载功能就完成了,我这里只是以word为例,有兴趣的同学可以换成jpg,excel,pdf均可以。
最后总结一下,blob字段作为oracle数据库中存放大文件的典型代表,很方便我们对文档内容进行存储,从而可以不用将文件存放到服务器下,大大的减少来磁盘的消耗,最大可支持4G内容的操作,但是一般也不会用到这么大文件.基于blob字段之后,将会用到Oracle Text技术对文档内容进行检索。下篇继续介绍。。。
1 0
- java读写Oracle Blob字段
- JAVA读写Oracle中blob字段
- oracle中读写blob字段的问题
- Oracle blob字段类型 文件读写实例
- 关于 Oracle Clob Blob 字段的读写
- java oracle blob 读写操作
- Java读写Blob和Clob字段源码
- 对oracle中BLOB字段读写的总结
- 对oracle中BLOB字段读写的总结
- oracle中读写blob字段的问题解析
- JAVA读取Oracle数据库BLOB字段
- 使用java操作oracle的blob字段
- java操作oracle数据库中的blob字段
- JAVA读取Oracle数据库BLOB字段
- java oracle blob字段的插入
- java读取oracle数据库中blob字段
- Java Oracle数据库BLOB字段的存取
- java 文件写入oracle数据库blob字段
- jsp学习笔记--内置对象--request对象
- 手风琴特效
- CPU 与 SoC
- 陈二狗的妖孽人生
- array_slice获取数组前几条数据
- java读写Oracle Blob字段
- 欧拉工程第23题 算出所有不能写成两个过剩数之和的正整数之和
- 简单计算器
- 针对hibernate中一对多,多对一,多对多的概述
- jsonp详解
- hiho 之KMP
- 第九周项目1-猴子选大王
- JS-事件冒泡、事件捕获 和 事件代理
- 单个图片上传以及多图同时上传