您的位置:首页 > 编程语言 > Java开发

java jdbc(三)应用实例--向数据库中存储,读取图片和文件

2016-04-12 16:28 861 查看

1.向数据库存储图片

通过PreparedStatement接口的setBinaryStream()方法,将二进制信息设置为parameterIndex。

setBinaryStream method:
1) public void setBinaryStream(int paramIndex,InputStream stream)
throws SQLException
2) public void setBinaryStream(int paramIndex,InputStream stream,long length)
throws SQLException


为了保存图片到数据库,需要用到BLOB (Binary Large Object)类型,如下:

CREATE TABLE  "IMGTABLE"
(    "NAME" VARCHAR2(4000),
"PHOTO" BLOB
)


使用实例如下:

PreparedStatement ps=con.prepareStatement("insert into imgtable values(?,?)");
ps.setString(1,"sonoo");

FileInputStream fin=new FileInputStream("d:\\upload.jpg");
ps.setBinaryStream(2,fin,fin.available());
int i=ps.executeUpdate();
System.out.println(i+" records affected");


这里的fin.available()方法是估算二进制的大小,以避免二进制信息输入过程中阻塞其他方法的调用。

2.从数据库中读取图片

同样通过PreparedStatement接口来取回图片,我们使用getBlob()方法来获取Blob实例,它是一个二进制信息。我们接着调用getBytes()方法在blob对象上,可以获得二进制信息的一个数组,这可以让我们来写成图片文件。

public Blob getBlob()throws SQLException
public  byte[] getBytes(long pos, int length)throws SQLException


现在我们继续用上面的IMGTABLE表来取回图片,并将它展示出来。在AWT中,它可以通过Toolkit类展示。在servlet, jsp, 或 html,它可以通过img标签展示。

PreparedStatement ps=con.prepareStatement("select * from imgtable");
ResultSet rs=ps.executeQuery();
if(rs.next()){//此时在第一行

Blob b=rs.getBlob(2);//2意思是第二行数据,即photo
byte barr[]=b.getBytes(1,(int)b.length());//1意思是第一张图片

FileOutputStream fout=new FileOutputStream("d:\\download.jpg");
fout.write(barr);
fout.close();  //记得关闭


3.保存文件到数据库

依然使用PreparedStatement接口来执行,这下你知道PreparedStatement的强大了吧。

PreparedStatement接口的setCharacterStream()可以将字符信息设置为parameterIndex。

1) public void setBinaryStream(int paramIndex,InputStream stream)throws SQLException
2) public void setBinaryStream(int paramIndex,InputStream stream,long length)throws SQLException


为了保存文件类型在数据库,需要用到CLOB (Character Large Object)类型,如下:

CREATE TABLE  "FILETABLE"
(    "ID" NUMBER,
"NAME" CLOB
)


使用实例:

PreparedStatement ps=con.prepareStatement(
"insert into filetable values(?,?)");

File f=new File("d:\\myfile.txt");
FileReader fr=new FileReader(f);

ps.setInt(1,101);
ps.setCharacterStream(2,fr,(int)f.length());
int i=ps.executeUpdate();
System.out.println(i+" records affected");


4.从数据库中读取文件

通过PreparedStatement接口的getClob()方法获取文件信息,接着通过Clob调用getCharacterStream(),获取字符流,这可以让我们写成文件

public Clob getClob(int columnIndex){}
public Reader getCharacterStream(long pos,long length) throws
SQLException


使用上面的FILETABLE表获取文件,代码如下:

PreparedStatement ps=con.prepareStatement("select * from filetable");
ResultSet rs=ps.executeQuery();
rs.next();//此时指向第一行

Clob c=rs.getClob(2);
Reader r=c.getCharacterStream();

FileWriter fw=new FileWriter("d:\\retrivefile.txt");

int i;
while((i=r.read())!=-1)
fw.write((char)i);

fw.close();
con.close();

System.out.println("success");
}catch (Exception e) {e.printStackTrace();  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 java