我的开发规范分享(二)- 禁用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><isEqual> Checks the equality of a property and a value, or another property.<br/><isNotEqual> Checks the inequality of a property and a value, or another property.<br/><isGreaterThan> Checks if a property is greater than a value or another property.<br/><isGreaterEqual> Checks if a property is greater than or equal to a value or another property.<br/><isLessThan> Checks if a property is less than a value or another property.<br/><isLessEqual> Checks if a property is less than or equal to a value or another property.</p>
<p>?</p>
<p><isPropertyAvailable> Checks if a property is available (i.e is a property of the parameter bean)<br/><isNotPropertyAvailable> Checks if a property is unavailable (i.e not a property of the parameter bean)<br/><isNull> Checks if a property is null.<br/><isNotNull> Checks if a property is not null.<br/><isEmpty> Checks to see if the value of a Collection, String or String.valueOf() property is null or empty (“” or size() < 1).<br/><isNotEmpty> Checks to see if the value of a Collection, String or String.valueOf() property is not null and not empty (“” or size() < 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 (“” or size() < 1).
Checks to see if the value of a Collection, String or String.valueOf() property is not null and not empty (“” 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是个不错的选择。