大对象的存储需要对数据转换成2进制数据,通过流的输入输出操作对Blob数据进行存储和读取操作
步骤:
存储操作:
- 创建一个字节输入流,先将Blob对象读取到字节数组中byte[] b;
- 创建一个Blob 实例Blob pic=conn.createBlob();
- 创建一个字节输出流接收Blob对象的返回的输出流OutputStream os=pic.setBinaryStream(1);
- 将文件写到Blob中 os.write(b);//将b中的字节写到pic中
- 给预编译的Prepare的Statement调用setBlob()方法设置Blob类型数据
- 执行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(); } } } }