Hibernate框架(4)

1.Hibernate的查询方式

         (1)OID查询

                          1)get方法

                           2)load方法

         (2)对象导航检索

         (3)HQL检索

                          1)简单查询

                          2)别名查询

                          3)排序查询

                          4)条件查询

                          5)投影查询

                          6)分页查询

                          7)分组统计查询

                          8)多表查询

         (4)QBC查询

                          1)简单查询

                          2)排序查询

                          3)分页查询

                          4)条件查询

                          5)统计查询

                          6)离线查询

         (5)SQL检索

                          1)sql查询

2.Hibernate的抓取策略(优化)

         (1)延迟加载

                          1)延迟加载分类

         (2)抓取策略

                          1)概述

                          2)<set>上的fetch和lazy

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

             (3)批量抓取

1.Hibernate的查询方式

(1)OID查询

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

1)get

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

2)load

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

(2)对象导航检索

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

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

Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();

(3)HQL检索

HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。

1)HQL的简单查询

2)别名查询

3)排序查询

                         

4)条件查询

                         

5)投影查询

                         

6)分页查询

                         

7)分组统计查询

                       

  8)多表查询

SQL的多表查询

           1.连接查询

                   (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.连接查询

                   (1)交叉连接

                   (2)内连接

                                 显示内连接

                                 隐式内连接

                                 迫切内连接

                                 (迫切内连接就是加一个fetch,作用就是将其中一个对象封装到另一个对象中,

                                 因为其中一个对象的属性就是另一个对象)

                   (3)外连接

                                 左外连接

                                 右外连接

                                 迫切左外连接

distinct表示不重复的意思

 

(4)QBC检索

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

1)简单查询

             

           

2)排序查询

           

   

3)分页查询  

       

   

4)条件查询

           

             

5)统计查询

                         

6)离线查询

(5)SQL检索

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

2.Hibernate的抓取策略(优化)

什么是延迟加载

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

延迟加载的分类

     1.类级别的延迟加载

       (1)指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);

       (2)类级别延迟加载通过<class>上的lazy进行配置,如果让lazy失效

                 1)将lazy设置为false

                 2)将持久化类使用final修饰

                 3)Hibernate. Initialize()程序运行到这一步便会直接发送sql语句

      2.关联级别的延迟加载

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

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

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

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

 

 

抓取策略的概述

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

                 通过<set>或者<many-to-one>上通过fetch属性进行设置

                 fetch和这些标签上的lazy如何设置优化发送的SQL语句

2.<set>上的fetch和lazy

           (1)fetch:抓取策略,控制SQL语句格式

                       1)select        :默认值,发送普通的select语句,查询关联对象

                       2)join             :发送一条迫切左外连接查询关联对象

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

           (2)lazy:延迟加载,控制查询关联对象的时候是否采用延迟

                       1)true          :默认值,查询关联对象的时候,采用延迟加载

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

                       3)extra         :及其懒惰。

         在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

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

           (1)fetch :抓取策略,控制SQL语句格式。

                       1)select        :默认值,发送普通的select语句,查询关联对象。

                       2)join            :发送一条迫切左外连接。

           (1)lazy    :延迟加载,控制查询关联对象的时候是否采用延迟。

                       1)proxy        :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。

                       2)false          :查询关联对象,不采用延迟。

                       3)no-proxy  :(不会使用)

            在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

4.什么是批量抓取

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

一般如果没有加批量抓取,就会多次发多条sql语句去得到关联的对象,如果加上了batch-size就能一次性抓取,不需要多次发sql。

猜你喜欢

转载自blog.csdn.net/WinnerBear/article/details/88314493