zoukankan      html  css  js  c++  java
  • [原创]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 }
  • 相关阅读:
    谷歌浏览器试调网页 多出font标签
    go学习笔记
    python3.7 contextvars在asyncio使用的
    python zip文件压缩和解压
    python打印朱莉娅集合
    python 中的exec
    python骚操作之...
    events.py 知识点记录
    asyncio之asyncio.run
    网页块元素定位建议使用的xpath方式
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5934717.html
Copyright © 2011-2022 走看看