声明:本贴只用于个人学习和总结,没有任何商业用途,如果侵权或问题,请尽早联系,本人马上删贴。
Hibernate--面向对象查询语言和锁
hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了。但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate Query Language)面向对象的查询语言,和QBC(Query by Criteria)完全面向对象的查询,这里简单总结一下如何是面向对象来编写ql语句呢。
HQL
Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql语句中的表改成实体名,字段改为属性名即可,其它基本都很相似的。主要用的是Query这个对象。返回值可以使用list,iterate(多值),uniqueResult(单值)等属性进行取值。下边看几个小例子:
1,模糊查询+list迭代:
String key = "san"; Query query = session.createQuery("FROM Student s where s.sname like ?"); //HQL语句。看里边都是使用类名和属性名代替了数据库中的表和字段 query.setParameter(0, "%"+key+"%"); //参数索引从0开始。 //query.setString(0, "%"+key+"%"); List<Student> sts = query.list(); for(Student s : sts){ System.out.println(s.getSname()); }
2,iterate相当于集合中的迭代器,Hibernate框架会先查询符合条件的所有id值,然后根据每个id去查询每一条记录,这样我们查询N条件记录时,框架帮我们发送了N+1条语句,这也就是大家经常讨论的N+1问题。这个我们可以通过实际的例子实验一下:
Query query = session.createQuery("from Student s"); Iterator<Student> it = query.iterate(); while(it.hasNext()){ Student s = (Student)it.next(); System.out.println(s.getSname()); }
3,返回结果是一个的话,可以使用uniqueResult值来获取:
public static void testSelect8(Session session){ Query query = session.createQuery("from Student s where s.sid=1"); Student s = (Student)query.uniqueResult(); System.out.println(s.getSname()); }
4,当然Query对象也支持update,delete,insert,但是这些操作会立即对数据库的数据进行操作,而不对缓存中的数据进行操作,那么在支持缓存时,数据可能会出现冲突,所以使用要慎用。
Query query = session.createQuery("update Student s set s.sname='张三123' where s.sid=1" ); int i = query.executeUpdate(); if(i==1){ System.out.println("更新成功"); }
iterate和list之间的关系
- iterate默认是支持缓存的,只要我们的框架配置了二级缓存的支持,iterate方法也是会支持的。
- list默认是不支持缓存的,如何让它支持缓存呢,这里需要我们的配置。
如果要让list支持缓存,配置步骤
1. 首先需要引入jar包和对应的xml配置文件,这里的jar包及配置文件和二级缓存的jar包是一样的:ehcache-1.2.3.jar,ehcache.xml
2. 在hibernate.cfg.xml中启用查询缓存(注意不是二级缓存):
<!--启用查询缓存 --> <propertynamepropertyname="hibernate.cache.use_query_cache">true</property>
3. 让框架识别缓存组件,和二级缓存中是一样的:、
<!--让框架识别ehcache缓存组件 --> <propertynamepropertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
这样配置了以后,list就支持缓存了,此查询缓存是支持一级查询和二级查询的。
QBC
QBC(Query by Criteria),是通过利用Criteria对象来进行查询的,更适合做不定参数查询的情况,这里举一个简单例子,
Criteria cra = session.createCriteria(Student.class); // _ 匹配一个字符, % 匹配多个字符 cra.add(Restrictions.like("sname", "%s%")); cra.addOrder(Order.desc("sid")); List<Student> sts = cra.list(); for(Student s : sts){ System.out.println(s.getSname()); }
上边两项是Hibernate框架中,面向对象编写SQL语句的写法,总体上和sql语句的编写是类似的,但是更加面向对象,对一些功能的编写更加容易,我们可以根据不同情况进行不同的选择使用即可。
悲观锁和乐观锁
悲观锁
对于一些数据我们是不能同时去修改的,否则就会出现数据的错误,在数据库中我们可以通过行级锁select……for update进行对数据的锁定,避免的。而在框架中就是通过悲观锁的。为什么叫它悲观锁呢?因为发生这种同时修改数据的几率是非常非常小,而此种锁却一直加上了,所以它是一种悲观者的身份来做的事。所以称为悲观锁。看一下怎么使用吧!
设置LockMode.UPGRADE参数,那么只有当前事务提交后,另外的事务才能够查询这个数据。这种悲观锁的性能比较底。
Account account =(Account)session.get(Account.class, 1 , LockMode.UPGRADE);
乐观锁
其实就是以乐观人的态度来解决这种数据同时修改的问题。解决原理是,当事务不同时发生时,没有锁,如果事务同步发生了,它的锁就起作用了。所以来说,它只是在这种几率很小的情况发生时才会加锁,所以叫乐观锁。它的性能大大的提高了。
a,实现方式:时间戳和版本号(Hibernate框架实现的)
b,在我们需要加乐观锁对应的数据上,添加ptimistic-lock="version"属性:
<hibernate-mapping> <!-- optimistic-lock="version" 使用乐观锁 --> <class name="com.bjpowernode.hibernate.pojo.Account" table="t_account" optimistic-lock="version"> <id name="aid" column="aid"> <generator class="assigned"/> </id> <!-- 版本号字段 ,这里需要我们在对应的pojo类中添加对应的verget,set方法--> <version name="ver" column="version"></version> <property name="money"/> </class> </hibernate-mapping>
乐观锁的工作原理
读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
Hibernate为乐观锁提供了3中实现:
- 基于version
- 基于timestamp
- 为遗留项目添加添加乐观锁
配置基于version的乐观锁:
<hibernate-mapping> <class name="com.suxiaolei.hibernate.pojos.People" table="people"> <id name="id" type="string"> <column name="id"></column> <generator class="uuid"></generator> </id> <!-- version标签用于指定表示版本号的字段信息 --> <version name="version" column="version" type="integer"></version> <property name="name" column="name" type="string"></property> </class> </hibernate-mapping>
配置基于timestamp的乐观锁:
<hibernate-mapping> <class name="com.suxiaolei.hibernate.pojos.People" table="people"> <id name="id" type="string"> <column name="id"></column> <generator class="uuid"></generator> </id> <!-- timestamp标签用于指定表示版本号的字段信息 --> <timestamp name="updateDate" column="updateDate"></timestamp> <property name="name" column="name" type="string"></property> </class> </hibernate-mapping>
遗留项目,由于各种原因无法为原有的数据库添加"version"或"timestamp"字段,这时不可以使用上面两种方式配置乐观锁,Hibernate为这种情况提供了一个"optimisitic-lock"属性,它位于<class>标签上:
<hibernate-mapping> <class name="com.suxiaolei.hibernate.pojos.People" table="people" optimistic-lock="all"> <id name="id" type="string"> <column name="id"></column> <generator class="uuid"></generator> </id> <property name="name" column="name" type="string"></property> </class> </hibernate-mapping>
相关推荐
【标题】"hibernate-release-4.1.4" 是Hibernate...通过深入研究这个压缩包,开发者不仅可以了解Hibernate的基本用法,还能掌握更高级的功能,如事务管理、缓存策略、查询语言(HQL)等,从而提升开发效率和代码质量。
4. **查询语言**:HQL(Hibernate Query Language)是面向对象的查询语言,类似于SQL,但更贴近Java对象。此外,还有Criteria API和JPQL(Java Persistence Query Language)供选择。 5. **事务管理**:Hibernate...
Hibernate是Java领域中一款著名的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库编程。在这个`hibernate-release-5.0.7.Final`版本中,包含了所有相关的jar包,为开发者...
5. **HQL(Hibernate Query Language)**:这是Hibernate提供的面向对象的查询语言,类似于SQL,但操作的是对象而不是表格。HQL支持复杂的查询,包括联接、子查询、聚合函数等,可以避免直接写SQL,提高代码的可读性...
- **查询语言**: JPQL(Java Persistence Query Language)是JPA的SQL等价物,支持面向对象的查询。JPA 2.1引入了类型安全的 Criteria API,可以更安全地构建动态查询,避免SQL注入。 - **多版本并发控制**: JPA ...
Hibernate Core是Hibernate框架的基础部分,它包含了ORM的核心功能,如实体管理、事务处理、查询语言(HQL)等。`5.0.11.Final`版本是一个稳定且广泛使用的版本,提供了诸多改进和优化。 二、源码结构解析 `...
首先,Hibernate是Java平台上的一个开源ORM框架,它允许开发者用面向对象的方式来操作数据库,从而降低了数据库编程的复杂性。通过Hibernate,开发者可以避免编写大量的JDBC代码,只需定义对象的属性和关系,就能...
4. **查询语言**:Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但操作的是对象和属性。此外,Criteria API提供了一种更面向对象的方式来构建查询,避免硬编码SQL,增强代码的可读性。 5....
8. **HQL(Hibernate Query Language)**: Hibernate 提供了自己的查询语言HQL,它是面向对象的,与SQL类似但更接近Java,可以方便地进行对象级别的查询,避免直接写SQL带来的麻烦。 9. **事务管理**:Hibernate...
4. 查询语言:理解HQL(Hibernate Query Language)和Criteria API,以及它们与SQL的关系和优势。 三、参考文档 文档是学习任何技术的重要资源。Hibernate 4.2.13.Final的参考文档详细介绍了框架的所有组件、API和...
3. **查询语言HQL**:Hibernate Query Language(HQL)是一种面向对象的查询语言,类似于SQL,但更接近Java的语法,可以更方便地进行对象查询。 4. **Criteria查询**:提供了一种基于对象的查询方式,允许开发者...
3. 新的查询语言:HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)进一步完善,支持更复杂的查询表达式,同时增加了对构造函数查询的支持。 4. 错误修复和兼容性提升:5.3.2.Final修复了...
3. **查询语言(HQL)**:Hibernate Query Language是Hibernate提供的面向对象的查询语言,类似于SQL,但更贴近于Java对象。HQL使得开发者可以脱离具体的数据库方言,写出可移植性强的查询语句。 4. ** Criteria ...
Hibernate不仅提供了数据持久化的解决方案,还包含了查询语言HQL(Hibernate Query Language)以及 Criteria 查询等高级功能。 二、JPA与Hibernate注解 JPA是Java EE规范的一部分,它定义了一种标准接口,用于实现...
Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate Annotations是Hibernate框架的一个重要组成部分,它引入了基于注解...
- Hibernate特有的面向对象的查询语言,类似于SQL,但更加面向对象。 9. **事务管理**: - Hibernate支持编程式和声明式事务管理,使用Session的beginTransaction()、commit()和rollback()方法进行编程式事务控制...
同时,HQL和JPQL提供了强大的查询语言,可以方便地进行复杂的数据检索。 总结来说,hibernate-release-5.0.7全包为Java开发者提供了一个高效、便捷的数据库操作工具,通过合理的配置和使用,能够极大地提高开发效率...
HQL是Hibernate的专用查询语言,类似于SQL,但更面向对象。它可以用来查询、更新和删除持久化对象,与ORM映射的Java类和属性紧密关联。 7. **Query和CriteriaBuilder** `Query`接口和JPA的`CriteriaBuilder`是`...
Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发中的重要工具,它极大地简化了数据库操作,使得开发者能够用面向对象的方式来处理数据。本篇文章将深入探讨 Hibernate 4.3.0 Beta2 版本中的库文件,...
- **HQL(Hibernate Query Language)**:面向对象的查询语言,类似于SQL,但操作的是对象和对象集合。 - **Criteria API**:提供动态构建查询的方式,无需预先编写查询字符串,更加安全。 6. **缓存策略**: - ...