zoukankan      html  css  js  c++  java
  • Hibernate检索学习

    Hibernate的检索策略:类级别的检索策略;1对多,多对多的检索策略;多对一,一对一的检索策略

        1.类级别的检索策略,可以通过class元素的lazy属性来设置,该设置只对load方法有效果

        2.1对多,多对多的检索策略(默认开启懒加载):通过set元素的三个属性来控制,查询1方带出n方:lazy定义多方集合初始化的时机;fetch定义查询多方时sql的形式(select/subselect),如果取值为join则定义多方集合初始化的时机,这个会覆盖lazy属性的值,即忽略lazy的设置;batch-size:检索发送sql语句的次数,提高效率

        Lazy属性:通过设置lazy=false,将延长加载变为立即加载。一般不建议这么做,lazy除了可以设置true,false,还可以设置为extra(增强延迟加载),该值可以尽可能的 延迟集合初始化的时机

           当lazy设置为true(默认值,延迟加载),hibernate在以下情况初始化集合代理实例

              1)程序第一次访问集合属性的iterator(),size(),isEmpty(),contains()等方法

              2)通过Hibernate.initialize()静态方法显示初始化 

      ·     当lazy设置为extra(增强延迟加载)时,Hibernate第一次访问集合的iterator()方法时会吃初始化集合代理实例,在调用集合的size(),isEmpty(),contains()方法 的时候并不会初始化集合代理实例,而是通过sql查询必要的信息

         batch-size属性:通过设置batch-size通过改变发送的sql语句(加入in子句)从而来减少发送sql语句的次数:比如1方有4个,那么对于查询n方就要发送4条语句,如果设置了batch-size的值为2,那么查询的时候只会发送2条sql语句

         fetch属性:该属性可以有select(默认),subselect,join三个值,当值 为select按照正常的方式来初始化set元素,如果设置为subselect,将通过子查询一次性初始化所有的set集合(而不是按照batch-size设置的那样),所以这个时候batch-size属性失效。具体的子查询的样子是将1方所有的oid查询出来的sql,作为查询n方in之后的语句即子查询从而一次性查询出所有的n方数据;如果设置为join,则决定set集合初始化的时机,即在加载1方对象的时候使用迫切左外连接(使用左外连接查询的时候同时把set集合初始化了)的方式检索n方的集合属性(这个时候就不是懒加载了),所以这个时候lazy属性失效。注意HQL查询的时候会忽略fetch=join 的取值

         3.多对一,一对一的检索策略:通过设置many-to-one元素的相关属性来控制。查询n方法带出1方

            Lazy属性:这里的lazy属性的取值和上面的不一样,为proxy(默认的表示使用延迟加载),和false(表示不适用延迟加载)。

            fetch属性:设置为join时,同样会在查询n方式用迫切左外连接查询出1方集合的属性值(不再是延迟加载)这个时候同样会忽略lazy的设置

            batch-size属性:这个时候该属性需要设置在1方的class属性上,才会起作用。比如利用hql查询出所有的n方数据,遍历n方集合查询出1方数据,如果查询1方数据需要3条语句,这个时候设置 batch-size=2,则只要发送2条sql语句即可。原理也是通过在添加in子句

    HQL查询:

      1.使用HQL查询的步骤为:

        1)创建Query对象

        2)设置参数,参数可以使基本类型,也可以是实体类型(调用setEntity()方法来设置),设置参数的方法有第一种按照位子来设置,第二种按照参数名(在hql中参数名前面加上“:”)来设置,Query对象支持连续的设置值,也就是说每次set完之后返回的还是Query对象

        3)执行查询

      2.HQL提供的分页查询是跨平台:setFirstResult(index) 设置起始位子,默认从0开始;setMaxResults(size)设置每一页显示的数据数量;

      3.可以将hql语句通过配置元素Query放到配置文件中,为了防止大小写有歧义,需要<![CDATA[]]>用将hql包起来,然后调用方法session.getNamedQuery(string queryName)来获得,更加灵活的对hql语句做调整

      4.hql 投影查询,其实就是查询某些字段而不是所有字段(需要加上select),这个时候正常返回的是这些字段组成的数组组成的list集合。为了操作方便可以在hql中new的方式将数组封装成对象,对应的需要在实体类中添加构造器

      5.hql的报表查询其实就是在hql中可以使用分组聚合函数的语法

      6.hql的连接表查询

          1)左连接:left join:查询所有记录的时候,默认返回的是俩个表对应的对象组成的数组组成的list集合。如果加上select显示的查询对象(既可以是主表,也可以是另一个另一个连接表),返回的是主表对象组成的list,但是在访问该对象管理的对象的时候,每一次访问都会放sql语句,效率低下。所以查询的时候基本上都用迫切连接查询

          2)迫切左外连接 left join fetch:即在查询的时候就初始化了关联对象的集合,不用每次查询都发送sql语句。返回的是主表对象的集合

          3)hql中没有显示的指定检索策略,会使用配置文件中使用的检索策略。hql中要使用迫切连接只能加上fetch关键字,而不能通过在配置文件中配置fetch=join来实现,即使配置了,也会被忽略

       7.hibernate的QBC查询步骤:

          1)创建Criteria对象

          2)添加拼接条件

          3)执行查询

        QBC查询提供了更加面向对象的方式来拼接查询的条件,比如and,or,min,order by等等

      8.hibernate 的二级缓存

        1)默认关闭二级缓存,开启二级缓存的步骤为:先配置好第三方的二级缓存实现比如 EHCache,现在cfg.xml中配置开启二级缓存,在针对需要放入二级缓存的类做针对性的配置,这种配置可以防止cfg中,也可以放在对应类的hbm.xml映射文件中

        2)二级缓存是session共用的

        3)二级缓存提供了四种并发访问策略,每一中对应数据库的四种隔离级别

        4)类级别的二级缓存和集合级别的二级缓存都要针对性的配置才能起作用。如果要开启集合的二级缓存,一定要同时开启集合中对象的二级缓存,这样才能提高效率(因为只是缓存id,如果不对集合中的对象开启二级缓存,就会按照id一个一个的去数据库查,效率反而低了)

        5)二级缓存默认对Query对象Criteria对象的查询不起作用(即使是同一个session创建的同一个Query对象/Criteria对象的俩次查询操作,也是要发送俩次sql语句的),如果要让这俩种查询也具有二级缓存的特性,需要另外的开启查询缓存(不仅要在配置文件中开启,还要在代码中开启),查询缓存依赖二级缓存

        4)对缓存的配置体现在对应的配置文件中比如ecache.xml,配置文件中每个<cache>为一个 缓存区域,,通过对区域的命名(类的全限定名或者类的全限定名.结合属性)可以将不同对象放入不同的缓存区当中。如果没有配置,那么 所有的数据都放入默认的缓存区。除此之外还包括是否永久有效(设置为永久会忽略其他时间设置),空闲时间,存活时间(大于空闲时间)

      管理sessioin相关

        将session和本地线程绑定,hibernate以及提供了,需要配置以及通过SessionFactory的方法获得。而不用自己绑定的到ThreadLocal中;如果sessioin是由线程管理,那么在事务回滚或者提交的时候session就已经关闭了(这就意味着不用写很多繁杂的关闭session操作)。配置<property name="current_session_context_class" >thread</property>。 sessionFactory.getCurrentSession()

    ·  批量操作相关

        1)session(需要定量的提交事务,因为怕持久化对象把内存搞爆)

        2)hql    

        3)StatelessSession

        3)jdbc api (推荐使用)

  • 相关阅读:
    laravel 生成key
    nginx thinkphp5 多入口配置
    php微信退款通知 解密
    微信退款 报错 SSL certificate not found: cert/apiclient_cert.pem
    laradock 进入 工作区
    laradock mysql 报错 No such file or directory,Connection refused
    mac 安装数据库管理软件 sequel-pro
    docker windows7 安装
    [USACO10FEB] 吃巧克力Chocolate Eating (二分答案)
    P1613 跑路 (最短路,倍增)
  • 原文地址:https://www.cnblogs.com/wanjn/p/7536351.html
Copyright © 2011-2022 走看看