- 浏览: 255348 次
文章分类
最新评论
-
yilisha_andrea:
不在意那么多,然后用的<button& ...
解析<button>和<input type="button"> 的区别 -
szh_java:
很久很久之前看过楼主的这篇文章,当时不知道什么感觉,现在感觉挺 ...
两年外包女程序员的真实感受 -
dabing69221:
珍爱生命 ,远离外包
两年外包女程序员的真实感受 -
dabing69221:
在华为做一年外包的苦逼程序员飘过,你所说的感同身受, 往事历历 ...
两年外包女程序员的真实感受 -
beating011:
请问你有TimesTen6.0的安装程序么,linux的安装 ...
oracle 内存数据库 TimesTen试用笔记(aix5.3)
近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图片字段并显示,在此过程中,遇到一些问题,例如:连接Oracle数据库读取blob字段数据,对图片byte数据进行缩放等;特此记录,给自己备忘,给大家参考。
整个流程分为四步,连接oracle数据库 -> 读取blob图片字段 -> 对图片进行缩放 ->把图片展示在jsp页面上。
下面进行详细描述:
1. java连接Oracle
注:数据库是Oracle10g版本为10.2.0, 在数据库中,图片字段类型为BLOB。
java中通常使用的是通过jdbc驱动来连接数据库,oracle也不例外,因此必须下载一个Oracle驱动的jdbc需要去网上进行下载,名称为 ojdbc14.jar。
下载地址为:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101040.html
下载了驱动之后,可以使用驱动里提供的接口进行连接,具体代码如下:
import java.sql.*; import java.io.*; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.image.AffineTransformOp; import java.awt.geom.AffineTransform; public class OracleQueryBean { private final String oracleDriverName = "oracle.jdbc.driver.OracleDriver"; private Connection myConnection = null; /*图片表名*/ private String strTabName; /*图片ID字段名*/ private String strIDName; /*图片字段名*/ private String strImgName; /** * 加载java连接Oracle的jdbc驱动 */ public OracleQueryBean(){ try{ Class.forName(oracleDriverName); }catch(ClassNotFoundException ex){ System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage()); } } /** * 获取Oracle连接对象 * @return Connection */ public Connection getConnection(){ try{ //用户名+密码; 以下使用的Test就是Oracle里的表空间 //从配置文件中读取数据库信息 GetPara oGetPara = new GetPara(); String strIP = oGetPara.getPara("serverip"); String strPort = oGetPara.getPara("port"); String strDBName = oGetPara.getPara("dbname"); String strUser = oGetPara.getPara("user"); String strPassword = oGetPara.getPara("password"); this.strTabName = oGetPara.getPara("tablename"); this.strIDName = oGetPara.getPara("imgidname"); this.strImgName = oGetPara.getPara("imgname"); String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName; this.myConnection = DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword); }catch(Exception ex){ System.out.println("Can not get connection:" + ex.getMessage()); System.out.println("请检测配置文件中的数据库信息是否正确." ); } return this.myConnection; } } 2. 读取blob字段 在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下: /** * 根据图片在数据库中的ID进行读取 * @param strID 图片字段ID * @param w 需要缩到的宽度 * @param h 需要缩到高度 * @return */ public byte[] GetImgByteById(String strID, int w, int h){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; //System.out.println("img data size is :" + nSize); data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } data = ChangeImgSize(data, w, h); } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data; } 3. 缩放图片 因为图片的大小可能不一致,但是在页面中输出的大小需要统一,所以需要 在OracleQueryBean类中增加一个函数,来进行缩放,具体代码如下: /** * 缩小或放大图片 * @param data 图片的byte数据 * @param w 需要缩到的宽度 * @param h 需要缩到高度 * @return 缩放后的图片的byte数据 */ private byte[] ChangeImgSize(byte[] data, int nw, int nh){ byte[] newdata = null; try{ BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data)); int w = bis.getWidth(); int h = bis.getHeight(); double sx = (double) nw / w; double sy = (double) nh / h; AffineTransform transform = new AffineTransform(); transform.setToScale(sx, sy); AffineTransformOp ato = new AffineTransformOp(transform, null); //原始颜色 BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR); ato.filter(bis, bid); //转换成byte字节 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bid, "jpeg", baos); newdata = baos.toByteArray(); }catch(IOException e){ e.printStackTrace(); } return newdata; } 4. 展示在页面 页面使用OracleQueryBean来根据用户提供的图片id进行查询,在读取并进行缩放后,通过jsp页面进行展示,具体代码如下: <%@ page language="java" contentType="text/html;;charset=gbk" %> <jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemo.OracleQueryBean" /> <% response.setContentType("image/jpeg"); //图片在数据库中的 ID String strID = request.getParameter("id"); //要缩略或放大图片的宽度 String strWidth = request.getParameter("w"); //要缩略或放大图片的高度 String strHeight = request.getParameter("h"); byte[] data = null; if(strID != null){ int nWith = Integer.parseInt(strWidth); int nHeight = Integer.parseInt(strHeight); //获取图片的byte数据 data = OrcleQuery.GetImgByteById(strID, nWith, nHeight); ServletOutputStream op = response.getOutputStream(); op.write(data, 0, data.length); op.close(); op = null; response.flushBuffer(); //清除输出流,防止释放时被捕获异常 out.clear(); out = pageContext.pushBody(); } %> 5. OracleQueryBean查询类的整体代码 OracleQueryBean.java文件代码如下所示: import java.sql.*; import java.io.*; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.awt.image.AffineTransformOp; import java.awt.geom.AffineTransform; public class OracleQueryBean { private final String oracleDriverName = "oracle.jdbc.driver.OracleDriver"; private Connection myConnection = null; /*图片表名*/ private String strTabName; /*图片ID字段名*/ private String strIDName; /*图片字段名*/ private String strImgName; /** * 加载java连接Oracle的jdbc驱动 */ public OracleQueryBean(){ try{ Class.forName(oracleDriverName); }catch(ClassNotFoundException ex){ System.out.println("加载jdbc驱动失败,原因:" + ex.getMessage()); } } /** * 获取Oracle连接对象 * @return Connection */ public Connection getConnection(){ try{ //用户名+密码; 以下使用的Test就是Oracle里的表空间 //从配置文件中读取数据库信息 GetPara oGetPara = new GetPara(); String strIP = oGetPara.getPara("serverip"); String strPort = oGetPara.getPara("port"); String strDBName = oGetPara.getPara("dbname"); String strUser = oGetPara.getPara("user"); String strPassword = oGetPara.getPara("password"); this.strTabName = oGetPara.getPara("tablename"); this.strIDName = oGetPara.getPara("imgidname"); this.strImgName = oGetPara.getPara("imgname"); String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName; this.myConnection = DriverManager.getConnection(oracleUrlToConnect, strUser, strPassword); }catch(Exception ex){ System.out.println("Can not get connection:" + ex.getMessage()); System.out.println("请检测配置文件中的数据库信息是否正确." ); } return this.myConnection; } /** * 根据图片在数据库中的ID进行读取 * @param strID 图片字段ID * @param w 需要缩到的宽度 * @param h 需要缩到高度 * @return 缩放后的图片的byte数据 */ public byte[] GetImgByteById(String strID, int w, int h){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; //System.out.println("img data size is :" + nSize); data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } data = ChangeImgSize(data, w, h); } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data; } /** * 根据图片在数据库中的ID进行读取,显示原始大小的图片 * @param strID 图片字段ID * @return 读取后的图片byte数据 */ public byte[] GetImgByteById(String strID){ //System.out.println("Get img data which id is " + nID); if(myConnection == null) this.getConnection(); byte[] data = null; try { Statement stmt = myConnection.createStatement(); ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID); StringBuffer myStringBuffer = new StringBuffer(); if (myResultSet.next()) { java.sql.Blob blob = myResultSet.getBlob(this.strImgName); InputStream inStream = blob.getBinaryStream(); try { long nLen = blob.length(); int nSize = (int) nLen; data = new byte[nSize]; inStream.read(data); inStream.close(); } catch (IOException e) { System.out.println("获取图片数据失败,原因:" + e.getMessage()); } } System.out.println(myStringBuffer.toString()); myConnection.commit(); myConnection.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } return data; } /** * 缩小或放大图片 * @param data 图片的byte数据 * @param w 需要缩到的宽度 * @param h 需要缩到高度 * @return */ private byte[] ChangeImgSize(byte[] data, int nw, int nh){ byte[] newdata = null; try{ BufferedImage bis = ImageIO.read(new ByteArrayInputStream(data)); int w = bis.getWidth(); int h = bis.getHeight(); double sx = (double) nw / w; double sy = (double) nh / h; AffineTransform transform = new AffineTransform(); transform.setToScale(sx, sy); AffineTransformOp ato = new AffineTransformOp(transform, null); //原始颜色 BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR); ato.filter(bis, bid); //转换成byte字节 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bid, "jpeg", baos); newdata = baos.toByteArray(); }catch(IOException e){ e.printStackTrace(); } return newdata; } }
发表评论
-
解析<button>和<input type="button"> 的区别
2012-06-15 00:01 57188一、定义和用法 <button> 标签定义 ... -
提交方法:post和get比较
2012-06-11 00:27 13841我们知道,从一个页面转向另一个页面的请求方式有两种,那 ... -
Servlet学习的小总结
2012-05-08 23:02 41951,什么是Servlet 2,Servlet有什么作用 ... -
Java 之 Array 数组
2012-04-23 22:06 1074Java反射技术除了可以在运行时动态地决定要创建什么类型的对象 ... -
Java 之 String 类型
2012-04-23 22:05 10561. String是一个对象 因为对象的默认值是null,所以 ... -
Java 基本数据类型 sizeof 功能
2012-04-23 22:05 1049Java基本数据类型int 32bitshor ... -
Java Date 和 Calendar
2012-04-23 22:03 927Java 语言的Date(日期),Calendar(日历 ... -
Java Date 和 Calendar 实例
2012-04-23 22:01 1035Java 之 Date 和 Calendar 实例 [ ... -
s5pc110 uboot
2012-04-22 14:53 14401.No MBR错误 如果提示如下错误:Error: ... -
Centos5.4 消息队列rabbitmq的安装及使用
2012-04-22 14:52 1468消息队列的使用能使一些操作异步化,从而能更快的响应用户 ... -
Oracle 在 2011 年取得的 Java 主要成就
2012-04-17 23:54 1470甲骨文公司继续推动 Java 前进的战略。自2010年1 ... -
java如何对Oracle中数据进行备份
2012-04-17 23:52 1365背景:在删除大量数据前,对这些数据进行备份 ... -
Oracle 10g java.lang.Exception: Exception in sending Request :: null
2012-04-17 23:51 881Oracle 10G重建EM DB Control 1 ... -
Oracle领导下的Java长远发展战略
2012-04-17 23:48 808根据Oracle最新的PPT “To Java SE 8 ... -
linux 下手工新建数据库
2012-04-16 22:15 1058手工新建数据库create database身为DBA,要永远 ... -
Oracle 绑定变量
2012-04-16 22:14 2137oracle 中,对于一个 ... -
Oracle Rman跨resetlogs版本恢复
2012-04-16 22:13 965RMAN> startup nomount; R ... -
Oracle 表空间基本操作
2012-04-16 22:12 9551. 查询数据库现在的表空间 select ... -
Windows Oracle 10G手工创建数据库
2012-04-16 22:11 966在Oracle中建库,通常有两种方法。 一 ... -
Java Build工具Ant与Maven之比较
2012-04-15 23:42 1470没有一件东西能满足你的全部想法除非你自己创造一个出来。同 ...
相关推荐
java中读取ORACLE中BLOB字段存储的图片
可以从数据库中读取blob字段并插入到另一个表中,已经测试通过
使用JAVA读取ORACLE_BLOB字段实现上传下载.doc
有关Oracle对blob字段的操作读取方法,里面有详细的例子
kettle通过java代码将数据库blob 字段抽取到本地文件
在VC6中使用ADO读取Oracle中的BLOB字段
C#访问oracle数据库类 1、执行非查询命令 2、执行查询命令 3、带blob字段读写
此文档是对于oracle数据库中blob类型字段二进制大对象的读取和解析
简单写的一个小工具,把图片存入oracle中,按clob和blob两种方式存储,并读取图片
分享在JAVA中Blob转换成String实例
主要介绍了java读写oracle的blob字段示例,需要的朋友可以参考下
本文给大家浅析mybatis oracle blob类型字段的保存与读取,blob字段是指二进制大对象,用来存储大量文本数据。感兴趣的朋友一起学习吧
Struts用 JDBC Blob字段 保存和读取 Oracle 数据库 好用 试过 有详细注释
分块读取Oracle中Blob字段内容,通过Delphi做客户端程序进行演示。 参考见: http://www.cnblogs.com/ChinaEHR/p/3390592.html
下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。 先建立如下两个测试用的数据库表,Power Designer PD模型如下: 建表SQL语句为:CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)CREATE
Hibernate读取blob字段
oracle中用来存储大数据的BLOB(图片,文本,文件等)的 读写与复制方法
使用PLSQL从数据库中读取BLOB对象
oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。