先来回忆下对象状态,实体类在Hibernate中有三种状态,分别是瞬时、持久和脱管状态。
- 瞬时就是实体类没有和Hibernate没有任何关系,在数据库中也没有对应的记录,JVM消失这个对象也就消失了,也就是new了一个对象。
- 持久就是对象和Hibernate发生了关系,有对应的session,并且在数据库中有对应的记录,代码中session的save就将该对象保存在了数据库中,该对象也和session发生了关系,所以此时是持久的。
- 脱管就是虽然在数据库中有对应的记录,但是他对应的session关闭了。
通过ID获取一个对象
通常都是调用session的get方法来获取对象,而其是根据id来获取对象的,除此之外还要传递一个类对象,至少你要让程序知道你要获取的是哪个对象。其实除了get方法,你也可以使用load方法获取对象,关于get方法和load的区别,后面再详细说,此处留位置。
下面是获取对象的那个代码
Product p =(Product) s.get(Product.class, 6);
此语句的作用就是取出id为6的记录,如果我们需要将id为6的记录删除,那么我们就可以利用上面的语句先将id为6的记录查找出来,然后在利用语句s.delete(p)
将此条记录删除即可。
如果我们是想我修改此条记录的数据呢,那么我们也一样
- 先根据id将此条记录查找出
- 修改该对象的属性
- 通过Session的update方法将变化数据更新到数据库中
//此处省略开头代码
Product p=(Product)s.get(Product.class,6);
p.setName("RoGuiYo");
s.update(p);
这样我们就完成了一条数据的更新。
HQL
今天要看的就是Hibernate专门用于查询的语句HQL
- 根据HQL创建一个Query对象
- 设置参数
- 通过Query的list方法获取结果。
String name="RoGuiYo";
//使用hql的时候不用再前面加select
Query q=s.createQuery(" from Product where name like ?");
//此处和PreparedStatement不一样,Query时从0开始的
q.setString(0,"%"+name+"%");
List<Product> datas=q.list();
for(Product s:datas){
System.out.print(s.getName());
}
Criteria
这个是完全以面向对象的方式在进行操作,基本看不到sql的痕迹。
- 通过session的createCriteria创建一个criteria对象。
- Criteria.add增加约束,这次我们使用like的模糊查询方式
- 用list获取查询到的数据
Criteria cri=s.createCriteria(Product.class);
//此处需要什么约束用Restrictions的约束方法
c.add(Restrictions.like("name","%"+name+"%"));
List<Product> datas=cri.list();
for(Product s:datas){
System.out.print(s.getName());
}
这也可以用来进行分页数据查询,这时候无论你用的是什么数据库,分页查询的代码都是一样的。
分页查询时的代码:
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
String name="csdn";
Criteria c=s.createCriteria(Product.class);
c.add(Restrictions.like("name", "%"+name+"%"));
c.setFirstResult(5);//表示从第五条数据开始进行查询
c.setMaxResults(5);//表示一共查询5条数据
List<Product> ps=c.list();
for(Product p:ps){
System.out.println(p.getName());
}
SQL
其实在hibernate中也是可以用sql进行查询的,比如多表的联合查询、分组统计等,这时候用SQL查询效率就比较高。
我们用createSQLQuery()方法执行标准的SQL语句。
因为标准的SQL语句可能返回各种各样的结果,我们不能保证它查询的结果就一定能放进一个Product对象中,所以返回的集合里每一个元素都是一个对象数组,然后再根据下标将对象数组中的数据取出来。
String name="RoGuiYo";
String sql="select * from product_ where name like '%"+name+"%'";
Query q=s.createSQLQuery(sql);
List<Object[]> datas=q.list();
for(Object[] ds:datas){
for(Object s:ds){
//此处会输出每个对象数组中的所有数据
System.out.print(s+" ");
}
System.out.print("\n");
}