问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在java中读取oracle blob

发布网友 发布时间:2022-04-30 20:12

我来回答

3个回答

懂视网 时间:2022-05-01 00:33

获得数据库连接 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();

 

2、 put

BLOB
java 代码
  1. //获得数据库连接 
     Connection con = ConnectionFactory.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对象后强制转换为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(); 

     

java操作oracle的blob,clob数据

标签:

热心网友 时间:2022-04-30 21:41

整个流程分为四步,连接oracle数据库 -> 读取blob图片字段 -> 对图片进行缩放 ->把图片展示在jsp页面上。

下面进行详细描述:
1. java连接Oracle

注:数据库是Oracle10g版本为10.2.0, 在数据库中,图片字段类型为BLOB。

java中通常使用的是通过jdbc驱动来连接数据库,oracle也不例外,因此必须下载一个Oracle驱动的jdbc需要去网上进行下载,名称为 ojdbc14.jar。

下载地址为:

下载了驱动之后,可以使用驱动里提供的接口进行连接,具体代码如下:

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();

这文章确实写的不错,你可以看原文

热心网友 时间:2022-04-30 22:59

byte[] content = null;
java.sql.Blob blob = rs.getBlob("字段名");
if (blob != null){
inStream = blob.getBinaryStream();
bot = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len = 0;
while ((len = inStream.read(b)) != -1) {
bot.write(b, 0, len);
}
content = bot.toByteArray();
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
派出所能监听个人手机吗 ...富士康IDPBG事业群,请教一下该事业群有哪些岗位?具体分别是做什么的... 富士康aw制造是做什么的公司 业成部门生产课是做什么的 小米官网上面怎么查物流? 小米昨天下午就显示配货了怎么还不出库啊?我后面买的配件都出库了,我深... VB.net2008实例 编写文字加解密程序介绍_VB.net2008实例 编写文字加解 ... 简单的vb加密解密问题,不用输入密码的 赛车驾照价格是怎样的? Excel函数操作题第16套 华为手机首次用怎么充电,要充三次吗 饭圈txmv是什么意思 英语语法中的MV是什么意思 MV什么意思? MV是啥意思?有没有影像? MV什么意思啊 000016到底是上证50指数还是深康佳A? 网络语言mv什么意思 apple怎么装换格式? 怎么把iPhone4里面的时间格式比如“下午2:40”转换成“14:40” 好朋友向我借了很多书没有还,怎么办呢? 朋友跟我借钱,他不还给我,该怎么办? 银行卡三年无交易,还能转账进去吗? 如果工商银行卡已经很长时间没用了,用其他银行卡往进转账成功,是不是还可以用? 银行卡常时间不用*年了但是还能用支付宝转出或转进卡里钱,没作废吧? 微信视频发群看不见单发看得见 农业银行卡两年没用了,里面没钱,在手机上都是正常的,可以转账什么的,但是在ATM 机上面不用识别? 银行卡大概一年没用了,还能转账吗? 问一下股票分红的情况~ 怎样评大秦铁路?明天大秦铁路股票走势?大秦铁路今年分红没有? 请问下黄历上面的宜破屋跟拆卸分别是什么意思? 宜破屋是什么意思 黄历中的破屋指什么意思 底薪3500扣五险一金怎么算 黄历里面破屋是什么意思 工资怎样扣除五险一金 这个忌:余事勿取是什么意思? 底薪4500五险一金扣多少 宜破屋忌诸事不宜是不是矛盾 五险一金是从底薪扣吗 五险一金是怎么算的?都包括那些?是在基本工资里扣的吗 宜 破屋 坏恒 余事勿取 是什么意思?这样的一天适合办本命年酒席吗? 工资底薪3500,五险一金怎么算? “馀事勿取”是什么意思? 忌馀事勿取是什么意思 我们家门坏了,今天农历七月十五,万年历说宜破屋,忌诸事不宜,那今天还可以安装吗? 职场小白刚拿到第一个月工资,这个工资是扣除了五险一金的吗,怎么算呢? 由细菌,病毒,寄生虫引起的传染病有哪些? 拆房子黄道吉日选择农历2月有几天吉日 传染病都是由细菌和病毒引起的吗?