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.从数据库查询的信息全部进入二级缓存
二级缓存中的数据需要具备什么条件
适合加入二级缓存的数据
很少被修改的数据
不是很重要的数据,允许出现偶尔并发的数据
不会被并发访问的数据
参考数据
不适合加入二级缓存的数据
经常被修改的数据
财务数据,绝对不允许出现并发
与其他应用共享的数据
作者:架构师小跟班
开发者导航: http://www.codernav.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出,以免更多的人被误导。