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

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();  }  
}  
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值