您的位置:首页 > 数据库

将图片放入数据库中已经从数据库中把图片读出来

2012-04-22 15:13 239 查看
先讨论一下图片放入数据库中。Oracle数据库中的大对象类型有两种:

a.Blob二进制的大对象类型,主要是指音频,视频,图像,word等文档,被认为是二进制的文件。

b.Clob字符型的大对象类型,主要是指文本文件。

图片是数据库中的Blob大对象类型。如下代码是将一张图片放入数据库中。

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class SavePic {
public static void main(String[] args){
Connection conn = null;
PreparedStatement stmt = null;
String sql = "insert into pic_feng " +
"(id, name, photo) values" +
"(pic_feng_seq.nextval,?,?)";
try{
conn = ConnectionUtils.openConnection();
stmt = conn.prepareStatement(sql);
stmt.setString(1,"feng");
File f = new File("src\\ayan.JPG");
FileInputStream fis = new FileInputStream(f);

stmt.setBinaryStream(2,fis,(int)f.length());
int n = stmt.executeUpdate();
System.out.println(n+"条记录被更新");

}catch(Exception e){
e.printStackTrace();
}finally{
ConnectionUtils.closeConnection(conn);
ConnectionUtils.closeStatement(stmt);
}
}
}
建立数据库连接,利用PrepareStatement类型的对象,去调用prepareStatements()方法,执行sql语句。用这个方法主要原因是因为所执行的SQL语句中有问号存在。调用相应的set方法,将相应的值插入到数据库中。

stmt.setString(1,"feng");


这行代码中的1代表的是第一个问号,显而易见,第一个问号值得是SQL语句中的name属性,所以feng字符串知道就是将要插入数据库中这条记录的名字。由于第二的对象是大对象类型的。所以无法直接调用方法,需要将图片以流的方式读取,以二进制的形式放在数据库中。这样就实现了将图片放入数据中。

不要忘记关闭打开的资源。

接下来讨论把图片从数据库中读出来。

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class GetPic {
public static void main(String[] args){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;

String sql = "select * from stu_feng where id = ?";
try{
conn = ConnectionUtils.openConnection();

stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
rs = stmt.executeQuery();
if(rs.next()){
FileOutputStream fos = new FileOutputStream(new File("stu.bmp"));
InputStream is = rs.getBinaryStream(3);
byte[] buffer = new byte[4*1024];
int length = 0;
while((length = is.read(buffer))!=-1){
fos.write(buffer, 0, length);
}
fos.flush();
fos.close();
is.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
ConnectionUtils.closeConnection(conn);
ConnectionUtils.closeResultSet(rs);
ConnectionUtils.closeStatement(stmt);
}
}
}
上面的程序首先建立数据库连接,让回给id=?的id赋值,接着执行sql语句。

stmt.setInt(1, 1)


上面这行代码,其作用是在第一个问号的位置放入值1。也就是对SQL语句的id赋值,使id=1;接下来对id=1这条记录进行读取图片。

InputStream is = rs.getBinaryStream(3);


这条语句是指从数据库中读取第三个属性所对应该的那个对象。由于在建立表的时候,三个属性是photo ,blob类型的。所以对这对象的读去用流方式来读取。指定读出来的图片的名字和放置的位置。最后关闭资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: