命名查询:将SQL保存到配置文件中,调用时候再进行获取,Hibernate则允许在映射文件中定义字符串形式的查询语句。
1.命名查询配置
a.使用@NameQuery注解
b.使用session对象的getNamedQuery(String)方法获取对应的Query对象
c.命名HQL查询本质上就是将查询语句从Java代码中取出来,放到注解中去管理,并且为其起个名字。但是,注解方式的命名HQL查询没有太大必要——因为注解还是在Java代码中。所以,命名查询一般用于XML配置Hibernate中,在XML配置的持久化类的隐射文件中,在<hibernate-mapping/>元素中使用<query name=”selectAll”> from Article </query>
a.使用Query接口的子接口SQLQuery
b.使用addEntity()关联实体
c.使用addScalar()指定查询属性以及类型
a.修改配置文件
b.调用存储过程或者函数
a).对于函数,函数必须是返回一个结果集
b).对于存储过程,该存储过程的第一个参数必须是输出参数,且数据类型必须是结果集
4. 定制SQL:改变Hibernate中默认的实体持久化方法CUD操作
a. 一级缓存
b.二级缓存:配置
a).添加jar包
b).在Hibernate.cfg.xml进行配置
c).添加EHCache.xml配置文件
d).设置哪些实体,实体的哪些集合属性启用二级缓存
第一种:在对应持久化类中使用@Cache
第二种:在hibernate配置文件中使用<class-cache/>
c.查询缓存
a).一二级缓存都是针对实体进行的,不能对属性进行缓存
b).一般情况下,使用查询缓存都不能提高程序执行效率,所以,不推荐使用
c).使用方式:在配置文件中,启用查询缓存
补充:
1.使用命名SQL调用存储过程
2.使用CallableStement调用存储过程
3.使用定制SQL调用存储过程
1.定义存储过程
2.修改实体类映射配置文件添加<sql-query/>元素
3.通过session对象的getNameQuery()方法获取Query对象
1.通过session获取connection
2.通过connection的prepareCall()方法封装调用存储过程
3.使用CallableStatement对象的setXxx()或registerOutParamter()方法为存储过程传人参数或注册输出参数
4.使用CallableStatement对象的execateUpdate()或者excute()方法来执行存储过程
一级分类:session缓存称为Hibernate第一级缓存
二级缓存:sessionFactory缓存分类内置缓存和外置缓存
1.减少访问数据库的频率
2.保证数据库中相关记录与缓存中的对象保持同步
二级缓存是进程或者集群范围内的缓存,可以被所有的session共享生命周期和sessionFactory,二级缓存是可配置的插件。
Hibernate的缓存一般分为一级缓存,二级缓存,查询缓存
缓存的范围分为事务范围,进程范围,集群范围
Hibernate一级缓存是session范围缓存
1.开启查询缓存
<property name="hibernate.cache.use_query_cache">true</property>
2.在程序中手动启用查询缓存
query.setCacheable(true);
Query接口的list()方法和iterate()方法的区别
1. list()方法返回List对象;iterate()方法返回Iterator对象
2. list()方法将不会再缓存中读取数据,它总是一次性地从数据库中直接查询所有符合条件的数据,同时将获取的数据写入缓存
3. iterate()是获取了符合条件的数据的id后,需要时根据id在缓存中寻找符合条件的数据,若缓存中无符合的数据,再到数据库中查询