Hibernate之查询优化

目录

延迟加载

类级别查询

get方法(没有任何策略)

load方法(懒加载策略)

关联级别查询

延迟加载lazy(控制查询其关联对象时是否采用延迟加载策略)

抓取策略fetch(控制查询其关联对象时采用SQL语句)

批量抓取


延迟加载

延迟加载(lazy  load又称懒加载)是Hibernate关联关系对象的默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来。所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。

通常,将延迟加载分为两类:一类叫做类级别延迟,一类叫做关联级别延迟。

  • 类级别查询

类级别延迟指的是,在查询某个对象的时候,是否采用延迟加载策略,这个通常在<class>标签上配置lazy属性

get方法(没有任何策略)

调用即立即查询数据库加载数据

load方法(懒加载策略)

load方法如果不采用懒加载策略和get方法一样功能,当使用懒加载的时候,一般在<class>上配置lazy属性,lazy的默认值是true,默认是加载的,所以load方法去查询时候,会返回代理对象,但不会马上发送SQL语句,而是当真正使用该对象的时候,才会发送SQL语句

Customer customer = session.load(Customer.class,2l);

如果不想使用延迟加载,可以采用如下方法

1)在类的映射文件上将lazy属性设置为false

<set name="linkmans" lazy="false">

2)将这个持久化类改为final修饰(final修饰的类,无法生成代理类,就会使延迟加载失效) 

注意:使用懒加载时要确保,调用属性加载数据时,session还是打开的,不然会抛出异常

  • 关联级别查询

延迟加载lazy(控制查询其关联对象时是否采用延迟加载策略)

关联级别延迟指的是,在查询一个对象的关联对象时,是否采用延迟加载策略,这个通常在<set>或<many to one>上配置lazy属性

Customer customer = session.get(Customer.class,2L);

Set<Linkman> linkmans = customer.getLinkmans();

通过客户查询其关联的联系人对象,在查询联系人的时候是否采用延迟加载称为是关联级别的延迟,关联级别的延迟通常是在<set>和<many-to-one>上来进行配置 

<set>标签上lazy取值

    1) true   :默认值,采用延迟加载

    2) false :检索关联对象的时候,不采用延迟加载

    3) extra  :及其懒惰,与懒加载基本一致,如果获得集合的size,只查询集合的size(count语句)

<many-to-one>标签上lazy取值

    1) proxy   :默认值,是否采用延迟取决于另一方类上的lazy属性

    2) false    :检索关联对象的时候,不采用延迟加载

    3) no-proxy 

抓取策略fetch(控制查询其关联对象时采用SQL语句)

抓取策略指的是查询到某个对象的时候,如何抓取其关联对象。这个通常在<set>或<many to one>上配置fetch属性

<set>标签上fetch取值

    1) select       :  默认值,发送一条普通的select语句查询(单表查询)

    2) join           : 发送一条迫切左外连接查询(多表查询)

    3) subselect :  发送一条子查询语句查询其关联对象

<many-to-one>标签上fetch取值

    1) select    : 默认值,发送一条普通的select语句查询(单表查询)

    2) join        : 发送一条迫切左外连接查询(多表查询)

这样来看在set上配置fetch有3个值,lazy有3个值,这样就会产生很多种效果

注意:当fetch如果设置为join,lazy就会失效 

结论:为了提高效率,fetch的选择上应选择select.,lazy的取值应选择 true,全部使用默认值

  • 批量抓取

在同时查询多个对象的关联对象的时候,可以采用批量抓取进行优化,可以通过在<set>标签中配置batch-size属性

<set name="linkmans"  batch-size="3"> 

 这样的话,在执行过程中一条SQL查询语句会直接将3个与客户关联的联系人一起查询出来

如果我们要实现查询多个联系人的时候,批量抓取联系人对应的客户对象时,我们可以在客户一端的<class>上配置batch-size

<class name="Customer" table="cst_customer"  batch-size="3"> 

猜你喜欢

转载自blog.csdn.net/mmake1994/article/details/81563175