[原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.hibernate 的检索方式

  1)导航对象图检索方式:  根据已经加载的对象导航到其他对象

  2)OID 检索方式: 按照对象的 OID 来检索对象(session 的get方法 和load方法)

  3)HQL 检索方式: 使用面向对象的 HQL 查询语言 ***

  4)QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口

  5)本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句

2.HQL 检索方式:HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式. 它有如下功能  

  1)在查询语句中设定各种查询条件   :  where 过滤

  2)支持投影查询, 即仅检索出对象的部分属性

  3)支持分页查询

  4)支持连接查询

  5)支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字

  6)提供内置聚集函数, 如 sum(), min() 和 max()

  7)支持子查询

  8)支持动态绑定参数

  9)能够调用 用户定义的 SQL 函数或标准的 SQL 函数

3.实现方式

  1)检索步骤  ***

    ① 通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数

    ② 动态绑定参数

    ③ 调用 Query 相关方法执行查询语句.

  2)Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例, 而不是 void 类型

  3)HQL vs SQL:

    ① HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句.

         HQL 查询语句中的主体是域模型中的类及类的属性

    ② SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段.

  4)绑定参数:

    ① Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能.

    ② HQL 的参数绑定由两种形式

      >按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “ : ” 开头.

      >按参数位置绑定: 在 HQL 查询语句中用 “ ? ” 来定义参数位置

    ③ 相关方法

      > setEntity():  把参数与一个持久化类绑定

      > setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定 Hibernate 映射类型

     ④HQL 采用 ORDER BY 关键字对查询结果排序

  

4. HQL 版本 hello word

    Employee

 1 package com.jason.hibernate.entities.HQL;
 2
 3 public class Employee {
 4
 5     private Integer id;
 6     private String name;
 7     private float salary;
 8     private String email;
 9
10     private Department dept;
11
12     public Integer getId() {
13         return id;
14     }
15
16     public void setId(Integer id) {
17         this.id = id;
18     }
19
20     public String getName() {
21         return name;
22     }
23
24     public void setName(String name) {
25         this.name = name;
26     }
27
28     public float getSalary() {
29         return salary;
30     }
31
32     public void setSalary(float salary) {
33         this.salary = salary;
34     }
35
36     public String getEmail() {
37         return email;
38     }
39
40     public void setEmail(String email) {
41         this.email = email;
42     }
43
44     public Department getDept() {
45         return dept;
46     }
47
48     public void setDept(Department dept) {
49         this.dept = dept;
50     }
51
52 }

    Department

 1 package com.jason.hibernate.entities.HQL;
 2
 3 import java.util.HashSet;
 4 import java.util.Set;
 5
 6 public class Department {
 7
 8     private Integer id;
 9     private String name;
10
11     private Set<Employee> emps = new HashSet<>();
12
13     public Integer getId() {
14         return id;
15     }
16
17     public void setId(Integer id) {
18         this.id = id;
19     }
20
21     public String getName() {
22         return name;
23     }
24
25     public void setName(String name) {
26         this.name = name;
27     }
28
29     public Set<Employee> getEmps() {
30         return emps;
31     }
32
33     public void setEmps(Set<Employee> emps) {
34         this.emps = emps;
35     }
36
37 }

    Department.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2016-10-6 19:46:22 by Hibernate Tools 3.4.0.CR1 -->
 5
 6 <hibernate-mapping package="com.jason.hibernate.entities.HQL">
 7
 8     <class name="Department" table="GG_DEPARTMENT">
 9
10         <id name="id" type="java.lang.Integer">
11             <column name="ID" />
12             <generator class="native" />
13         </id>
14
15         <property name="name" type="java.lang.String">
16             <column name="NAME" />
17         </property>
18
19         <set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true">
20             <key>
21                 <column name="DEPT_ID" />
22             </key>
23             <one-to-many class="Employee" />
24         </set>
25
26     </class>
27 </hibernate-mapping>

    Employee.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2016-10-6 19:46:22 by Hibernate Tools 3.4.0.CR1 -->
 5
 6 <hibernate-mapping package="com.jason.hibernate.entities.HQL">
 7
 8     <class name="Employee" table="GG_EMPLOYEE">
 9         <id name="id" type="java.lang.Integer">
10             <column name="ID" />
11             <generator class="native" />
12         </id>
13
14         <property name="name" type="java.lang.String">
15             <column name="NAME" />
16         </property>
17
18         <property name="salary" type="float">
19             <column name="SALARY" />
20         </property>
21
22         <property name="email" type="java.lang.String">
23             <column name="EMAIL" />
24         </property>
25
26         <many-to-one name="dept" class="Department" fetch="join">
27             <column name="DEPT_ID" />
28         </many-to-one>
29
30     </class>
31
32 </hibernate-mapping>

    hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
 <!-- hibernate 连接数据库的基本信息 oracle -->
             <property name="connection.username">scott</property>
            <property name="connection.password">zhangzhen</property>
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<!-- orcale 方言 -->
           <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- 执行操作时是否在控制台打印SQL  -->
        <property name="show_sql">true</property>

        <!-- 是否都SQL 进行格式化 -->
        <property name="format_sql">true</property>

        <!-- 指定自动生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>

        <!-- 设置hibernate 的事务隔离级别 -->
        <property name="connection.isolation">2</property>
<!-- 对于mysql 无效,对于oracle 有效 -->
        <!-- 设定JDBC 的Statement 读取数据的时候每次从数据库中取出的记录的条数 -->
        <property name="hibernate.jdbc.fetch_size">100</property>

        <!-- 设置数据库进行批量删除,批量更新和批量插入的时候的大小 -->
        <property name="hibernate.jdbc.batch_size">30</property>
<!-- HQL -->
        <mapping resource="com/jason/hibernate/entities/HQL/Department.hbm.xml"/>
        <mapping resource="com/jason/hibernate/entities/HQL/Employee.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

HibernateTest

 1 package com.jason.hibernate.entities.HQL;
 2
 3 import java.util.List;
 4
 5 import org.hibernate.Query;
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8 import org.hibernate.Transaction;
 9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.hibernate.service.ServiceRegistryBuilder;
12 import org.junit.After;
13 import org.junit.Before;
14 import org.junit.Test;
15
16 public class HibernateTest {
17
18     private SessionFactory sessionFactory;
19     private Session session;
20     private Transaction transaction;
21
22     // 创建上述三个对象
23     @Before
24     public void init() {
25         Configuration configuration = new Configuration().configure();
26         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
27                 .applySettings(configuration.getProperties())
28                 .buildServiceRegistry();
29
30         sessionFactory = configuration.buildSessionFactory(serviceRegistry);
31
32         session = sessionFactory.openSession();
33
34         transaction = session.beginTransaction();
35     }
36
37     // 关闭上述三个对象
38     @After
39     public void destroy() {
40         transaction.commit();
41         session.close();
42         sessionFactory.close();
43     }
44
45
46     @Test
47     public void testHQLNamedParameter(){
48
49         //1.创建Query 对象
50         //基于命名的参数
51         String hql = "FROM Employee e WHERE e.salary > :sal AND e.email LIKE :email";
52         Query query = session.createQuery(hql);
53
54         //2.绑定对象
55         query.setFloat("sal", 7000)
56              .setString("email", "%A%");
57
58         //3.执行查询
59         List<Employee> emps = query.list();
60         System.out.println(emps.size());
61
62     }
63     @Test
64     public void testHQL(){
65
66         //1.创建Query 对象
67         //基于位置的参数
68         String hql = "FROM Employee e WHERE e.salary > ? AND e.email LIKE ?";
69         Query query = session.createQuery(hql);
70
71         //2.绑定对象
72         //Query 对象调用setXxx 方法支持方法连的编程风格
73         query.setFloat(0, 6000)
74              .setString(1, "%A%");
75
76         //3.执行查询
77         List<Employee> emps = query.list();
78         System.out.println(emps.size());
79
80     }
81
82 }
时间: 2024-12-17 00:29:50

[原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,的相关文章

[原创]java WEB学习笔记95:Hibernate 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

【web开发学习笔记】Struts-Tags学习笔记1 - 通用标签和控制标签

通用标签和控制标签 第一部分:代码 //前端 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> <title>Insert title here</title> </head> <body> 访问属性 <a href="<%=contextP

【web开发学习笔记】ibatis学习总结

ibatis学习总结 ibatis数据库配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <

【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-4]返回Json数据-方式2:http://www.cnblogs.com/ssslinppp/p/4530002.html [Spring学习笔记-MVC-3.1]SpringMVC返回Json数据-

[学习笔记] Sencha Cmd 学习笔记 Sencha Cmd是什么

本文地址: http://blog.csdn.net/sushengmiyan/article/details/38295575 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源  Sencha Cmd官方网站: http://w

iOS学习笔记---c语言学习第七天

结构体 结构体是一种自定义的数据类型 struct 结构体名 { 类型说明符  成员名: … 类型说明符  成员名: }: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { struct teacher{ char name[30]; char sex; int age; char course[30]; }; typedef struct teacher Teacher; Teacher c

Accelerated C++学习笔记1—&lt;开始学习C++&gt;

第0章 开始学习C++ 1.每次学习一个新的语言,大家都是从Hello, world!开始 // lesson0_1.cpp : 定义控制台应用程序的入口点. //功能:编译并运行Hello,world //时间:2014.5.7 #include "stdafx.h" #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { std::cout<< &

[Linux] 学习笔记之安装学习环境(sshd, lrzsz)

紧接前一篇,在VMWare安装完Linux,这个时候我们要使用远程工具连接到虚拟机上去了,以前一直使用Putty,后来到新公司之后,推荐使用SecureCRT,使用之后,觉得效果不错,但是每次连接都失败,linux新手伤不起,在网上搜啊搜,终于找到解决办法.   搜索了很多资料之后,发现是由于我未在Linux上安装ssh服务导致无法使用SecureCRT连接. 1. 可以使用ssh localhost对此进行测试,具体使用如下: 2. 使用apt-get或者yum安装ssh服务,具体哪种操作系统