1、以Blob类型保存图片
直接一行代码读懂:
public void testWriteBlob() throws IOException{
Students s = new Students(2,"jj","男",new Date(),"山大");
//获得照片文件
File file = new File("D:"+File.separator+"1.JPG");
//获得输入流
FileInputStream input = new FileInputStream(file);
//创建Blob对象
Blob image = Hibernate.getLobCreator(session).createBlob(input, input.available());
//设置照片属性
s.setPicture(image);
//保存学生
session.save(s);
//前提是在Student类中新建Blob类型的属性picture
}
2、读取Blob类型的数据
public void testReadBlob() throws SQLException, IOException{
//获得学生对象,第一个参数学生类的class,第二个参数:主键
Students s =(Students)session.get(Students.class, 2);
//获得Blob对象
Blob image = s.getPicture();
//获得照片的输入流
InputStream input = image.getBinaryStream();
//创建输出流
File file = new File("D:"+File.separator+"dest.JPG");
//获得输出流
FileOutputStream output = new FileOutputStream(file);
int b;
while((b = input.read())!=-1){
output.write(b);
}
input.close();
output.close();
}
3、组件属性
就是持久化类中的属性有一个是类的对象,这个属性就是组件属性。
组件属性和普通的属性的用法也没有什么不同,唯一不同的连个地方:
1、生成类对象的时候,set这个属性的时候,要先生成这个组件属性的对象,再将这个对象set进去。
2、hbm配置文档:假如之前的adress属性是String类型的,之后的是一个类,然后这个类里有phone、postcode、adress三个属性。
之前的属性:
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
之后的属性:
<component name = "address" class="Address">
<property name ="postcode" column="POSTCODE"></property>
<property name ="phone" column="PHONE"></property>
<property name ="address" column="ADDRESS"></property>
</component>
4、单表增删改查的操作
1、 save保存对象
public void testStudents(){
//生成学生对象
Students s = new Students(1,"jinjin","男",new Date(),"山科");
session.save(s);//保存对象到数据库
}
2、update方法更新表的信息
public void testUpdatestudents(){
//第一个参数是查询表的类类型,第二个参数是主键
Students s =(Students)session.get(Students.class, 2);
s.setName("jiuejie");
session.update(s);
}
3、load方法获取学生对象:
public void testLoadstudents(){
//第一个参数是查询表的类类型,第二个参数是主键
Students s =(Students)session.load(Students.class, 2);
System.out.println(s);
4、Get方法获取学生对象:
public void testGetstudents(){
//第一个参数是查询表的类类型,第二个参数是主键
Students s =(Students)session.get(Students.class, 2);
System.out.println(s);
}
5、delete方法删除学生对象
public void testDeletestudents(){
//第一个参数是查询表的类类型,第二个参数是主键
Students s =(Students)session.get(Students.class, 2);
session.delete(s);
}
6、get方法和load方法的区别
1.在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
2.load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
3.查询数据库中不存在的数据时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException