hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
QBC查询
1.简单查询
Criteria c = s.createCriteria(TeacherModel.class);
2.获取查询结果
多条:list
单挑:uniqueResult
3.分页查询
setFirstResult(int)
setMaxResults(int)
4.查询排序
添加排序
c.addOrder(Order);
排序规则
Order od = Order.asc("字段名")
Order od = Order.desc("字段名")
5.条件查询
1.添加查询条件
c.add(条件)
2.条件格式
Restrictions.操作名称(参数....);
3.组合条件
Restrictions.and(条件1,条件2);
Restrictions.or(条件1,条件2);
Restrictions.not(条件)
6.投影
单独字段
c.setProjection(Property.forName("age"));
多字段
c.setProjection(
Projections.projectionList()
.add(Property.forName("studentName"))
.add(Property.forName("age"))
);
QBC多表查询
1.如果要建立多表查询,首先要告诉QBC是多表
c.createAlias("关联对象","别名");
所有属性,如果是关联对象的属性,统一使用别名调用
//认为: teacher.nick
//实际:别名.nick
2.离线查询
表现层过来的数据,是散的
在表现成中,创建一个DetachedCriteria,然后将所有条件在这里赋值完毕,将它传递到逻辑层
传递到逻辑层
将DetachedCriteria传递到数据层
逻辑层传递数据层
将DetachedCriteria转化为Criteria,使用
-------------------------------
数据加载策略/数据抓取策略
查询方式
load OID
get OID
Query(Query Criteria) SQL
数据分类
主数据
查询TeacherModel->StudentModel
主数据 主关联数据
假设关系:一对多
由一获得多
一:是主数据
多:是主关联数据
由多获得一
多:是从数据
一:是从关联数据
TeacherModel 1 n StudentModel
查询TeacherModel,主
查询TeacherModel,找StudentModel 主关联
查询StudentModel,从
查询StudentModel,找StudentModel 从关联
数据获取方式
load OID
get OID
Query OID
Query 非OID
直接数据加载策略
关联数据加载策略
主关联数据加载策略
老师对学生一对多,这里研究的是老师对象中的学生集合的数据加载策略
1.fetch = "select" lazy = "false"
SQL语句:
主数据:1条SQL
主关链数据:多条SQL
查询主关联数据数据总量
不执行SQL语句
查询主关联数据具体数据
不执行SQL语句
2.fetch = "select" lazy = "true"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)
3.fetch = "select" lazy = "extra"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)
注意:
先执行A操作,再执行B操作,AB操作均产生SQL语句
先执行B操作,再执行A操作,BA操作只产生B操作SQL语句
4.fetch = "subselect" lazy = "false"
SQL语句:
主数据:1条SQL
主关链数据:1条SQL(子查询)
查询主关联数据数据总量
不执行SQL语句
查询主关联数据具体数据
不执行SQL语句
5.fetch = "subselect" lazy = "true"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)
6.fetch = "subselect" lazy = "extra"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (一条子查询SQL语句B)
注意:
先执行A操作,再执行B操作,AB操作均产生SQL语句
先执行B操作,再执行A操作,BA操作只产生B操作SQL语句
使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)
7.fetch = "join" lazy = "false"
SQL语句:
主数据:1条SQL
主关链数据:多条SQL
查询主关联数据数据总量
不执行SQL语句
查询主关联数据具体数据
不执行SQL语句
8.fetch = "join" lazy = "true"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)
9.fetch = "join" lazy = "extra"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据集合数据总量查询SQL (按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)
9-2.fetch = "join" lazy = "extra" 查询使用OID进行
SQL语句:
主数据:1条SQL(左外连接SQL,主和关联数据全部查询出来)
查询主关联数据数据总量
不会产生SQL语句
查询主关联数据具体数据
不会产生SQL语句
fetch:用于控制进行关联查询时,产生的SQL语句
select:一般SQL
subselect:子查询SQL语句
join:Query join=select 一般SQL
OID 左外连接SQL
lazy:用于控制进行关联查询时,被关联数据的加载策略
false:非延迟加载,初期就将数据查询出来
true:延迟加载,需要使用执行SQL
extra:超级延迟加载,如果获取长度,执行SQL与获取数据执行SQL不同
总结:
lazy控制的是关联数据的加载策略,分为理解加载,延迟加载,和超级延迟加载
fetch控制的是SQL语句格式,select一般,subselect子查询,join一般
fetch如果是使用按OID查询,join左外连接SQL
从关联数据加载策略
获取主数据,设置主数据关联的数据加载策略
获取从数据,设置从数据关联的数据加载策略
1.fetch = "select" lazy = "false"
SQL语句:
从数据:1条SQL
从关联数据:多条SQL
查询从关联数据具体数据
不执行SQL
2.fetch = "select" lazy = "proxy" proxy指延迟策略由被关联类控制
SQL语句:
从数据:1条SQL
被关联数据lazy="false" 执行多条SQL
查询从关联数据具体数据
被关联数据lazy="true" 执行从关联数据查询SQL (按需产生SQL语句)
注意:lazy="proxy"将控制权交给被关联对象进行控制
如果被关联对象lazy="true":延迟加载从关联数据
如果被关联对象lazy="false":立即加载从关联数据
3.fetch = "join" lazy = "false"
SQL语句:
从数据:1条SQL
从关联数据:多条SQL
查询从关联数据具体数据
不执行SQL
4.fetch = "join" lazy = "proxy"
SQL语句:
从数据:1条SQL
被关联数据lazy="false" 执行多条SQL
查询从关联数据具体数据
被关联数据lazy="true" 执行从关联数据查询SQL (按需产生SQL语句)
注意:lazy="proxy"将控制权交给被关联对象进行控制
如果被关联对象lazy="true":延迟加载从关联数据
如果被关联对象lazy="false":立即加载从关联数据
注意:当使用OID进行查询时,生成的SQL是左外连接格式,此时lazy失效
fetch:用于控制进行关联查询时,产生的SQL语句
select:一般SQL
join:Query join=select 一般SQL
OID 左外连接SQL
lazy:用于控制进行关联查询时,被关联数据的加载策略
false:非延迟加载,初期就将数据查询出来
proxy:根据从关联数据的lazy属性来决定延迟加载策略
在进行非延迟加载策略搜索时,往往会生成多条SQL语句,可以通过调整批量抓取策略,提高执行效率
batch-size = 4
---------------------------------------
二级缓存
缓存的作用:
H3支持两种缓存
一级缓存
对应Session对象
二级缓存
对相SessionFactory对象
二级缓存操作
load/get
先查找一级缓存,有,返回,没有
再查找二级缓存,有,保存到一级缓存,由一级缓存返回,没有
再查找数据库,SQL,保存到一级缓存,一级缓存将数据保存到二级缓存,一级缓存返回
SQL查询
查找数据库,SQL,保存到一级缓存,一级缓存将数据保存到二级缓存,一级缓存返回
添加数据
更新所在一级缓存的数据
更新数据库对应数据
删除、修改数据
更新所在一级缓存的数据
更新所在二级缓存的数据
更新数据库对应数据
二级缓存操作注意事项
1.SQL查询不走二级缓存
2.不要将所有数据装入二级缓存
3.二级缓存获取数据按OID获取
4.从数据库查询的信息全部进入二级缓存
二级缓存中的数据需要具备什么条件
适合加入二级缓存的数据
很少被修改的数据
不是很重要的数据,允许出现偶尔并发的数据
不会被并发访问的数据
参考数据
不适合加入二级缓存的数据
经常被修改的数据
财务数据,绝对不允许出现并发
与其他应用共享的数据
hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存的更多相关文章
- Entity Framework关联查询以及数据加载(延迟加载,预加载)
数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...
- Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的 ...
- EasyUi 分页 和 表格数据加载
这里说明的是将说有数据先返回到前端再由前端去分页,性能可能没有先在后台分好页再返回给前端高 但如果操作不涉及大数据的话也没什么大问题,具体问题具体分析 要使用分页控件首先要声明初始化一下: //设置分 ...
- hibernate框架学习之多表查询helloworld
package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...
- hibernate框架学习之使用SQLQuery查询数据
SQLQuery对象的获取 Hibernate支持使用原生SQL语句进行查询,通过session对象获得SQLQuery对象进行,需要传入SQL语句 SQLQuery createSQLQuery(S ...
- Hibernate框架学习笔记
Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...
- hibernate框架学习之数据抓取(加载)策略
Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...
- hibernate框架学习第三天:对象状态、一级缓存、快照等
对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...
- Hibernate 加载策略得总结
Hibernate 加载策略得总结 加载策略(优化查询): 策略种类: 延迟加载: 等到使用的时候才会加载数据. 立即加载: 不管使用不使用,都会立刻将数据加载. 策略的应用: 类级别的加载策略. 关 ...
随机推荐
- Hadoop记录-变更
1.安装salt-minion sed -i 's/^#//g' /etc/yum.repos.d/centos7.4.repo sed -i 's/enabled=0/enabled=1/g' /e ...
- Android开发入门经典实例
开发实例概述 今天带大家做一个简单的Android App,这个App会显示创新工程实践老师们的照片和信息,不妨先看一看效果: 虽然这个App非常简单,但是涉及到了Android开发中的一些关键知识, ...
- golang反射举例
反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性. package main import ( "f ...
- java 中对象比较大小
java 中对象比较大小 java 中对象比较大小有两种方法 1:实现Comparable 接口 的 public int compareTo(T o) 方法: 2:实现Comparator 接口 的 ...
- Spark源码剖析 - SparkContext的初始化(六)_创建和启动DAGScheduler
6.创建和启动DAGScheduler DAGScheduler主要用于在任务正式交给TaskSchedulerImpl提交之前做一些准备工作,包括:创建Job,将DAG中的RDD划分到不同的Stag ...
- 插入排序_JAVA
public class Main { public static void main(String[] args) { int[] A = { 6, 4, 3, 5, 6, 2 }; for (in ...
- 完全使用UDP登录Linux
===============Mosh 登录器========================================= == 针对TCP被某些防火墙阻断的Linux机器, 该程序可以让你不使 ...
- Tomcat配置到JEE版eclipse中
接我上篇文中的tomcat下载,及环境变量配置,http://blog.csdn.net/qq_40223688/article/details/79451468 这篇文章我就讲一下怎么把tomcat ...
- 四十二、Linux 线程——线程同步之条件变量之线程状态转换
42.1 线程状态转换 42.1.1 状态转换图 42.1.2 一个线程计算,多个线程获取的案例 #include <stdio.h> #include <stdlib.h> ...
- vs不自动退出控制台程序的办法
1.在主函数rerurn 前加上getchar();即可. 2.ctrl+F5;