
整个流程分为四步,连接oracle数据库 -> 读取blob字段 -> 对进行缩放 ->把展示在jsp页面上。
下面进行详细描述:
1 java连接Oracle
注:数据库是Oracle10g版本为1020, 在数据库中,字段类型为BLOB。
java中通常使用的是通过jdbc驱动来连接数据库,oracle也不例外,因此必须下载一个Oracle驱动的jdbc需要去网上进行下载,名称为 ojdbc14jar。
下载地址为:
下载了驱动之后,可以使用驱动里提供的接口进行连接,具体代码如下:
import javasql;
import javaio;
import javaximageioImageIO;
import javaawtimageBufferedImage;
import javaawtimageAffineTransformOp;
import javaawtgeomAffineTransform;
public class OracleQueryBean {
private final String oracleDriverName = "oraclejdbcdriverOracleDriver";
private Connection myConnection = null;
/表名/
private String strTabName;
/ID字段名/
private String strIDName;
/字段名/
private String strImgName;
/
加载java连接Oracle的jdbc驱动
/
public OracleQueryBean(){
try{
ClassforName(oracleDriverName);
}catch(ClassNotFoundException ex){
Systemoutprintln("加载jdbc驱动失败,原因:" + exgetMessage());
}
}
/
获取Oracle连接对象
@return Connection
/
public Connection getConnection(){
try{
//用户名+密码; 以下使用的Test就是Oracle里的表空间
//从配置文件中读取数据库信息
GetPara oGetPara = new GetPara();
String strIP = oGetParagetPara("serverip");
String strPort = oGetParagetPara("port");
String strDBName = oGetParagetPara("dbname");
String strUser = oGetParagetPara("user");
String strPassword = oGetParagetPara("password");
thisstrTabName = oGetParagetPara("tablename");
thisstrIDName = oGetParagetPara("imgidname");
thisstrImgName = oGetParagetPara("imgname");
String oracleUrlToConnect ="jdbc:oracle:thin:@"+strIP+":"+strPort+":"+strDBName;
thismyConnection = DriverManagergetConnection(oracleUrlToConnect, strUser, strPassword);
}catch(Exception ex){
Systemoutprintln("Can not get connection:" + exgetMessage());
Systemoutprintln("请检测配置文件中的数据库信息是否正确" );
}
return thismyConnection;
}
}
2 读取blob字段
在OracleQueryBean类中增加一个函数,来进行读取,具体代码如下:
/
根据在数据库中的ID进行读取
@param strID字段ID
@param w 需要缩到的宽度
@param h 需要缩到高度
@return
/
public byte[] GetImgByteById(String strID, int w, int h){
//Systemoutprintln("Get img data which id is " + nID);
if(myConnection == null)
thisgetConnection();
byte[] data = null;
try {
Statement stmt = myConnectioncreateStatement();
ResultSet myResultSet = stmtexecuteQuery("select " + thisstrIDName + " from " + thisstrTabName + " where " + thisstrIDName + "=" + strID);
StringBuffer myStringBuffer = new StringBuffer();
if (myResultSetnext()) {
javasqlBlob blob = myResultSetgetBlob(thisstrImgName);
InputStream inStream = blobgetBinaryStream();
try {
long nLen = bloblength();
int nSize = (int) nLen;
//Systemoutprintln("img data size is :" + nSize);
data = new byte[nSize];
inStreamread(data);
inStreamclose();
} catch (IOException e) {
Systemoutprintln("获取数据失败,原因:" + egetMessage());
}
data = ChangeImgSize(data, w, h);
}
Systemoutprintln(myStringBuffertoString());
myConnectioncommit();
myConnectionclose();
} catch (SQLException ex) {
Systemoutprintln(exgetMessage());
}
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 = ImageIOread(new ByteArrayInputStream(data));
int w = bisgetWidth();
int h = bisgetHeight();
double sx = (double) nw / w;
double sy = (double) nh / h;
AffineTransform transform = new AffineTransform();
transformsetToScale(sx, sy);
AffineTransformOp ato = new AffineTransformOp(transform, null);
//原始颜色
BufferedImage bid = new BufferedImage(nw, nh, BufferedImageTYPE_3BYTE_BGR);
atofilter(bis, bid);
//转换成byte字节
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIOwrite(bid, "jpeg", baos);
newdata = baostoByteArray();
}catch(IOException e){
eprintStackTrace();
}
return newdata;
}
4 展示在页面
页面使用OracleQueryBean来根据用户提供的id进行查询,在读取并进行缩放后,通过jsp页面进行展示,具体代码如下:
<%@ page language="java" contentType="text/html;;charset=gbk" %>
<jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemoOracleQueryBean" />
<%
responsesetContentType("image/jpeg");
//在数据库中的 ID
String strID = requestgetParameter("id");
//要缩略或放大的宽度
String strWidth = requestgetParameter("w");
//要缩略或放大的高度
String strHeight = requestgetParameter("h");
byte[] data = null;
if(strID != null){
int nWith = IntegerparseInt(strWidth);
int nHeight = IntegerparseInt(strHeight);
//获取的byte数据
data = OrcleQueryGetImgByteById(strID, nWith, nHeight);
ServletOutputStream op = responsegetOutputStream();
opwrite(data, 0, datalength);
opclose();
op = null;
responseflushBuffer();
//清除输出流,防止释放时被捕获异常
outclear();
out = pageContextpushBody();
}
%>
5 OracleQueryBean查询类的整体代码
OracleQueryBeanjava文件代码如下所示:
import javasql;
import javaio;
import javaximageioImageIO;
import javaawtimageBufferedImage;
import javaawtimageAffineTransformOp;
import javaawtgeomAffineTransform;
public class OracleQueryBean {
private final String oracleDriverName = "oraclejdbcdriverOracleDriver";
private Connection myConnection = null;
/表名/
private String strTabName;
/ID字段名/
private String strIDName;
/字段名/
private String strImgName;
/
加载java连接Oracle的jdbc驱动
/
public OracleQueryBean(){
try{
ClassforName(oracleDriverName);
}catch(ClassNotFoundException ex){
Systemoutprintln("加载jdbc驱动失败,原因:" + exgetMessage());
}
}
/
获取Oracle连接对象
@return Connection
/
public Connection getConnection(){
try{
//用户名+密码; 以下使用的Test就是Oracle里的表空间
//从配置文件中读取数据库信息
GetPara oGetPara = new GetPara();
这文章确实写的不错,你可以看原文
楼主是不是要这个?
update zb_1001 t set tzb_mx=to_blob(rawtohex(
select wm_concat(azb_id || '是否需要分隔符' || zb_mc) from zb_0000
))where tzb_dm='1001'
这样原先的每一行数据会以 逗号 隔开,存入 zb_1001 表的一列,因为您是需要 zb_0000 表中的两列,所以您是不是要考虑分隔符呢。
如有问题,请追问。
以上就是关于如何在java中读取oracle blob全部的内容,包括:如何在java中读取oracle blob、oracle 关于blob、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)