延迟策略的实现--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
