示例程序, 保存一张图片到mysql 数据库, 然后进行读取:
@Before
public void testSave() throws Exception{
Session session = HibernateUtil.getInstance().getSession();
session.beginTransaction();
BlobObj obj = new BlobObj();
File file = new File("C:\\Users\\Jack\\Workspaces\\MyEclipse 2016 CI\\hibernate\\huangmengdan.jpg");
FileInputStream fis = new FileInputStream(file);
//在hibernate3.5:
//Hibernate.createBlob(InputStream);
//session.getLobHelper(): 得到一个大字段创建助手
obj.setImg(session.getLobHelper().createBlob(fis, file.length()));
session.save(obj);
session.getTransaction().commit();
fis.close();
session.close();
}
@Test
public void testGet() throws Exception{
Session session = HibernateUtil.getInstance().getSession();
BlobObj blobObj = session.get(BlobObj.class, 1L);
Blob blob = blobObj.getImg();
File file = new File("C:\\Users\\Jack\\Workspaces\\MyEclipse 2016 CI\\hibernate\\women.jpg");
FileOutputStream fos = new FileOutputStream(file);
InputStream is = blob.getBinaryStream();
int len = 0;
byte[] buf = new byte[1024];
while((len=is.read(buf)) > 0){
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
is.close();
session.close();
}
如果你用的mysql 驱动是5.0.8 及以下版本, 这句代码session.getLobHelper().createBlob(fis, file.length()) 会报一个异常:
java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V is abstract
原因: hibernate3.5 以上版本对Blob 的创建方法进行了改动.
解决方案: 下载mysql 最新的驱动程序, 替换即可.
下面介绍大对象类型在java, sql, hibernate 中对应的类型: