【含义】

hql,即Hibernate Query  Language。它与我们熟知的sql很类似,它最大的特点就是对查询进行了面向对象的封装,下面会在具体例子中说明。

sql查询的是数据库中的表或字段,而hql是面向对象的,具有继承、多态、关联等特性,他针对的是对象。

【使用】

那么如何使用hql进行查询呢?首先,我们需要宏观看一下hql的几种使用方式:基本使用、外置命名和过滤器。

基本使用即我们将hql语句写在代码中,执行操作。配置文件的方式是将我们所写的hql语句转移到配置文件中,这样就很容易对其进行修改了。第三种过滤器,类似Struts中的Filter过滤器。它对查询的内容进行过滤,在映射文件中定义过滤器,程序中启用过滤器,并为过滤器参数赋值。

【基本使用】

我们先通过例子,了解下hql的基本使用,再介绍其实现原理。

/**
* 实体对象查询,
*/
public void testquery(){
Session session=null;
try{
//获得Hibernate Session
session=HibernateUtil.getSession();
//开启事务
session.beginTransaction();
//以hql语句创建Query对象,Query调用list方法返回全部实例
List shelfList=session.createQuery("from Shelf").list();
//迭代显示数据
for(Iterator iter=shelfList.iterator();iter.hasNext();){
Shelf shelf=(Shelf)iter.next();
System.out.println(shelf.getLocation());
}
//提交事务
session.getTransaction().commit();
}catch(Exception e){
//发生异常,事务回滚
e.printStackTrace();
session.getTransaction().rollback();
}finally{
//关闭Session
HibernateUtil.closeSession(session);
}
} /**
* 封装类
*/
public class HibernateUtil {
private static SessionFactory factory;
/**
* 完成sessionFactory的初始化
*/
static{
try{
//读取hibernate.cfg.xml配置文件
Configuration cfg=new Configuration().configure();
//建立sessionFactory,可访问mysql
factory=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
//获得session
public static Session getSession(){
return factory.openSession();
}
//关闭session
public static void closeSession(Session session){
if(session!=null){
if(session.isOpen()){
session.close();
}
}
}
//返回sessionFactory
public static SessionFactory getSessionFactory(){
return factory;
}
}

Session——对象的增删改查操作

Query,Criteria——执行数据库查询

SessionFactory——初始化Hibernate,创建Session对象。

Configuration——负责配置、启动Hibernate,创建SessionFactory对象。

【外置命名】

外置命名和下面要说的过滤器都是些在配置文件中的,灵活性较好。

需求是,查询Shelf中"code>1"的数据。我们需要在配置文件中,加入hql语句。

<hibernate-mapping >
<class name="com.hibernate.Shelf" table="t_shelf" >
<!-- 映射主键 -->
<id name="code">
<generator class="native"></generator>
</id>
</class>
<!--外置命名-->
<query name="queryShelf">
<![CDATA[
select s from Shelf s where s.code>?
]]>
</query>
</hibernate-mapping>

接下来,代码中就不需要再写hql语句了,但需要注意的是,要使用session的getNameQuery()方法,还要给hql中的问号占位符赋值,这里类似参数化查询的东西,也很好理解。

<span style="white-space:pre">		</span>List shelfList=session.getNamedQuery("queryShelf").setParameter(0, 1).list();
for(Iterator iter=shelfList.iterator();iter.hasNext();){
Shelf shelf=(Shelf)iter.next();
System.out.println(shelf.getLocation());
}

【过滤器】

过滤器的配置同样也是在配置文件中,这里,我们需要命名过滤器名称和参数名,以及哪个类使用过滤器

<hibernate-mapping >
<class name="com.hibernate.Shelf" table="t_shelf" >
<!-- 映射主键 -->
<id name="code">
<generator class="native"></generator>
</id>
<filter name="testFilter" condition="code < :myParam"></filter>
</class>
<!-- 过滤器 -->
<filter-def name="testFilter">
<filter-param name="myParam" type="integer"/>
</filter-def>
</hibernate-mapping>

代码中也和外置命名类似。

                session.enableFilter("testFilter").setParameter("myParam", 2);//在session中都被启用
List shelfList=session.createQuery("from Shelf").list();
for(Iterator iter=shelfList.iterator();iter.hasNext();){
Book book=(Book)iter.next();
System.out.println(book.getName());
}

【小结】

在介绍基本使用方法时,主要是以理解hql的查询原理,不能只停留在会用而已。

外置命名将hql语句抽离出来放到配置文件中,并给了他一个参数名,我们只需要在代码中用这个参数名就可以了。这样如果需求有不太大的变动时,我们就能轻松应对了。

过滤器类似Filter,也是在配置文件中,我们需要开启过滤器,让他帮我们把符合条件的数据过滤出来。但这种方式在面对复杂条件查询的时候可能会不那么方便了。

【SSH】——hql的使用方式及实现原理的更多相关文章

  1. SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)

    接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...

  2. SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP

    AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...

  3. 通过ssh秘钥的方式可以连接上CE68交换机

    结论:按照CE68交换机的用户手册中的指导,可以通过ssh 秘钥的方式连接上交换机. 1.先按照eNSP连接到网卡的方式,给CE68配置一个ip地址: 192.168.56.2 2.按照交换机的用户指 ...

  4. SSH免密登陆配置过程和原理解析

    SSH免密登陆配置过程和原理解析 SSH免密登陆配置过很多次,但是对它的认识只限于配置,对它认证的过程和基本的原理并没有什么认识,最近又看了一下,这里对学习的结果进行记录. 提纲: 1.SSH免密登陆 ...

  5. SSH两种验证方式原理

    本帖转自 http://www.cnblogs.com/hukey/p/6248468.html SSH验证方式有两种,分别为用户密码认证以及密钥认证. 1.用户密码认证方式 说明: (1) 当客户端 ...

  6. [ SSH 两种验证方式原理 ]

    SSH登录方式主要分为两种: 1. 用户名密码验证方式 说明: (1) 当客户端发起ssh请求,服务器会把自己的公钥发送给用户: (2) 用户会根据服务器发来的公钥对密码进行加密: (3) 加密后的信 ...

  7. ssh 免密码登录配置,及其原理

    1.废话不多说,先上图   2. 典型的RSA非对称加密 RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MI ...

  8. SSH用户枚举漏洞(CVE-2018-15473)原理学习

    一.漏洞简介 1.漏洞编号和类型 CVE-2018-15473 SSH 用户名(USERNAME)暴力枚举漏洞 2.漏洞影响范围 OpenSSH 7.7及其以前版本 3.漏洞利用方式 由于SSH本身的 ...

  9. ssh公私钥登录方式设置

    在Linux中ssh登录远程主机的时候能够进行公私钥的认证方式. ①环境说明:两台Linux主机,host1:192.168.5.1,host2:192.168.5.10. 如今在host1上面设置然 ...

随机推荐

  1. 困扰我的c++语法

    以下是我上周学习c++ primer的心得: 1 数组引用作为形参 c++允许将变量定义成数组的引用,以下列代码为例.形参为int (&arr)[10],该参数需分成两部分说明,引用名和 引用 ...

  2. Modify the apache2 default document and home page on ubuntu (ubuntu下修改apache2默认目录和默认主页)

    Change the apache2 default website directory As we know, The apache2 default directory at /var/www/, ...

  3. Shell 脚本进程并发&进程数控制

    Shell 都以串行的方式自上而下执行命令,不适用需要大量作业的场景. 学习此篇shell脚本进程并发,能够大大提高工作效率~ 通过wait 和 & 后台符号 可以实现并行,但无法控制进程数. ...

  4. thinkphp 下多图ajax上传图片

    碰到一个项目,有一个比较繁琐的功能6个ajax上传,基本上每个上传逻辑多不一样,记录一下 thinkphp的view页面: id方便找到这个元素 name一定要加 [ ] <div class= ...

  5. SSM框架理解搭建(虽然是网上拼的,但是实际按照搭建是可以的)——

    SpringSpring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地 ...

  6. 分享一个PC端六格密码输入框写法

    如图.我们一般做商城类的项目不免会用到支付密码输入框,我研究了下并决定发上来,也当作是自己成长路上的一点小小的记录.本次介绍的是基于vue的项目 html: <template> < ...

  7. 用bootstrap框架弄的网站。(首页)

    网站的每一处代码都加上注解,以便浏览! 效果图: <!doctype html>   <html lang="zh-cn">   <head> ...

  8. 使用MapReduce读取HBase数据存储到MySQL

    Mapper读取HBase数据 package MapReduce; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hba ...

  9. Java学习笔记八:Java的流程控制语句之循环语句

    Java的流程控制语句之循环语句 一:Java循环语句之while: 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...

  10. 13 IO多路复用 (未完成)

    IO多路复用 6.select版-TCP服务器:最多1024 import select import socket import sys server = socket.socket(socket. ...