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

大对象的存储需要对数据转换成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();
    			}
    		}
     
    	}
     
    }
    

     

转载于:https://my.oschina.net/zhangmaoyuan/blog/1839033

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值