1 .无聊的讨论 :
在前面我们写了一个工具类:HibernateUtil 。其实我们还可以把CRUD 操作封装到这个工具类中,并把它们都做成静态的,这样这个工具类就可以直接调用了。但是这样的操作对查询数据可能不是很好,因为它的查询方式很多,除非我们一一考虑这些可能涉及到查询方式,并能以重载的形式进行统一管理。 其实我也试想过把这此数据库操作方法进行二次封装,在工具类写成如下形式:
public void operate(int i ){
if(i==1){ 调用更新方法,执行查询操作}
if(i==2){ 调用删除方法,执行查询操作}
if(i==3){ 调用插入方法,执行查询操作}
if(i==4){ 查询?可指定一个惯用的查询方法,但返回值如何处理,所以建议不在此处写查询,可再写一个查询的统一操作方法来总括所有的查询方法}
}
2 .HQL 的作用概述
数据库的操作,难点主要集中在查询操作中,而HQL 就是专门用来为查询服务的。
3 .HQL 应用的步骤 :
假定我们已有一个Session 对象s
>> 步骤一,获得Query 对象:Query query=s.createQuery(“HQL SELECT Sentence”);
>> 步骤二,为参数赋值:query.setXXX();
>> 步骤三,获得List 对象:LIST list=query.list(); 说明,除了此方法外,Query 接口还有一个常用的方法 uniqueResult ,如果明确查询的结果只有一个,便选择使用此方法。如果查询结果有多个使用此方法会报异常。
>> 步骤四,遍历查询结果:即遍历上面list 对象。
关于步骤二为参数赋值的问题:比如步骤一中的“HQL Sentence ”内容为:from User u where u.name=? and u.password=? and ... ,如果这里的?较少可以setXXX(0,”...”); setXXX(1,”...”); 但是如果?较多,就容易把这些设置写错,所以可以采取命令参数的方式来决定后面的setXXX 的内容。 比如:from User u where u.name= :uname and u.password= :upass and ... ,这样后面就可以写setXXX(“uname”,”...”);
4 .一个细节问题:
在前面我们的实体类为User 类,而在实体配置文件中 < class name = "User" > 意为它所关联的表为user 表(没有指定名称table ),但如果是oracle 数据库,我们知道它本身就有一张user 表,这样就产生了冲突,如何解决这种冲突?一种方法是设定table 属性为新的名字(首选方法),另一种方法是加` (数字1 前的那个符号),即这样 < class name = "User" table = "`user`" > 写,这样我们的表还是user 表。同样如果属性名与数据库中的关键字产生这种冲突,也可以按此方法解决。
5. 分页技术:
query.setFirstResult(200);query.setMaxReslut(10); 这两句的意思是符合要求的语句有很多条,我们从第200 条取,取出10 条。我们知道每种数据库的分页语句是不同的,而Hibernate 底层判断使用哪种分页语句就是参照前面配置文件的方言属性。
6.QBC 条件查询:
与它相关的是Criteria Interface ,Criterion Interface,Expressson Class 。其实它的操作和HQL 很相似。同样我们假定已有一个Session 对象s.
>> 步骤一,获得Criteria 对象:Criteria criteria = s.createCriteria(User.class ); >> 步骤二,封装查询条件为一个Criterion 对象:Criterion cr = Expression.eq ("name" , "new name" ); (说明Expression 继续于org.hibernate.criterion.Restrictions 类 ),所以也可以这样写:Criterion cr=Restrictions.eq("name","new name"); Restrictions 类中的封装查询条件的方法都有 两个参数:前一个参数是指创建Criteria 对象时所使用的参数的属性名,后一个是要与属性名比较的值。比如这里是指User 类的name 属性是否与“new name ”相等 >> 步骤三,获得带查询条件的Criteria 对象:criteria.add(cr); 执行此步才使这个对象具有一个条件限制的查询操作。 >> 步骤四,获得List 对象以遍历: List clist = criteria.list(); 补充说明 :也可以直接返回一个User 对象:User user=(User) criteria.uniqueResult();
特别说明:Criteria 对象也具有分页的功能,方式是和上面Query 一样 。