开始我并不知道之前的Coder的怎么存储的图片,我也看不到代码。
查看数据库图片存成了Blob类型,最后可以读取成base64的string,并在页面展示出来。
{首先我在度娘上搜:“java hibernate blob读取”之类的,最后用的例子都是查询一个ResultSet结果集回来,然后通过rs.getBlob(keyName)才可以正确读取(谁配置了Hibernate还用java的ResultSet来读取数据的??),或者是配置一大堆Spring 或者 Hibernate的xml,或者是什么的,结果都不好用。反正我的目的就是将Oracle的Blob字段查询出来,并转成base64的字符串,最后在页面显示出来}
我们配置的是spring-hibernate,Dao层直接是HibernateDaoSupport或者是该类的继承类。
首先,配置hibernate的实体类Pojo,下面是例子
//这里配置的image属性为java.sql.Blob而不是oracle.sql.BLOB
public ImageInfo{
@Id
@Column(name="id")
private String Id;
@Lob
@Basic(fetch=FetchType.LAZY)
@Column(name="image",columnDefinition="BLOB")
private java.sql.Blob image;
//下面是getter 和 setter 省略了
}
然后数据查询的时候,可以使用普通的Hibernate提供的查询方法,查询的结果是List<ImageInfo>,dao层、service层的查询代码就省略了,每个人的底层都不一样,只要查询的结果是List<ImageInfo> 或者 是ImageInfo类型就可以
//上下文的代码省略,下面是已经读取到List<ImageInfo>后的代码
import java.sql.Blob;
import sumn.misc.BASE64Encoder;
...
...
List<ImageInfo> imgList = XXDao.query(...);
for(int i=0,size=imgList.size(); i<size; i++){
Blob imgBlob = imgList.get(i).getImage();
try{
BufferedInputStream bis = new BuffferedInputStream(imgBlob.getBinaryStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int index = 0;
while( (index=bis.read(buff))!=-1 ){
out.write(buff,0,index);
}
BASE64Encoder encoder = new BASE64Encoder();
String base64string = encoder.encode(out.toByteArray());
//...
bis.close();
out.close();
}catch(...){...}
}
//...
上面的base64stirng就是我们想要的内容了