hibernate入门(五)完善工具类及HQL QBC初步相关

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 InterfaceCriterion 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 一样 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值