大对象的存储需要对数据转换成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语句
读取操作:
- 执行getBlob()方法获得数据库中存储的Blob类型的数据
- //建立输入流,从数据库输入到程序中
InputStream is=b.getBinaryStream();
- byte[] bs=new byte[is.available()];//创建一个字节数字存储Blob对象的数据
is.read(bs);//将Blob读取到数组中
- 建立文件输出流,将字节数组中的数据写到硬盘中
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();
}
}
}
}