延迟策略
- 懒加载:需要时,才查询,不需要,不查询,不发送SQL
- hibernate中实现延迟:load方法能实现延迟思想;集合标签中含有lazy属性可以实现延迟思想
-
延迟策略的实现--load()方法,不查询就不会调用
- 对象导航图也能实现延迟加载.
set集合标签中设置lazy属性:true,false,extra---极其懒
true值表示懒加载、false表示立即加载
get,load和lazy之间的关系:get方法是立即加载即当我们调用get方法获得对象的时候就会执行查询语句,不论是否使用它(比如执行输出语句),当lazy默认(true)时,即开启延迟加载,get()方法是立即执行,会执行查询的那条SQL,不会执行对象导航图中的SQL语句,当lazy设为false时,关闭延迟加载执行get方法,即使没有输出语句,他也会执行两条SQL语句. load是延迟加载,当没有输出语句等调用时候,是不会执行SQL语句的,不论lazy是开启或是关闭,因为第一个SQL都没执行,后面的SQL也不会执行.
什么是导航图查询方式:就是通过SQL语句查询出来的对象调用它里面的get方法,查询另一个对象,执行了另一个SQL语句.
查询策略
hibernate中查询方式包括五种:OID,对象导航图,HQL,QBC,SQL
OID(Object Identifier)
主键查询 get/load方法
session的get和load方法调用实现oid查询方式,即按照主键值查询;其中get是立即查询,load是延迟查询
对象导航图查询
连接查询,就是从一个对象查其他对象,在hibernate中通过属性和映射配置,实现一对一、一对多、多对多的时候,如果用到集合标签,那么集合标签中lazy属性可以实现连接查询时候的延迟操作
HQL---Hibernate Query Language
和SQL十分类似;由SQL调整为HQL:SQL中字段名在hql中是属性名,SQL中表名在hql中是类名,hql中select部分可以省略,*号不能使用
- 初识. 首先要获取查询对象,然后根据返回值类型,由query对象调用查询方法,获得查询结果,uniqueResult()---返回结果只有一个对象
- HQL中占位符的使用,注意在5.3.x版本之后占位符的使用,?号需要添加序号,对应在使用的时候,利用查询对象query调用setParameter方法实现查询参数值的注入
占位符---使用查询变量替代
查询结果有多条如何实现---list()方法
分页实现setFirstResult()是用来设置当前页第一条的下标,丛0开始第一页第一条是0,setMaxResults()是用来设置每页最多显示多少条的参考https://blog.csdn.net/switzerland/article/details/3127992
public void test5(){ /* * mysql分页的时候limit m,n n---每页条数 m---起始 * 当前页码是cp 每页条数pages = 4 start = pages * (cp - 1) * * oracle分页: * select empno,ename,job,hiredate,mgr,sal,comm,deptno * from (select rownum rn,emp.* from emp) te * where te.rn between m and n; * * 当前页码是cp 每页条数pages = 4 * cp == 1 m == 1 n == 4; * cp == 2 m == 5 n == 8 * cp == 3 m == 9 * n ==== pages * cp * m ==== (cp - 1)*pages + 1 pages * cp - 3 * * */ Session session = test2.getSession(); //select * from Users String hql = "from Users"; Query query = session.createQuery(hql); //firstResult是当前页首行 query.setFirstResult(0); //每页最多显示多少条 query.setMaxResults(2); List<Users> list = query.list(); for (Users u : list) { System.out.println(u); } }
在hql中,select省略表示查询所有字段,当我们查询部分字段时,select不能省略.没有省略select部分时,那么查询结果是数组(一维数组或者二维数组)
联合查询,和查询多个字段差不多
QBC
qbc和我们mybatis逆向工程差不多,使用的是criteria对象,用criteria.add()Restrictions.eq("uname","刘备"))来添加条件,restrictions可以叠加
SQL
注解实现
- 在hibernate核心配置文件中,映射文件导入用class替代resource
- 映射文件不需要了,我们在实体类上添加注解@Entity(要导的包是javax.persistence),导入实体类即可,同时也要加上@table(name="")注解,表示指定表名,否则表名就是类名
- 当主键是uuid时设置主键类型为String,uuid需要先生成在赋值给id,所以需要两个注解
- 当主键是其他类型时,要定义成Integer类型的,,注解设置成auto,就相当于我们配置文件中的native(自适应)
package com.offcn; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.io.Serializable; import java.sql.Clob; @Entity//注解模式实体类必须要加此注解,告知框架此类参与映射配置 @Table(name = "table_users")//此注解用来实现实体类对应的表格的名称定义 public class Users implements Serializable{ private static final long serialVersionUID = -65208953343133567L; @Id//主键注解 @Column(name = "u_id")//用来定义字段名称,不加此注解的话就是默认值,即属性名 @GeneratedValue(strategy = GenerationType.AUTO) private String uid; @Column(name = "u_name")//省略不写的话数据库中的字段名就是uname,和属性名一样 private String uname; private String upassword; private Clob udesc; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpassword() { return upassword; } public void setUpassword(String upassword) { this.upassword = upassword; } public Clob getUdesc() { return udesc; } public void setUdesc(Clob udesc) { this.udesc = udesc; } }