通过JDBC向数据库中存储&读取Blob数据

本文介绍如何使用Java的JDBC接口来处理Blob大对象数据。首先,将Blob对象转换为字节数组,然后创建Blob实例并使用输出流写入数据。接着,通过预编译的PreparedStatement设置Blob数据并执行SQL。读取时,利用InputStream从数据库获取Blob数据,再将其写入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大对象的存储需要对数据转换成2进制数据,通过流的输入输出操作对Blob数据进行存储和读取操作

步骤:

  存储操作:

  1. 创建一个字节输入流,先将Blob对象读取到字节数组中byte[] b;
  2. 创建一个Blob 实例Blob pic=conn.createBlob();
  3. 创建一个字节输出流接收Blob对象的返回的输出流OutputStream os=pic.setBinaryStream(1);
  4. 将文件写到Blob中 os.write(b);//将b中的字节写到pic中
  5. 给预编译的Prepare的Statement调用setBlob()方法设置Blob类型数据
  6. 执行sql语句
读取操作:

    1. 执行getBlob()方法获得数据库中存储的Blob类型的数据
    2. //建立输入流,从数据库输入到程序中
      InputStream is=b.getBinaryStream();
    3. byte[] bs=new byte[is.available()];//创建一个字节数字存储Blob对象的数据
      is.read(bs);//将Blob读取到数组中
    4. 建立文件输出流,将字节数组中的数据写到硬盘中
      FileOutputStream fos=new FileOutputStream("G:/"+"aaa.jpg");
      //将Blob对象写到文件中
      fos.write(bs);
具体代码实现:
存储操作
public class WriteBlob {

	public static void main(String[] args) {
		Connection conn=JdbcUtil.getConnection();
		PreparedStatement ps=null;
		try {
			
			ps=conn.prepareStatement("insert into book values(null,?,?)");
			ps.setString(1, "葫芦娃");
			//1.创建一个字节输入流,指向一个文件
			FileInputStream fis=new FileInputStream("G:/abc.jpg");
			byte[] b=new byte[fis.available()];
			fis.read(b);//将字节读取到字节数组中
			//2.创建Blob
			Blob pic=conn.createBlob();
			OutputStream os=pic.setBinaryStream(1);//返回一个字节输出流
			//3.将文件写到Blob中
			os.write(b);//将b中的字节写到pic中
			os.close();//关闭资源
			fis.close();
			//4.给ps设置blob
			ps.setBlob(2, pic);
			//执行
			ps.execute();
			ps.close();
			System.out.println("插入成功");
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
读取 
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import jdbc1024.JdbcUtil;

public class ReadBlob {

	public static void main(String[] args) {
		
		Connection conn=JdbcUtil.getConnection();
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			ps=conn.prepareStatement("Select * from book where bookid=1");
			rs=ps.executeQuery();
			while(rs.next()) {
				//得到Blob对象
				Blob b=rs.getBlob(3);
				System.out.println(rs.getInt(1)+"\t"+rs.getString(2));
				if(b==null) {
					System.out.println("无照片");
				}else {
					System.out.println("有照片");
					//建立输入流,从数据库输入到程序中
					InputStream is=b.getBinaryStream();
					byte[] bs=new byte[is.available()];
					//将Blob读取到数组中
					is.read(bs);
					//建立文件输出流
					FileOutputStream fos=new FileOutputStream("G:/"+"aaa.jpg");
					//将Blob对象写到文件中
					fos.write(bs);
					System.out.println("写入成功");
					fos.close();
				}
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值