Hibernate框架(五)面向对象查询语言和锁

Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了。但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate 
Query  Language)面向对象的查询语言,和QBC(Query by
Criteria

)完全面向对象的查询,这里简单总结一下如何是面向对象来编写ql语句呢。

一,HQL,Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql语句中的表改成实体名,字段改为属性名即可,其它基本都很相似的。主要用的是Query这个对象。返回值可以使用list,iterate(多值),uniqueResult(单值)等属性进行取值。下边看几个小例子:

1,模糊查询+list迭代:

[java] view
plain
copyprint?

  1. String key = "san";
  2. Query query = session.createQuery("FROM Student s where  s.sname like ?"); //HQL语句。看里边都是使用类名和属性名代替了数据库中的表和字段
  3. query.setParameter(0, "%"+key+"%");  //参数索引从0开始。
  4. //query.setString(0, "%"+key+"%");
  5. List<Student> sts =  query.list();
  6. for(Student s : sts){
  7. System.out.println(s.getSname());
  8. }

2,iterate相当于集合中的迭代器,Hibernate框架会先查询符合条件的所有id值,然后根据每个id去查询每一条记录,这样我们查询N条件记录时,框架帮我们发送了N+1条语句,这也就是大家经常讨论的N+1问题。这个我们可以通过实际的例子实验一下:

[java] view
plain
copyprint?

  1. Query query = session.createQuery("from Student s");
  2. Iterator<Student> it = query.iterate();
  3. while(it.hasNext()){
  4. Student s = (Student)it.next();
  5. System.out.println(s.getSname());
  6. }

3,返回结果是一个的话,可以使用uniqueResult值来获取:

[java] view
plain
copyprint?

  1. public static void testSelect8(Session session){
  2. Query query = session.createQuery("from Student s where s.sid=1");
  3. Student s = (Student)query.uniqueResult();
  4. System.out.println(s.getSname());
  5. }

4,当然Query对象也支持update,delete,insert,但是这些操作会立即对数据库的数据进行操作,而不对缓存中的数据进行操作,那么在支持缓存时,数据可能会出现冲突,所以使用要慎用。

[java] view
plain
copyprint?

  1. Query query = session.createQuery("update Student s set s.sname=‘张三123‘ where s.sid=1" );
  2. int i = query.executeUpdate();
  3. if(i==1){
  4. System.out.println("更新成功");
  5. }

5,这里说一下两者和缓存之间的关系吧:

iterate方法默认是支持缓存的,只要我们的框架配置了二级缓存的支持,iterate方法也是会支持的。

list呢?默认是不支持缓存的,如何让它支持缓存呢,这里需要我们的配置,这里简单看一下支持缓存的配置吧?

a,首先需要引入jar包和对应的xml配置文件,这里的jar包及配置文件和二级缓存的jar包是一样的:ehcache-1.2.3.jar,ehcache.xml

b,在hibernate.cfg.xml中启用查询缓存(注意不是二级缓存):

[html] view
plain
copyprint?

  1. <!--启用查询缓存 -->
  2. <propertynamepropertyname="hibernate.cache.use_query_cache">true</property>

c,让框架识别缓存组件,和二级缓存中是一样的:

[html] view
plain
copyprint?

  1. <!--让框架识别ehcache缓存组件 -->
  2. <propertynamepropertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

这样配置了以后,list就支持缓存了,此查询缓存是支持一级查询和二级查询的。

二,QBC(Query by
Criteria),是通过利用Criteria对象来进行查询的,更适合做不定参数查询的情况,这里举一个简单例子,

[java] view
plain
copyprint?

  1. Criteria cra = session.createCriteria(Student.class);
  2. // _ 匹配一个字符,   % 匹配多个字符
  3. cra.add(Restrictions.like("sname", "%s%"));
  4. cra.addOrder(Order.desc("sid"));
  5. List<Student> sts = cra.list();
  6. for(Student s : sts){
  7. System.out.println(s.getSname());

上边两项是Hibernate框架中,面向对象编写SQL语句的写法,总体上和sql语句的编写是类似的,但是更加面向对象,对一些功能的编写更加容易,我们可以根据不同情况进行不同的选择使用即可。

三,我们这里来看一下Hibernate中的锁机制吧,在此框架中锁机制包括悲观锁和乐观锁!

1,悲观锁:对于一些数据我们是不能同时去修改的,否则就会出现数据的错误,在数据库中我们可以通过行级锁select……for
update进行对数据的锁定,避免的。而在框架中就是通过悲观锁的。为什么叫它悲观锁呢?因为发生这种同时修改数据的几率是非常非常小,而此种锁却一直加上了,所以它是一种悲观者的身份来做的事。所以称为悲观锁。看一下怎么使用吧!

设置LockMode.UPGRADE参数,那么只有当前事务提交后,另外的事务才能够查询这个数据。这种悲观锁的性能比较底。

Account account =(Account)session.get(Account.class, 1 , LockMode.UPGRADE);

2,乐观锁:其实就是以乐观人的态度来解决这种数据同时修改的问题。解决原理是,当事务不同时发生时,没有锁,如果事务同步发生了,它的锁就起作用了。所以来说,它只是在这种几率很小的情况发生时才会加锁,所以叫乐观锁。它的性能大大的提高了。

a,实现方式:时间戳和版本号(Hibernate框架实现的)

b,在我们需要加乐观锁对应的数据上,添加ptimistic-lock="version"属性:

[html] view
plain
copyprint?

  1. <hibernate-mapping>
  2. <!-- optimistic-lock="version" 使用乐观锁 -->
  3. <class name="com.bjpowernode.hibernate.pojo.Account" table="t_account" optimistic-lock="version">
  4. <id name="aid" column="aid">
  5. <generator class="assigned"/>
  6. </id>
  7. <!-- 版本号字段 ,这里需要我们在对应的pojo类中添加对应的verget,set方法-->
  8. <version name="ver" column="version"></version>
  9. <property name="money"/>
  10. </class>
  11. </hibernate-mapping>

这样,框架会自动为我们调用版本号,来进行乐观锁的的管理。功能还是非常强大的。尤其对于一些特别需要安全的数据,例如银行卡的余额等等。

综上,为Hibernate中面向对象查询语句,与锁的简单总结。感觉Hibernate的功能还是非常强大的,需要我们不断的挖掘,钻研……

时间: 2024-10-09 05:00:13

Hibernate框架(五)面向对象查询语言和锁的相关文章

Hibernate(五)——面向对象查询语言和锁

Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate  Query  Language)面向对象的查询语言,和QBC(Query by Criteria)完全面向对象的查询,这里简单总结一下如何是面向对象来编写ql语句呢.  一,HQL,Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql

【Hibernate】hibernate框架的搭建

1, Hibernate 是什么 Hibernate框架简化了java应用程序与数据库交互的开发. Hibernate是一个开源,轻量级的ORM(对象关系映射)工具. 2,Hibernate框架的优点 Hibernate框架有很多优点.它们分别如下: 开源和轻量级: Hibernate框架是根据LGPL许可证和轻量级的开源工具. 快速性能: Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用. hibernate框架中有两种类型的缓存:一级缓存和二级缓存.一级缓存默认是启

Hibernate框架

SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate,    基于持久层的框架(数据访问层使用)! Spring,   创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? 1.操作XML数据 2 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术  [hibernate最终执行的也是

Hibernate框架基本使用

时间:2017-1-16 00:36 --什么是Hibernate Hibernate是一个开放源代码的关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思维来操作数据库. Hibernate可以应用在任何使用JDBC的场景,既可以在Java的客户端程序使用,也可以在Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE框架中取代CMP,完成数据持久化的重任. Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数

Hibernate框架基础

Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle-) M,Mapping 映射 ORM, 对象关系映射! ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射! 总结: Hibernate与ORM的关系? Hibernate是ORM的实现! Hibernate HelloWorld案例 搭建一个H

SSH:Hibernate框架(七种关联关系映射及配置详解)

概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系,可以简化,例如:多对一与一对多映射,只是侧重的角度不对而已. 映射技巧 映射技巧是小编写映射文件的过程,总结的经典内容,总共分为四步,咋看不是特别易懂,但是效果很好.下面我们以实例看技巧. (1)写注释 格式为:?属性,表达的是本对象与?的?关系. 解释:在写映射文件之前先写注释,将问号的地方填上相

Hibernate框架(二)POJO对象的操作

POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作. 一,Hibernate框架中主键的生成策略有三种方式: 1,数据库负责生成主键(代理主键) a,native:表示由设置的方言决定采用什么数据库生成主键方式,例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型:在Oracle数据库中,会采用序列的增长方式. b,sequence:表示采用数据库的序列生成主键,适用于Oracle,DB2数据库中. c

8、Hibernate框架(ORM详解、主文件配置、映射文件配置)

开发回顾: SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate, 基于持久层的框架(数据访问层使用)! Spring, 创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? - 操作XML数据 - 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术 [hibernate最终执行的也是

二、框架学习 (一)Hibernate框架学习 (2)Hibernate概念和api使用

目录 1 实体类编写规则 2 hibernate主键生成策略 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 hibernate的事务操作 (1)事务代码规则写法 6 hibernate其他的api(查询) 正文 实体类编写规则 1 实体类里面属性是私有的 2 私有属性使用公开的set和get方法操作. 3 要求实体类有属性作为唯一值(一般使用id值) 4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类 (1)八个基本数据类型对应的