快速业务通道

在Hibernate中直接操作JDBC接口 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
表子记录存放于 A 实体类的 children_a, children_c 的属性中,因此 top10 的功能可以通过比较每个 A 表实体类中 children_a、children_c 的 Set 的 size 大小并进行排序得到,其代码示例如下:

清单 3. 排序代码示例

private ArrayList<A> sortAByAmount(ArrayList<A> all) {   for(int i=0;i<all.size();i++)   {     for(int j=0;j<all.size ()-i-1;++j)     {       if(all.get(j).compareTo(all.get(j+1))<=0)       {         A temp = all.get(j);         all.set (j,all.get(j+1));         all.set(j+1,temp);       }     }   }   return all; }

表面看来很方便,但是由于 Hibernate 是 面向对象的 O-R 映射机制,每一条 A 表记录的查询实际都关联有两条 B、C 表查询的 SQL 产生,我们 可以看到 Hibernate 的 SQL 日志中:

清单 4. Hibernate sql 日志示例

Hibernate: select a0_.ID as ID2_ from A a0_ where a0_.ID=''1''  Hibernate: select b0_.ID as ID2_,b0_.A_ID as A_ID2_ from B b0_ where b0_.ID=?  Hibernate: select c0_.ID as ID2_,c0_.A_ID as A_ID2_ from C c0_ where  c0_.ID=?

由上述 Sql 日志可以看出,每一条 A 表记录的取出,都伴随以 A 表 ID 为查 询条件关联 B,C 表中 A_ID 外键字段的 2 条取子记录的 sql,这是由 A.hbm.xml 配置中 “lazy=false”决定的。

这种情况下,当 A 和 B、C 表中数据量越来越大时,A 表取 实体的操作开销将随着 sql 查询的增多而增大,并且在紧接着的排序过程中,即使采用业界最快的快速 排序算法,排序时间依然是随原始排序实体数量的线性关系(O(n lg n)),效率会线性下降,最终无法 满足客户的前台查询的效率要求。

此类情况下如直接采用 JDBC,则只需一条如下的 SQL 语句, 即可完成该功能:

清单 5. 直接 JDBC 操作 sql

select  tab1.ID, tab1.sumCol+tab2.sumCol from  ( select a.ID, count(b.ID) sumCol from A a left join B b on a.ID=b.ID GROUP BY a.ID )tab1, ( select a.ID, count(c.ID) sumCol from A a left join C c on a.ID=c.ID GROUP BY a.ID )tab2  where tab1.ID=tab2.ID order by  tab1.sumCol+tab2.sumCol desc

在Hibernate中直接操作JDBC接口(5)

时间:2011-08-11 IBM 唐清原

在以上 JDBC 方式下,即使 A、B、C 表的数据量持续增 长,仍然只有 1 条 SQL 的开销,不会出现 SQL 递增的情况,因此耗时是在可控制的区间内的。并且读 者可以注意到上述 SQL 将 3 表关联拆分成了 2 个子查询,这样避免了 3 表做笛卡尔积的数量和,进一 步提高了查询效率。由此可见,直接操作 JDBC,除 SQL 的开销可控外,还可以利用数据库层各种机制, 如上述查询语句中的 left join、子查询、索引…,灵活的调整 SQL 语句,以达到最佳的查询性 能。

由上可实例可看出,在多表关联、排序等复杂的查询情况下,Hibernate 框架由于其自身对 象封装的特殊性,不能像 JDBC 直接操作 SQL 那样很好的解决查询中高效性和灵活性方面的需求,且由 于其屏蔽了数据库的底层,开发人员看到的只是 Hibernate 提供的数据层 API,无法与灵活的使用 SQL 语句等数据库底层细节。因此,有必要在 Hibernate 框架中提供直接操作 JDBC 的接口。

在 Hibernate 框架中提供操作 JDBC 的接口的解决方案

Hibernate 的 session 机制

我们知 道 Hibernate 框架本身也是建立在 JDBC 之上的数据持久层实现,因此,要在框架本身提供操作 JDBC 的接口,需要切入其对 JDBC 封装的细节。

通过研究

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号