用二进制大对象类型Blob实现图片入库与出库的操作

时间:2021-03-21 20:16:28
package readclobDemo.bao;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import jdbcutil.bao.JdbcUtil; /**
原理: 在数据库中对Blob(二进制大对象)字段类型进行图片的存储和读取操作,其中Blob作为一个二进制文件的容器,对大数据对象进行处理;
步奏:1。在oracle数据库中建表 CREATE TABLE "HR"."T_IMAGES"
("IMAGEID" NUMBER(*,0) NOT NULL ENABLE,
"IMAGE" BLOB,
CONSTRAINT "T_IMAGES_PK" PRIMARY KEY ("IMAGEID")
),其中有Blob字段类型,对大对象数据的储存
2.本程序中定义了两个方法,writeBlob()方法主要实现向数据库中储存图片,readerBlob()方法主要实现从数据库中读取存入的图片数据
3.在Main()函数中对两个方法的声明
*/
public class WRBlobDemo { Connection conn=null;
PreparedStatement pasts=null;
ResultSet rs=null; public static void main(String[] args) throws IOException, SQLException {
WRBlobDemo a=new WRBlobDemo();
//a.writeBlob(2);
a.readBlob(2);
} public void writeBlob(int id) throws IOException, SQLException{ String sql1="insert into t_images(imageid,image) values('"+id+"',empty_blob())";
String sql2="select * from t_images where imageid=? for update ";
try {
conn=JdbcUtil.getConnection();
conn.setAutoCommit(false);//设置为手动提交
pasts=conn.prepareStatement(sql1);
pasts.executeUpdate();
System.out.println("图片存储成功!");
pasts=conn.prepareStatement(sql2);
System.out.println("图片存储成功!");
pasts.setInt(1, id);
rs=pasts.executeQuery();
System.out.println("图片存储成功!");
if(rs.next()){ Blob blob=rs.getBlob("image");
OutputStream out=blob.setBinaryStream(1L); //获得输出流,设置起始节点位置
InputStream in=new FileInputStream("F:\\images\\Img.jpg");
byte[] buffer=new byte[1024];
int lenth;
while((lenth=in.read(buffer))>0){ out.write(buffer,0,lenth);
}
System.out.println("图片存储成功!");
in.close();
out.close(); } conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JdbcUtil.free(rs,pasts, conn);
} } public void readBlob(int id) throws IOException{
String sql="select * from t_images where imageid=? "; try {
conn=JdbcUtil.getConnection();
pasts=conn.prepareStatement(sql);
pasts.setInt(1, id);
rs=pasts.executeQuery(); if(rs.next()){ Blob blob=rs.getBlob("image");
InputStream in=blob.getBinaryStream(); //读取返回的结果集
OutputStream out=new FileOutputStream("F:\\images\\1.jpg");//将图片读取存放在指定位置
byte[] buffer=new byte[1024];
int lenth;
while((lenth=in.read(buffer))>0){ out.write(buffer,0,lenth);
}
System.out.println("图片读取成功!");
in.close();
out.close(); } } catch (SQLException e) { e.printStackTrace();
}finally{
JdbcUtil.free(rs,pasts, conn);
} } }

用二进制大对象类型Blob实现图片入库与出库的操作用二进制大对象类型Blob实现图片入库与出库的操作