hibernate之查询进行优化

技术分析之延迟加载

1. 延迟加载先获取到代理对象,当真正使用到该对象中的属性的时候,才会发送SQL语句,是Hibernate框架提升性能的方式
2. 类级别的延迟加载
    * Session对象的load方法默认就是延迟加载
    * Customer c = session.load(Customer.class, 1L);没有发送SQL语句,当使用该对象的属性时,才发送SQL语句

    * 使类级别的延迟加载失效
        * 在<class>标签上配置lazy=”false”
        * Hibernate.initialize(Object proxy);

3. 关联级别的延迟加载(查询某个客户,当查看该客户下的所有联系人是是否是延迟加载)
    * 默认是延迟加载
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Customer c = session.get(Customer.class, 1L);
        System.out.println("=============");
        System.out.println(c.getLinkmans().size());
        tr.commit();

技术分析之Hibernate框架的查询策略

1. 查询策略:使用Hibernate查询一个对象的时候,查询其关联对象.应该如何查询.是Hibernate的一种优化手段!!!    
2. Hibernate框架的检索策略解决的问题
    * 查询的时机
        Customer c1 = (Customer) session.get(Customer.class, 1);
        System.out.println(c1.getLinkmans().size());

        * lazy属性解决查询的时机的问题,需要配置是否采用延迟加载!!

    * 查询的语句形式
        List<Customer> list = session.createQuery("from Customer").list();
        for(Customer c : list){
            System.out.println(c.getLinkmans());
        }

        * fetch属性就可以解决查询语句的形式的问题!!

技术分析之在set标签上配置策略

1. 在<set>标签上使用fetch和lazy属性
    * fetch的取值              -- 控制SQL语句生成的格式
        * select                -- 默认值.发送查询语句
        * join                  -- 连接查询.发送的是一条迫切左外连接!!!配置了join.lazy就失效了
        * subselect             -- 子查询.发送一条子查询查询其关联对象.(需要使用list()方法进行测试)

    * lazy的取值               -- 查找关联对象的时候是否采用延迟!
        * true                  -- 默认.延迟
        * false                 -- 不延迟
        * extra                 -- 及其懒惰

2. set标签上的默认值是fetch="select"和lazy="true"

3. 总结:Hibernate框架都采用了默认值,开发中基本上使用的都是默认值。特殊的情况。

技术分析之在man-to-one标签上配置策略

1. 在<many-to-one>标签上使用fetch和lazy属性
    * fetch的取值      -- 控制SQL的格式.
        * select        -- 默认。发送基本select语句查询
        * join          -- 发送迫切左外连接查询

    * lazy的取值       -- 控制加载关联对象是否采用延迟.
        * false         -- 不采用延迟加载.
        * proxy         -- 默认值.代理.现在是否采用延迟.
            * 由另一端的<class>上的lazy确定.如果这端的class上的lazy=”true”.proxy的值就是true(延迟加载).
            * 如果class上lazy=”false”.proxy的值就是false(不采用延迟.)

2. 在<many-to-one>标签上的默认值是fetch="select"和proxy

转载于:https://www.cnblogs.com/jianxin-lilang/p/6442614.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值