java不能直接想插入其他普通类型数据一样插入blob字段数据,因为blob相当于一个大文件块,里面有游标,需要初始化blob游标才能插入数据。所以我们要先插入一个空的blob数据,以初始化游标,然后再往这个blob字段中写入数据,来实现插入blob数据的效果,代码如下:
package controller;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBHelper {
private static Connection conn; //用于建立数据库连接
private PreparedStatement pres; //执行sql的preparedStatement
static{
try {
Class.forName("oracle.jdbc.OracleDriver"); //加载驱动类
String url="jdbc:oracle:thin:@192.168.75.131:1521:orcl"; //连接数据库的url
String user="jerry";
String pwd="jerry";
conn=DriverManager.getConnection(url,user,pwd); //请求数据库连接
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//写入blob数据
public void writeBlob(){
try {
conn.setAutoCommit(false); //关闭自动提交
String sql="insert into blobtest values(?,?,?)"; //插入语句
pres=conn.prepareStatement(sql);
pres.setInt(1, 1);
pres.setString(2, "jerry");
pres.setBlob(3,oracle.sql.BLOB.getEmptyBLOB()); //先插入空的BLOB,获取游标
pres.executeUpdate();
sql="select photo from blobtest where id=?";
pres=conn.prepareStatement(sql);
pres.setInt(1, 1); //找出ID为1的,也就是刚刚插入的
ResultSet res=pres.executeQuery();
res.next();
Blob imageBlob=res.getBlob(1); //得到该空的blob
OutputStream os = imageBlob.setBinaryStream(0);
// 读取想要存储的图片文件
InputStream is = new FileInputStream("G:\\jerry.jpg");
// 依次读取流字节,并输出到已定义好的数据库字段中.
int i = 0;
while ((i = is.read()) != -1) {
os.write(i); //Blob的输入流,相当于输入到数据库中
}
os.flush();
os.close();
conn.commit();
conn.setAutoCommit(true);// 恢复现场
if(res!=null)
res.close();
if(pres!=null)
pres.close();
System.out.println("插入成功!!!");
} catch (SQLException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void getImage(){
String sql="select photo from blobtest where id=?";
try {
pres=conn.prepareStatement(sql);
pres.setInt(1, 1);
ResultSet res=pres.executeQuery();
while(res.next()){
Blob image=res.getBlob(1); //得到该blob
InputStream is = image.getBinaryStream(); //获得该blob的输出流
FileOutputStream fos = new FileOutputStream("E:\\outputImage.jpg");
int i = 0;
while ((i = is.read()) != -1) {
fos.write(i);
}
fos.flush();
fos.close();
is.close();
}
System.out.println("成功输出图片!!!");
} catch (SQLException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}