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

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

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

1,模糊查询+list迭代:

  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问题。这个我们可以通过实际的例子实验一下:

  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值来获取:

  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,但是这些操作会立即对数据库的数据进行操作,而不对缓存中的数据进行操作,那么在支持缓存时,数据可能会出现冲突,所以使用要慎用。

  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中启用查询缓存(注意不是二级缓存):

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

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

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

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

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

  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"属性:

  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的功能还是非常强大的,需要我们不断的挖掘,钻研……

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

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

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

  2. Hibernate框架进阶(上篇)

    导读 前面一片文章介绍了Hibernate框架的入门,主要是讲解Hibernate的环境搭建和简单测试,有兴趣的童鞋出门左转.本文在入门的基础上进行Hibernate的进阶讲解,分为上中下三篇,本篇为 ...

  3. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  4. Hibernate框架学习笔记

      Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...

  5. hibernate框架

    在之前的DAO开发中,对关系型数据库进行增删改查都是直接通过sql语句,需要人工的进行对象和表之间的转换.而Hibernate提供了对象和表之间进行映射的框架,使得这种转换更加方便. 1.ORM概念 ...

  6. Hibernate框架--配置,映射,主键

    SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate,    基于持久层的框架(数据访问层使用)! Spring,   创建对象处理对象的依赖关系以及框架整合! Da ...

  7. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  8. [ SSH框架 ] Hibernate框架学习之二

    一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...

  9. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

随机推荐

  1. Linux进阶之磁盘管理及LVM逻辑卷

    本节内容 磁盘管理 LVM 一.磁盘管理 1.硬盘接口 种类及其应用: IDE接口硬盘多用于家用产品,部分应用于服务器 SATA SCSI接口硬盘主要应用于服务器 SAS只在高端服务器上,价格昂贵 2 ...

  2. Scala 关键字

    Java关键字 Java 一共有 50 个关键字(keywords),其中有 2 个是保留字,目前还不曾用到:goto 和 const.true.false 和 null 看起来很像关键字,但实际上只 ...

  3. python基础之错误、调试(异常处理)

    在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误是用户输入造成的,比如让用 ...

  4. idea配置javaweb项目(最新版)

    idea(最新版)配置javaweb项目 本篇文章使用Maven构建javaweb环境 最新版maven压缩包 链接:https://pan.baidu.com/s/1El7b3YzPTZX-7QRE ...

  5. GO语言复合类型04---映射

    package main import "fmt" /* 映射(map)是键值对(key-value)数据的集合 根据键key可以快速检索值value 键值的类型可以是任意的,ke ...

  6. 使用kubeadm部署一套高可用k8s集群

    使用kubeadm部署一套高可用k8s集群 有疑问的地方可以看官方文档 准备环境 我的机器如下, 系统为ubuntu20.04, kubernetes版本1.21.0 hostname IP 硬件配置 ...

  7. 昇腾AI 软硬件全栈平台

    昇腾AI 软硬件全栈平台

  8. Halide应用开发

    Halide应用开发 1. 基本原理 1.1.介绍 随着人工智能的普及,深度学习网络的不断涌现,为了让各硬件(CPU, GPU, NPU,...)能够支持深度学习应用,各硬件芯片需要软件库去支持高性能 ...

  9. 3D-LiDAR

    3D-LiDAR 结合光学+激光扫描+数据处理技术,实现对人和物体的无盲点检测. 利用专有光学技术实现高精度,高分辨率三维扫描. 到目前为止,传感器只能准确地检测出物体的存在,而且很难感知目标的大小和 ...

  10. TensorRT 7.2.1 开发概要(上)

    TensorRT 7.2.1 开发概要(上) Abstract 这个TysRR7.2.1开发者指南演示了如何使用C++和Python API来实现最常用的深层学习层.它展示了如何使用深度学习框架构建现 ...