许多时候我们需要在数据库中保存大类型的字符串或二进制数据,如图片,下面我们就在user中添加两个大型字段,image--保存用户的照片(blob),resume--保存用户的简历(clob),注意:下面的例子是在mysql下做的,并不是所有的数据库都怎么做,像oracle就比较复杂。
blob 和 clob的区别在于,blob字段采用单字节存储,适合保存二进制数据,如图片。
clob采用多字节存储,适合保存大型文本数据。
新添字段的映射文件如下:
<property
name="Image"
column="image"
type="java.sql.Blob"
not-null="false"
/>
<property
name="Resume"
column="resume"
type="java.sql.Clob"
not-null="false"
/>
User.java如下:
public class User implements Serializable{
private int id;
private String name;
private int age;
private Blob image;
private Clob resume;
...getter/setter
}
测试新建用户:
User user = new User();
user.setId(1001);
user.setName("orm");
user.setAge(22);
FileInputStream fis = new FileInputStream("d:\\showimage.jpg");
Blob img = Hibernate.createBlob(fis);
user.setImage(img);
Clob resume = Hibernate.createClob("I'm orm");
user.setResume(resume);
session.save(user);
我们通过Hibernate.createBlob 和 Hibernate.createClob 创建了对应的Blob Clob对象,其中Blob对象基于一个FileInputStream构建,而Clob对象基于一个字符串创建。
完成了写入操作,对应的读取操作代码如下:
User user = (User)session.load(User.class, new Integer(1001));
Clob resume = user.getResume();
System.out.println(resume.getSubString(1, (int)resume.length()));
Blob img = user.getImage();
InputStream is = img.getBinaryStream();
FileOutputStream fos = new FileOutputStream("D:\\showimage2.jpg");
byte[] buf = new byte[102400];
int len;
while((len = is.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
is.close();
我们完成了针对mysql的blob/clob字段操作,看起来非常简单。
