《后端》黑马-Hibernate框架学习笔记-第4章-2021年1月11日

本文详细介绍了Hibernate的查询方式,包括OID查询、对象导航检索、HQL检索、QBC检索和SQL检索,以及Hibernate的抓取策略,如延迟加载和批量抓取,旨在帮助开发者优化数据查询效率。
摘要由CSDN通过智能技术生成

目录

4.1 Hibernate的查询的方式

4.1.1 Hibernate的查询方式:OID查询

1、使用get方法

4.1.2 Hibernate的查询方式:对象导航检索

4.1.3  Hibernate的查询方式:HQL检索

1、初始化一些数据

2、HQL的简单查询

3、HQL的别名查询

4、HQL的排序查询

5、HQL的条件查询

6、HQL的投影查询

7、HQL的分页查询

8、HQL的分组统计查询

9、HQL的多表查询

4.1.4 Hibernate的查询方式:QBC检索

1、简单查询

2、排序查询

3、分页查询

4、条件查询

5、统计查询

6、离线条件查询(SSH)---DetachedCriteria

4.1.5 Hibernate的查询方式:SQL检索

1、SQL查询

4.2 Hibernate的抓取策略(优化)

4.2.1 延迟加载的概述

1、什么是延迟加载

2、延迟加载的分类

4.2.2 抓取策略

1、抓取策略的概述

2、上的fetch和lazy

3、上的fetch和lazy

4.2.3 批量抓取

1、什么是批量抓取

2、测试批量抓取

总结


4.1 Hibernate的查询的方式

Hibernate共提供了五种查询方式:OID查询、对象导航检索、HQL检索、QBC检索、SQL检索。

4.1.1 Hibernate的查询方式:OID查询

OID检索:Hibernate根据对象的OID(主键)进行检索

1、使用get方法

Customer customer = session.get(Customer.class,1l);

2、使用load方法

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

4.1.2 Hibernate的查询方式:对象导航检索

对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

LinkMan linkMan = session.get(LinkMan.class,1l);//先查一个对象
Customer customer  = linkMan.getCustomer();// 通过这个联系人对象获得他关联的客户对象
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();

4.1.3  Hibernate的查询方式:HQL检索

HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。

通过session.createQuery(),用于接收一个HQL进行查询方式。

(以一对多为例)

 1、初始化一些数据    2、HQL的简单查询    3、HQL的别名查询     4、HQL的排序查询      5、HQL的条件查询

6、HQL的投影查询     7、HQL的分页查询    8、HQL的分组统计查询      9、HQL的多表查询

1、初始化一些数据

2、HQL的简单查询

customer.java里toString一下,生成如下,但是不要点这个集合,否则会死循环。

另外还需注意:

Query处,括号里是一个对象,如上是Customer,其实本应该是com.theima.hibernate.domain.Customer,但因为配置了映射文件,所以可以省略包名。

3、HQL的别名查询

Customer c

 

4、HQL的排序查询

order by后面跟的是类名后面的属性名。

 

5、HQL的条件查询

两种方法:按位置绑定、按名称绑定

6、HQL的投影查询--查询对象的 某个或某些 属性。

注意:这里查询多个属性,并封装到对象中。

需要使用构造方式的查询(对持久化类提供构造函数的方法=》要提供一个无参构造和有参构造)

如上,它会只查询cust_name和cust_source两个属性,并把它们封装到Customer中。

7、HQL的分页查询

 

注释:联系人也要toString

8、HQL的分组统计查询

uniqueResult()

根据来源统计个数。

 

9、HQL的多表查询

(1)SQL的多表查询

  • 连接查询

       1.交叉连接:笛卡尔积-------   select * from A,B;

       2.内连接:  inner join (inner 可以省略)--查两个表的交集

                    隐式内连接:------ select * from A,B where A.id = B.aid;

                    显示内连接:-------select * from A inner join B on A.id = B.aid;

        3.外连接:--左/右的全部加两个表的交集

                  左外连接: left outer join(outer 可以省略):-----  select * from A left outer join B on A.id= B.aid;

                  右外连接: right outer join(outer 可以省略):--- select * from A right outer join B on A.id = B.aid;

 

  • 子查询

 

(2)HQL的多表查询

  • 连接查询

     1.交叉连接

     2.内连接

            显示内连接

            隐式内连接

            迫切内连接

    3.外连接

            左外连接

            右外连接

            迫切左外连接

 

 

fetch 作用:通知hibernate,将另一个对象的数据封装到该对象中。(Customer.java里toString 的地方吧另一对象勾选上)

而上面的普通内连接,是封装成两个object数组,联系人、客户。

另外,迫切内连接可以不自己写,如果自己写的话最好加上distinct。

 

4.1.4 Hibernate的查询方式:QBC检索

QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

 

1、简单查询

 

2、排序查询

 

3、分页查询

 

4、条件查询

如,查询客户来源是小广告。

eq()、gt()、ge()、lt()、le()、ne()、like、and、in、or

 

 

如上添加了两个条件是添加了并列条件。

 

5、统计查询

目前我们criteria学了几个方法:add、addOrder、setProjection

6、离线条件查询(SSH)---DetachedCriteria

适用于带条件带分页的查询。

离线的意思是,可以脱离session使用。

下图中,上面是jdbc的方法,下面是离线的方式。

 

 

4.1.5 Hibernate的查询方式:SQL检索

1、SQL查询

SQL查询:通过使用sql语句进行查询。

 

 

4.2 Hibernate的抓取策略(优化)

视频4-14

抓取策略:对查询关联对象得优化手段。

4.2.1 延迟加载的概述

1、什么是延迟加载

延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

2、延迟加载的分类

  • 类级别的延迟加载
    1. 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
    2. 类级别延迟加载通过<class>上的lazy进行配置,如果让lazy失效
      1. 将lazy设置为false
      2. 将持久化类使用final修饰
      3. Hibernate. Initialize()
  • 关联级别的延迟加载

       指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。

               Customer customer = session.get(Customer.class,1l);

               customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。

        抓取策略往往会和关联级别的延迟加载一起使用,优化语句。

4.2.2 抓取策略

1、抓取策略的概述

通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。

  1. 通过<set>或者<many-to-one>上通过fetch属性进行设置
  2. fetch和这些标签上的lazy如何设置优化发送的SQL语句

2、<set>上的fetch和lazy

  1. fetch:抓取策略,控制SQL语句格式
    1. select               :默认值,发送普通的select语句,查询关联对象
    2. join                   :发送一条迫切左外连接查询关联对象
    3. subselect         :发送一条子查询查询其关联对象
  2. lazy:延迟加载,控制查询关联对象的时候是否采用延迟
    1. true                  :默认值,查询关联对象的时候,采用延迟加载
    2. false                 :查询关联对象的时候,不采用延迟加载
    3. extr a                 :及其懒惰。
  3. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

3、<many-to-one>上的fetch和lazy

  1. fetch :抓取策略,控制SQL语句格式。
    1. select       :默认值,发送普通的select语句,查询关联对象。
    2. join          :发送一条迫切左外连接。
  2. lazy   :延迟加载,控制查询关联对象的时候是否采用延迟。
    1. proxy       :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。
    2. false         :查询关联对象,不采用延迟。
    3. no-proxy  :(不会使用)
  3. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

4.2.3 批量抓取

1、什么是批量抓取

一批关联对象一起抓取,batch-size

2、测试批量抓取

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值