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