Jaxson

Jaxson 关注TA

Jaxson

Jaxson

关注TA

  •  未知地区
  • 未知工作
  • 写了16,887字

该文章投稿至Nemo社区   Java  板块 复制链接


Hibernate笔记

发布于 2016/03/11 15:48 1,401浏览 0回复 3,999

命名查询:将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>

2. SQL查询
        a.使用Query接口的子接口SQLQuery
        b.使用addEntity()关联实体
        c.使用addScalar()指定查询属性以及类型

3. 命名SQL查询
        a.修改配置文件
        b.调用存储过程或者函数
                a).对于函数,函数必须是返回一个结果集
                b).对于存储过程,该存储过程的第一个参数必须是输出参数,且数据类型必须是结果集

4. 定制SQL:改变Hibernate中默认的实体持久化方法CUD操作

5. 缓存
        a. 一级缓存
        b.二级缓存:配置
            a).添加jar包
            b).在Hibernate.cfg.xml进行配置
            c).添加EHCache.xml配置文件
            d).设置哪些实体,实体的哪些集合属性启用二级缓存
                    第一种:在对应持久化类中使用@Cache
                    第二种:在hibernate配置文件中使用<class-cache/>
        c.查询缓存
                a).一二级缓存都是针对实体进行的,不能对属性进行缓存
                b).一般情况下,使用查询缓存都不能提高程序执行效率,所以,不推荐使用
                c).使用方式:在配置文件中,启用查询缓存

补充:
Hibernate调用缓存过程:

    1.使用命名SQL调用存储过程
    2.使用CallableStement调用存储过程
    3.使用定制SQL调用存储过程

使用命名SQL调用存储过程步骤:
    1.定义存储过程
    2.修改实体类映射配置文件添加<sql-query/>元素
    3.通过session对象的getNameQuery()方法获取Query对象

使用CallableStatement调用存储过程步骤:
    1.通过session获取connection
    2.通过connection的prepareCall()方法封装调用存储过程
    3.使用CallableStatement对象的setXxx()或registerOutParamter()方法为存储过程传人参数或注册输出参数
    4.使用CallableStatement对象的execateUpdate()或者excute()方法来执行存储过程

存储内容分类:
    一级分类:session缓存称为Hibernate第一级缓存
    二级缓存:sessionFactory缓存分类内置缓存和外置缓存

session的缓存有俩大作用:
    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在缓存中寻找符合条件的数据,若缓存中无符合的数据,再到数据库中查询
本文标签
 {{tag}}
点了个评