//////////2016-12-18 ~ 2016-12-19///////////
int study_data(){
Hibernate条件查询
Criteria/DetachedCriteria
继承自CriteriaSpecification
Criteria
对象须由session创建,通常称为在线查询
支持FetchMode,排序,FlushMode和LockMode
DetachedCriteria
对象不需要session参与创建,通常称为离线查询
支持FetchMode,排序
Criterion/Projection
Croterion是Criteria的查询条件
Criterion的主要实现包括
Example - 通过一个给定实例,构建一个条件查询
Junction - conjunction/disjunction实例通过Restrictions
Conjunction = and
Disjunction = or
SimpleExpression
Projections主要是让Criteria能够进行报表查询,并可以实现分组
Projections查询返回的是查询结构的数组对象,并不是完整的映射实体对象
Projection的主要实现包括
Simoleprojection
ProjectionList
Property
应用实例:
Example:
Criteria.add(Example.create())
Conjunction:
Restrictions.conjunction().add()
Restrictions,disjunction().add()
SimpleExpression:
criteria.add(new SimpleExpression(*parentId*,parentId,*=*))
Projections:
Projections.projectionList() - 产生projectionList实例
Projections.Property("propertyName") - 产生属性投影
Projections.max(),min(),sum()... - 产生聚合函数
Projections.groupProperty("propertyName") - 对属性进行group by
Restrictions
Restrictions.eq - 等于
Restrictions.allEq - 参数为map,对比多个key/value
Restrictions.gt - 大于
Restrictions.ge - 大于等于
Restrictions.lt - 小于
Restrictions.le - 小于等于
Restrictions.between - 对应SQL的between子句
Restrictions.like - 对应SQl的like子句
Restrictions.in - 对应SQl的in子句
Restrictions.and - and关系
Restrictions.or - or关系
Restrictions.isNull - 判断属性是否为空,为空则返回true
Restrictions.isNotNull - 与isNull相反
Restrictions.sqlRestriction - SQl限定的查询
缓存机制
为了降低应用程序对物理数据源访问的频次,从而体改应用程序的运行性能
一级缓存,又称为"Session的缓存"
默认开启,无法关闭
二级缓存,又称为"SessionFactory的缓存"
可选缓存策略,默认不开启,非线程安全
缓存访问策略
执行对象查询时,受限查找一级缓存中是否存在对象,存在则返回
不存在则查询二级缓存中是否存在对象,存在则返回
不存在则生产SQL提交数据库查询
由数据库返回内容包装成尸体对象,返回实体对象同时更新缓存
一级缓存
一级缓存管理
管理一级缓存的常用方法
veit(Object object) - 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为托管状态,从而成为游离对象
clear() - 将一级缓存中的所有持久化对象清除,释放其占用的内存资源
contains(Obejct obj) - 判断指定的对象是否存在与一级缓存中
flush() - 刷新一级缓存区的内容,使之与数据库数据保持同步
二级缓存
适合采用二级缓存管理的数据
很少被修改的数据
不是很重要,允许偶尔出现并发的数据
不会被并发访问的数据
常量数据
不适合采用二级缓存管理的数据
经常被修改的数据
绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
与其他应用共享的数据
二级缓存配置(EhCache)
hibernate.conf.xml:
<!-- 设置开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 设置二级缓存插件EhCache的Provider类 -->
<property name="hibetnate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
<!-- 启动"查询缓存" -->
<property name="hibetnate.cache.use_query_cache">true</property>
ehcache.xml:
<ehcache>
<!-- 缓存的硬盘的路径 -->
<diskStore path="C:\Users\tencent\workspace\HibernateDemo\cache" />
<!-- 默认设置
maxElementsInMemory : 在内存中最大缓存的对象数据
eternal : 缓存的对象是否永远不变
timeToIdleSeconds : 可以操作对象的时间
timeToLiveSeconds : 缓存中对象的生命周期,时间到后查询数据会从数据库重新读取
overflowToDisk : 内存满了,是否要缓存在硬盘 -->
<defaultCache maxElementsInMemory="200" eternal="false"
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true" />
<!-- 指定缓存的对象下面出现的属性覆盖上面出现的,没出现的继承上面的 -->
<cache name="pojo.PlayerStatus" maxElementsInMemory="200" eternal="false" timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true" />
</ehcache>
annotation:
@Cache(usage = CacheConcurrencyStrategy)
<class>
...
<cache usage="read-writer" />
...
</class>
可选的二级缓存(并发)策略
NONE - 不配置缓存并发策略
READ-ONLY - 只读
READ-WRITER - 读写
NONSTRICT_READ_WRITER - 非严格读写
TRANSACTIONAL - 事务性
Lifecycle(回调)
Hibernate通过实现Lifecycle接口执行回调,实体对象通过实现Lifecycle接口,就可在特定的持久化阶段执行特定的处理过程
Lifecycle接口方法,抛出CallbackException:
onSave(Session session):在实体对象save/insert操作之前调用
onUpdate(Session session):在实体对象update操作之前调用
onDelete(Session session):在实体对象delete操作之前调用
onLoad(Session session):在实体对象被加载操作之后调用
对POJO有侵入性
Interceptor(拦截器)
拦截器相关的接口和类
org.hibernate.Interceptor - Interface
org.hibernate.EmptyIntercept - Class
设置拦截后,相应的操作都会先穿过一层层相应的拦截器,让拦截器执行预处理或善后处理
}
网友评论