以华为和平安真实项目来讨论hibernate与JDBC
我是在2003年12月份开始用hibernate的,当初是要做华为的一个大型平台。使用的是velocity+struts+hibernate.这个项目做了一年多。这其中我们组对hibernate与jdbc之间
也有过一定的思考。可以这样说,当初应该说是对hibernate用得很熟练了。但大家之后总结了
使用hibernate比使用jdbc的优势之处。
其实在hibernate的一些教学例子中,使用hibernate确实比较简单,比如下面的一个查询:
public List query(String scope,Collection paras) {
return this.getHibernateTemplate().find("from User where "+scope,paras.toArray());
但是大家有没有想过,在我们的真实项目中,不会这么简单的,就拿上面的这个例子来说,from user,这样的话是查询出了所有的字段,根据数据库优化理论,我们知道,这样必定会影响性能,合理的是你用那个字段,你就查询出那个,结果我们又修改为以下:
select username,age from User where "+scope,paras.toArray());
我想问一下:这样做与直接使用JDBC有什么区别。可能大家要说,用hibernate至少省去了连接database的那段代码,但是我们并不要先一次作数据库查询时都要写的,我们可以把它写在一个action基类中,这个类 extends Action(在华为项目中如此实现)。这样所有的数据库操作的地方都用写那么一段连数据库的代码。
下面再谈谈使用procedrue,在一般的商业项目中(不是demo),一般的业务都是较复杂的,所以操作数据库时很多时候都是要用procedure来做,如果用hibernate代码的话,要用事务,还在写一大堆的代码,所以我们就是用procedure实现,再在hibernate中进行调用,但我要问的是,这与用jdbc中调用有什么区别啊,没有什么区别。
还有比较多的要谈,但现在时间不允许。
下面我总结一下我的看法:
hibernate使用在业务很简单,demo中比较好,再一个用一对多中也比较方便。但在业务比较复杂的项目中,好像没什么优势。特别是要进行优化的项目中。就像上面的查询语句一样。
最近看了一下ibatis,觉得他也只是jdbc,只不过把sql从代码中,拿到了配置文件中,这点很好。所以我觉得ibatis是我要找的东东。这个在华为项目中,其实我们已经实现了那样的思想。只是没有用配置文件。
下面我把以前的代码放一下:
ForumSearchForm form=(ForumSearchForm)actionForm;
String hql="select forumBean.username,fromBean.age from ForumBean as forumBean";
if(form==null)
{
return list(session,hql,1,10);
}
else
{
String where="";
return list(session,hql,form.getPageNo(),form.getPageSize());
}
我看过一些后来的同志在讨论区的代码,发现很多同志现在做项目的代码还是不如2003年那个项目中的好啊,还有一点就是我们公司另一个组在做平安的项目时,使用了struts+spring+hibernate。其实spring在项目中的作用就是对接口进行调用,实现类可以变,但为了这个方便,程序也搞得比较复杂,还要多配置一个文件,applicationContext.xml,麻烦得要死,还不如在华为项目中的那个技术。当然这个就不说了。
我说上面的目的,就是让大家想想清楚,在用一种新技术之前,想想为什么要用它,到底有什么想的好处和代价。而不是跟风走。同时也想听听大家的建议。我们一起来讨论一下。
问题点数:0、回复次数:54Top
1 楼ywh005(为一)回复于 2006-06-03 13:20:56 得分 0
自己先顶一下Top
2 楼mingyuan1983(日子指间沙)回复于 2006-06-03 13:23:37 得分 0
帮顶Top
3 楼Ryo_Hazuki(困了)回复于 2006-06-03 14:18:14 得分 0
能用编码方式实现的奏尽量表用HQL语句Top
4 楼ywh005(为一)回复于 2006-06-03 14:47:32 得分 0
用hibernate的好处
好处:1:修改了表时,对程序影响小,只需要修改hbm.xml文件。
2:简单的update,load.save比较简单,不用写sql代码 insert into等
其实如果我们要转换类型的话,在hibernate代码里面还要要写的,对吧,比如我们要把一个字段转成date型,那我们在程序中to_date()一下,这与数据库就有关了,因为每个数据库函数都有些不同,如果用了特定的函数,那hibernate也要修改,所以说的数据库换了,对程序没什么影响 ,这句话是不对的,像上面的那个情况就是要修改
还有就是像复杂的操作,比如要用事务来做的,那就一定要用procedure来做了,用hibernate要在程序中写很大一段hql代码。所以这种情况,数据库修改了,还是对项目有影响 的Top
5 楼jfy3d(剑事 http://www.migti.com)回复于 2006-06-03 15:15:26 得分 0
1:修改了表时,对程序影响小,只需要修改hbm.xml文件。
有可能还要改view或BOTop
6 楼treeroot(旗鲁特)回复于 2006-06-03 15:21:10 得分 0
hibernate本来就没什么好的Top
7 楼skyinfo(tiger)回复于 2006-06-03 15:34:37 得分 0
我也不喜歡用hibernamteTop
8 楼ywh005(为一)回复于 2006-06-03 16:19:07 得分 0
大家对hibernate有不同的看法,可以发表一下。还有就是对ibatis的看法,也可以说说,我们的目的就是用最好用的。对自己项目确实有帮助的。Top
9 楼ywh005(为一)回复于 2006-06-04 00:19:50 得分 0
人气不够啊,一起讨论一下Top
10 楼jacklondon(jacklondon)回复于 2006-06-04 02:07:05 得分 0
我写了一个 framework, 对 JDBC 的封装比 ibatis 好很多。
http://sourceforge.net/projects/velocitywebTop
11 楼realdreamer(楼主英明,贫僧久仰大名,特来拜见)回复于 2006-06-04 02:15:47 得分 0
就你这样看待hibernate还不早死光光. 感觉你对hibernate的认识还是不够深入啊.
Top
12 楼ywh005(为一)回复于 2006-06-04 10:30:26 得分 0
楼上的说得对啊,哈哈,虽然我是最早一批用hibernate的,但后来做管理了,所以对它也生了。所以我们大家一起讨论啊,同时也是请教Top
13 楼peihexian(知其然.知其所以然)回复于 2006-06-04 16:55:51 得分 0
这只能说明你们的技术实力有限,X软(肯定不是微软)就是用的自己的框架,我们没有实力做自己的框架,不过Hibernate的烂确是早就体会到了,现在的项目是直接用spring jdbcdaosupport,数据库连接及事务一样可以不写代码,爽歪歪。Top
14 楼water2004(@-@)回复于 2006-06-04 18:14:57 得分 0
hibernate难道就是为了省几条sql吗???Top
15 楼A3MAO(阿三)回复于 2006-06-05 10:40:22 得分 0
如果能封装一个好的jdbc类,完全可以代替hibernate,我也不是很喜欢hibernateTop
16 楼TinyJimmy(Jimmy)回复于 2006-06-05 11:27:45 得分 0
其实Hibernate 也不是一无是处,偶对Hibernate一知半解,但自己写过ORM的平台。对类似应用要用好感觉需要很强的面向对象抽象设计能力,楼主提到的一些概念好像开发层面的问题居多。
Top
17 楼pdvv(花猫)回复于 2006-06-05 11:44:41 得分 0
我也觉得Hibernate不是我想要的,对iBatis比较喜欢。当然,工作中使用的是公司自己的写的ORM。Top
18 楼Aryang(编程砖家)回复于 2006-06-05 13:51:10 得分 0
方便和效率,总是一对矛盾,我选择效率,不然Oracle数据库SQL调优什么的岂不白学了,狗屁不是了Top
19 楼ming0630()回复于 2006-06-05 15:25:18 得分 0
Hibernate 和ibatis 都有他们的好处 也有不足 就需要具体情况具体分析!
难道你能说哪个不如哪个,就忽略哪个?Top
20 楼ywh005(为一)回复于 2006-06-06 01:04:11 得分 0
我自己写了一个封装了JDBC的业务处理平台架构。在这个架构之上进行编程,就真的像塔积木一样方便,我下属看过的人都说好,我自己感觉比JDBC好用,开发人员完全不用管数据库连接,关闭,数据库连接池、数据库处理、查询分页等问题。
其实如果大家能用心在JDBC进行封装,还是可以架构自己的平台的,完全不用hibernate,而且控制更加的灵活。当然,我觉得ibatis也可以。其实我个人感觉hibernate也做不到跨数据库,如果项目业务关系复杂的话(我们一般做的项目都是电信的),你必定会用到与数据库相关的函数。而且有时还真应该用procedure.所以数据库换了,程序代码和procedure也必须相应修改。不知大家怎么看,Top
21 楼funcreal(为中华之崛起而编程)回复于 2006-06-06 08:25:25 得分 0
select username,age from User where "+scope,paras.toArray());
我想问一下:这样做与直接使用JDBC有什么区别。可能大家要说,用hibernate至少省去了连接database的那段代码,但是我们并不要先一次作数据库查询时都要写的,我们可以把它写在一个action基类中,这个类 extends Action(在华为项目中如此实现)。这样所有的数据库操作的地方都用写那么一段连数据库的代码。
--------------------------------------------------------------------------
你可以再多加一些东西,让这个语句自动完成对象关系的映射。这里好像与“省去了连接database的那段代码”没任何关系吧?不知道你为什么会这样想。hibernate决不是为了省去几行代码。
下面再谈谈使用procedrue,在一般的商业项目中(不是demo),一般的业务都是较复杂的,所以操作数据库时很多时候都是要用procedure来做,如果用hibernate代码的话,要用事务,还在写一大堆的代码,所以我们就是用procedure实现,再在hibernate中进行调用,但我要问的是,这与用jdbc中调用有什么区别啊,没有什么区别。
------------------------------------------------------------------------
不知道你用的是hibernate2还是hibernate3,不知道你有没有了解过hibernate3的session-per-request模式,如果使用这个模式开发,只需在应用程序开始配置好一个过滤器,以后你就再也不需要和事物打交道了,你的代码中只需要和业务相关的代码。而且hibernate3中的异常也已经改为不需查异常了。不知道我说的这个你知道不知道
严重同意:TinyJimmy(Jimmy) ( ) 信誉:105
楼主的问题层次是不是浅了点啊?我认为你根本不了解hibernate.Top
22 楼funcreal(为中华之崛起而编程)回复于 2006-06-06 08:29:01 得分 0
public class HibernateFilter extends HttpServlet implements Filter {
private FilterConfig filterConfig;
private SessionFactory sf;
private Logger logger = LogManager.getLogger(HibernateFilter.class);
public void init(FilterConfig filterConfig) throws ServletException {
logger.debug("初始化session factory");
sf = HibernateUtil.getSessionFactory();
}
//Process the request/response pair
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException,
IOException {
logger.debug("进入hibernate filter");
try {
logger.debug("开启事务");
sf.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
logger.debug("关闭事务");
sf.getCurrentSession().getTransaction().commit();
} catch (Throwable ex) {
ex.printStackTrace();
try {
if (sf.getCurrentSession().getTransaction().isActive()) {
logger.debug("发生异常,回滚事务");
sf.getCurrentSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
logger.debug("发生异常,回滚事务失败");
rbEx.printStackTrace();
}
// Let others handle it... maybe another interceptor for exceptions?
throw new ServletException(ex);
} finally {
logger.debug("结束hibernate filter");
}
}
//Clean up resources
public void destroy() {
}
}
Top
23 楼javalin3012(创薪型人才)回复于 2006-06-06 09:44:27 得分 0
可能是因为JDBC已经很熟了,我没觉得hibernate有多么大的好处。
连ibatis都比它强,ibatis实现SQL纯配置化和可定制缓存+DAO模式我觉得就是即实用也足够!
有人说你不用hibernate那些个程序员把SQL给你写得到处都是:JSP上、JAVABEAN里...你都不知道他会写到哪里去...
把SQL扔到JSP上的程序员就能把hibernate用好用神?我不信。Top
24 楼pdw2009(不想做菜鸟)回复于 2006-06-06 11:10:49 得分 0
我不喜欢hibernate原来公司有个项目就用这东东,最后有好多问题!
Top
25 楼lulu123ma(抵制虚黄,支持实黄(扫黄现状))回复于 2006-06-06 15:50:36 得分 0
ForumSearchForm form=(ForumSearchForm)actionForm;
String hql="select forumBean.username,fromBean.age from ForumBean as forumBean";
if(form==null)
{
return list(session,hql,1,10);
}
else
{
String where="";
return list(session,hql,form.getPageNo(),form.getPageSize());
}
------------------------------------------------------------------------
从这段代码可以看出楼主和楼主的同仁们对MVC还没有理解,对struts和hibernate各自所处的地位和作用也不很清楚,只是一味的赶时髦用了这些个框架!Top
26 楼lulu123ma(抵制虚黄,支持实黄(扫黄现状))回复于 2006-06-06 15:54:05 得分 0
所以楼主就得出以上结论!可能还有另外一些感受:struts的唯一好处就是FormBean映射!!Top
27 楼ximenying(西门)回复于 2006-06-06 16:10:18 得分 0
hibernate的流行应该是跟它的完全对象化数据库表是很有关系的,其实就操作数据库本身来说,它的技术我觉得并不怎么样,但它确实满足了一部分人对对象化的追求以及表面上带来的一些方便。Top
28 楼mooniscrazy(月色疯狂)回复于 2006-06-07 11:20:04 得分 0
用hibernate代码量减少,这一条还不够吗?Top
29 楼zzw_happy(蒹葭苍苍)回复于 2006-06-07 11:27:34 得分 0
我从试用hibernate后就觉得它还不如jdbc方便。
一直没用。Top
30 楼Samen168(Code to coding)回复于 2006-06-07 12:58:35 得分 0
没有深入了解,又怎么能发现好处呢,当然这个和个人有很大关系
就好像不久前很多人认为从UI直接访问数据库简单一样 :)Top
31 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2006-06-07 13:29:56 得分 0
嫌别人得不好的话
那就用自己封装的东东来写吗。Top
32 楼zhuangyan2004(庄严)回复于 2006-06-07 13:31:25 得分 0
继续讨论啊,我在改一个hibernate的项目,好郁闷啊.Top
33 楼flyxxxxx()回复于 2006-06-07 14:09:13 得分 0
1、维护代码与数据库的表的同步方便:
先写bean,在类的注释及方法注释中写hibernate 的XDoclet标记,用Ant生成hbm文件,生成数据库的表,写一个程序将所有基础数据插入表.这样所有的bean的改动都可以一次性同步
2、使用Criteria来创建查询(不是用HQL),省去了在写HQL或SQL或存储过程的大量排错时间
3、不同数据库间可移植。
有以上三点足以解决使用SQL的不足,或许有人说到效率问题(谁能保证每个程序的写的效率都很高?),但与它节约的开发时间比,很多时候是微不足道的。Top
34 楼ThomasBoxing(拳打脚踢)回复于 2006-06-07 14:17:17 得分 0
个人感觉JDBC 不错!Top
35 楼jackie2004(时光的羁绊)回复于 2006-06-07 14:28:34 得分 0
记录~~Top
36 楼ttjacky(豆豆糖)回复于 2006-06-07 15:17:47 得分 0
要达到修改表结构后代码不需要改,其实有比Hibernate更好的封装方案,也不一定非要ORMapping才行,能快速编程,架构简单清晰才是正道,对于太复杂的东西,还是用jdbc来搞算了,其他的不见得比JDBC能简单Top
37 楼CAYU(中原)回复于 2006-06-07 15:35:22 得分 0
hibernate 比较适合我Top
38 楼Goldxin(我老婆 茉莉花)回复于 2006-06-07 15:35:24 得分 0
水平不够就不要用hbm吗 用了反而有可能变成累赘
我水平不够 我不用 我用ibatis 感觉挺好用Top
39 楼uno(钢盅郭子)回复于 2006-06-07 15:52:37 得分 0
楼主不用视图吗?……眼中怀疑楼主得经验和水平Top
40 楼wubaowang(Knowledge is power)回复于 2006-06-07 18:02:52 得分 0
学习Top
41 楼YuLimin(阿敏总司令:简单就是美—钻石闪闪您快结贴!)回复于 2006-06-07 18:44:30 得分 0
复杂的统计之类的还是用JDBC:)Top
42 楼ardee()回复于 2006-06-07 20:40:23 得分 0
Java开源项目讨论高级Q群:18349943Top
43 楼asd_(CSDN旷代灌水VIP)回复于 2006-06-07 23:41:17 得分 0
但是大家有没有想过,在我们的真实项目中,不会这么简单的,就拿上面的这个例子来说,from user,这样的话是查询出了所有的字段,根据数据库优化理论,我们知道,这样必定会影响性能,合理的是你用那个字段,你就查询出那个,结果我们又修改为以下:
select username,age from User where "+scope,paras.toArray());
--------------------
多余的,这样的优化hibernate会替你做,也就是所谓的lazy-load,但是代价就是长连接,也就是说,在你调用getter的时候,session必须不是关闭的。
1、维护代码与数据库的表的同步方便:
先写bean,在类的注释及方法注释中写hibernate 的XDoclet标记,用Ant生成hbm文件,生成数据库的表,写一个程序将所有基础数据插入表.这样所有的bean的改动都可以一次性同步
-----------------------------
代码的健壮依赖于 bean,xdoclet标签,ant等等,你不觉得太容易出错了吗?而且还有个可怕的开源代码的升级彼此不协同而且不负责任。
3、不同数据库间可移植。
-----------------------------
数据库间的移植有没有hibernate都不会简单,如果你认为仅仅修改了hibernate conf文件中的方言就完成了移植,我只能说相关人员的数据库能力不过关。Top
44 楼hornbilltofy()回复于 2006-06-08 08:18:46 得分 0
hibernate最大的好处是对数据库操作的封装,当然灵活性和反映速度要比直接使用jdbc差得多,针对配置复杂的问题可以通过自己编写插件来解决,我就编了一个jsf+spring+hibernate的工具,仅需一个按钮就可以完成数据库表到整个基本业务的代码编写、配置和数据操作,包括分页。我专门做了一下测试,不断地切断和连接数据库,发现hibernate的确能很好的处理数据库连接的变化,如果是自己写jdbc,各个方面都要考虑到,那可是个艰巨挑战。Top
45 楼didoleo(冷月无声)回复于 2006-06-08 08:28:18 得分 0
关注,学习Top
46 楼flyxxxxx()回复于 2006-06-08 08:40:36 得分 0
to asd_(CSDN旷代灌水VIP)
代码的健壮依赖于 bean,xdoclet标签,ant等等,你不觉得太容易出错了吗?而且还有个可怕的开源代码的升级彼此不协同而且不负责任。
-----------------------------
在数据库的表有变动时,你认为依赖人力维护代码容易,还是依赖工具维护容易,你有没有照我说的试过?
数据库间的移植有没有hibernate都不会简单,如果你认为仅仅修改了hibernate conf文件中的方言就完成了移植,我只能说相关人员的数据库能力不过关。
-----------------------------
你认为直接用SQL时移植的工作量大还是用Hibernate时的移植工作量大?
Top
47 楼lzmhehe(小飞飞)回复于 2006-06-08 08:53:24 得分 0
关注
正在学习hibernateTop
48 楼jian74566(风吹)回复于 2006-06-08 09:35:57 得分 0
我觉得大家都是习惯于以前面对关系型数据库的表操作,如此很难进行较好的面向对象的设计,而Hibernate的一个目标就是让你脱离关系型的束缚,从对象出发.真实项目中用jdbc做持久化应该会很痛苦吧.Top
49 楼nearsun(蓝冰)回复于 2006-06-08 10:05:04 得分 0
Hibernate对于一些老的系统(数据库设计的不规范的),用起来的确很不方便。
如果是新设计的数据库,还是比较方便的。Top
50 楼Saro(这也不是江水,这是二十年流不尽的英雄血。)回复于 2006-06-08 13:12:49 得分 0
1.为了oo,在面向对象数据库无法成气候之前,orm产品是很好的替代.程序员可以用更oo的方式设计开发系统.
2.就楼主举的例子而言,也许是在做不必要的查询优化?除非有clob,blob列,取2列并不比取3列的数据快到哪里去,再考虑到orm框架的缓存,应用层的缓存的因素,每次都只取对象的某几列的方式(这种情况做缓存是很困难的)可能还会比取整个对象还要慢,还会导致业务接口的复杂化.究竟该采取怎样的策略,个人认为还是要根据实际的业务需求来,测试再测试.Top
51 楼cleansunshing(努力学习中)回复于 2006-06-08 13:37:30 得分 0
markTop
52 楼treeroot(旗鲁特)回复于 2006-06-08 13:41:42 得分 0
感觉就是在拼SQL呀
hibernate和ibatis 都太繁琐了Top
53 楼racke()回复于 2006-06-08 20:37:05 得分 0
hibernate 最精华的部分是他的缓存Top
54 楼aChinese(一个中国人)回复于 2006-06-09 08:51:56 得分 0
性能瓶颈一般都不在多取几个字段还是少取几个字段。况且你还可以做轻量设计。
Top




