首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

小弟我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(1)

2012-11-03 
我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(1)?????【START 修改日志 当天 22:12 】:本文主要是

我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(1)

?

?

???【START 修改日志 当天 22:12 】:本文主要是针对基于Hibernate框架的项目开发中复杂查询的最佳实践。分析了前几个网友的意见,我想在几个基本方面hibernate QBC,QBE还是很方便的:

??? 1) 单表简单查询(基于字段的等值查询, 全部And运算)时,简单的汇总,如count等。

??? 2) 全动态查询条件, QBE很方便。

?? 【END 修改日志? 当天 22:12 】

?

【START 修改日志?2008-9-19 21:20】:

?? [quote="ziyuan"] ibatis完全符合lz的需求,,why not try it[/quote]

?

???? 同意你,我在公司项目中制定这个开发规范正符合 ibatis 的特点, 不过 Hibernate 对其也提供了完全的支持, 这两者在该功能上是一样的。

?

???? ?因为 2006年项目启动时,已经确定使用 Hibernate 3, 而公司以前编程规范是使用 HQL, QBC 的?, 正好那次在项目初期对Hibernate 这一使用规范逐渐纠? 正过来。

???? ?如果是新的项目, 我想 ibatis 也是可以考虑的方案。
【START 修改日志 2008-9-19 21:20】

?

???

?

??? 2006年公司电信项目启动时,项目组选择沿用使用已久 的Hibernate及开发规范做 ORM方案。 做为公司新的电信项目的架构师一员,根据一直以来的项目经验,在项目进行2月后,面对复杂查询业务陆续增多,原有以Hibernate HQL,QBC 为特点的开发规范有些无法很好满足需求。

??

??? 因此在分析复杂查询业务 及 Hibernate 的特性特点, 我为 Hibernate 开发时制定了一个规范:禁用 HQL,QBC,QBE编程, 有三个要点,对于非单表的简单查询:

?

??? 1)程序员不得在Java代码中直接使用HQL;

??? 2)不得进行HQL拼装;

??? 3) 不得在 hbm.xml 映射文件中使用named HQL query。

?

??? 该规范按重要程度 基于四个方面的考虑:业务复杂度,程序员开发效率,维护难度和执行性能。??规范要求在 Hibernate 的 hbm.xml? 文件配置Named SQL Query 来进行这些功能的开发。


??? 项目中我们对其进行了适当的易用性改造,关于我们项目中Named SQL如何具体应用,见下一篇分享:我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(2)

?

1. HQL,QBC:

??? 今天写这个分享短文,源于前几天回覆网友icewubin 的帖子: “一个关于Hibernate的优化实例:从HQL到QBC,从QBC到QBE,再到‘增强的’QBE”,主要是Hibernate查询的几种使用方式:HQL,QBC,QBE。

??? 先说 QBC,QBE,例如:(Hibernate QBC?示例代码)

?

?

我们项目中的Java代码的调用就更为简单了:

    
实际上我在公司的JavaEE 框架中已经完善的封装了动态拼装附加条件 SQL 的功能,并且用法比 Hibernate, ibatis 本身更为简单,算是一个增强扩展包。 
只是本文是该主题的第一部分, 提出了问题, 下篇会详细介绍这一增强扩展的用法和实现原理。最近比较忙,一直没时间整理。  

难得碰到以解决问题为道的知音,再次  一下。以后多交流。

50 楼 Unmi 2008-09-26   最后的结论就是 禁用 Hibernate 51 楼 leisure 2008-09-26      用过一次hibernate,感觉可以这样用,简单操作的就用hibernate提供的支持,复杂的性能要求高的就写sql得了。
    这样用起来比ibatis配置文件稍微少了些,不用所有sql语句都写在文件里面
    折中处理吧,性能应该不是什么问题
    所以说hibernate太高深不敢用,我觉得大可不必,用它简单实用的就可以了,高深的不好控制的东西就不用了,老实自己写sql得了
    
    52 楼 devil-wx 2008-09-26   upheart 写道很想知道,如果一个查询条件是动态的,比如根据用户输入的查询条件来构造,那这种方案怎么做?
还是要编写 查询语句 增加判断~~ 53 楼 cyberblue 2008-09-26   <div class='quote_title'>yanghuw 写道</div>
<div class='quote_div'>
<p>简单查询HQL,复杂查询sql-query</p>
<div class='quote_title'>upheart 写道</div>
<div class='quote_div'>很想知道,如果一个查询条件是动态的,比如根据用户输入的查询条件来构造,那这种方案怎么做?</div>
<p>??? 动态条件可以通过Where子句来判断条件,比如你需要查询订单,订单号的条件是可选的,你可以在查询语句中这么写:ORDERNO is null OR o.ORDERNO=:ORDERNO,这种方式和if-else一样,如果条件为空就判断下一个条件,不为空就比较条件,就是效率会稍微差一点</p>
<p>?</p>
<p>?</p>
</div>
<p>?</p>
<p>沒必要這麼做, iBATIS里有判斷null值的標籤.</p>
<p>?</p>
<p>在iBATIS手册第48页</p>
<p>?</p>
<p>&lt;isEqual&gt; Checks the equality of a property and a value, or another property.<br/>&lt;isNotEqual&gt; Checks the inequality of a property and a value, or another property.<br/>&lt;isGreaterThan&gt; Checks if a property is greater than a value or another property.<br/>&lt;isGreaterEqual&gt; Checks if a property is greater than or equal to a value or another property.<br/>&lt;isLessThan&gt; Checks if a property is less than a value or another property.<br/>&lt;isLessEqual&gt; Checks if a property is less than or equal to a value or another property.</p>
<p>?</p>
<p>&lt;isPropertyAvailable&gt; Checks if a property is available (i.e is a property of the parameter bean)<br/>&lt;isNotPropertyAvailable&gt; Checks if a property is unavailable (i.e not a property of the parameter bean)<br/>&lt;isNull&gt; Checks if a property is null.<br/>&lt;isNotNull&gt; Checks if a property is not null.<br/>&lt;isEmpty&gt; Checks to see if the value of a Collection, String or String.valueOf() property is null or empty (“” or size() &lt; 1).<br/>&lt;isNotEmpty&gt; Checks to see if the value of a Collection, String or String.valueOf() property is not null and not empty (“” or size() &lt; 1).</p>
<p>?</p> 54 楼 icewubin 2008-09-26   cyberblue 写道
yanghuw 写道
简单查询HQL,复杂查询sql-query

upheart 写道很想知道,如果一个查询条件是动态的,比如根据用户输入的查询条件来构造,那这种方案怎么做?
    动态条件可以通过Where子句来判断条件,比如你需要查询订单,订单号的条件是可选的,你可以在查询语句中这么写:ORDERNO is null OR o.ORDERNO=:ORDERNO,这种方式和if-else一样,如果条件为空就判断下一个条件,不为空就比较条件,就是效率会稍微差一点





沒必要這麼做, iBATIS里有判斷null值的標籤.


在iBATIS手册第48页


Checks the equality of a property and a value, or another property.
Checks the inequality of a property and a value, or another property.
Checks if a property is greater than a value or another property.
Checks if a property is greater than or equal to a value or another property.
Checks if a property is less than a value or another property.
Checks if a property is less than or equal to a value or another property.


Checks if a property is available (i.e is a property of the parameter bean)
Checks if a property is unavailable (i.e not a property of the parameter bean)
Checks if a property is null.
Checks if a property is not null.
Checks to see if the value of a Collection, String or String.valueOf() property is null or empty (&ldquo;&rdquo; or size() < 1).
Checks to see if the value of a Collection, String or String.valueOf() property is not null and not empty (&ldquo;&rdquo; or size() < 1).




是啊,问题是感觉就是在用iBATIS的标签写这类判断逻辑?这样做合适么?逻辑一复杂,可维护性就不好了,又得不到IDE强大重构的帮助。 55 楼 chenxm521 2008-09-27   named query 什么意思.请教? 56 楼 duanyong 2008-12-04   我也很不明白。

现在很多企业需要别人会用hibernate。又不跨数据库操作,又要把它弄到项目中去。那么多的包弄到项目中,感觉很N。 57 楼 zhajie 2008-12-04  

本人赞同楼主的做法,命名查询的性能很好。hql既然无法替代sql,就可以不用,系统修改最大的部分就是sql部分,集中放置sql是个不错的选择。

热点排行