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

先讨论一下图片放入数据库中。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类型的。所以对这对象的读去用流方式来读取。指定读出来的图片的名字和放置的位置。最后关闭资源。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值