你真的需要Spring + Hibernate吗?
by zhlmmc
Java领域的框架总是层出不穷,自从EJB失去了它的光环以后,Spring + Hibernate的组合红遍了世界各地。如果说View层还有别的选择的话(JSF一时半会儿统一不了江山),逻辑控制和数据访问层则已经被Spring + Hibernate统治了。Spring和Hibernate也就成了事实上的标准。不管新手老手,不管项目大小,必上Spring + Hibernate。看看AppFuse们吧,哪个不是X + Spring + Hibernate?
我从2005年开始接触Spring和Hibernate,系统的学习过这两个框架。不得不承认Spring和Hibernate给我带来了全新的体验。AOP,ORM,我以前只听说过,没有实践过。这样的新技术让我兴奋了好久。然而新鲜感并不长久,用多了发现我事实上的工作量没有减少。除了代码结构上的变化以外,Spring和Hibernate并没有带来很多实际的好处。虽然减少了代码的耦合度,但是增加了代码的复杂度。Debug的时间反而长了,因为对这两个框架的不熟悉,很多问题找不到原因,得去google,得去发帖问。回过头来想想为什么要用这些框架呢?
做PHP的人总说做Java的Over Engineering,仔细想想还是有道理的。我平时接触的大多是一些小项目,有的甚至数据库表不满10张,用Spring和Hibernate来开发似乎是杀鸡用牛刀了。于是我很快抛弃了Spring,因为我发现Spring的IoC和AOP对我来说真的是没什么实际作用(那个xml文件维护起来很麻烦),除了让我感觉自己跟上了时代的潮流以外。我留着Hibernate是因为我懒,MyEclipse帮我自动生成的数据访问层还是挺好用的,我写不来SQL语句了。但是好景不长,我发现我又错了。Hibernate给我带来的方便似乎还不够弥补他带来的麻烦:
<[if !supportLists]>1. <[endif]>程序数据和数据库不同步
明明页面上的数据改了,可是数据库里没有。为了这一点我一直想把Hibernate所有的Session都禁用了,但这是不可能的。Session里面的东西不是你能控制的,不管你怎么flush,数据就是不同步。反过来就更不用想了,手工改了数据库Hibernate是不可能认识的。
<[if !supportLists]>2. <[endif]>查询麻烦,特别是夸表的join查询
有时候一个where语句就能实现的简单功能,要循环几次才能拿到那个对象(当然可以用HQL,我太懒,SQL都没学好那)
<[if !supportLists]>3. <[endif]>Lazy Load对于小系统就是鸡肋
明明数据库里有,但是Hibernate就是没有,明明拿到了一个对象,但是里面什么都没有,傻眼了吧。虽然这个问题可能是自己的配置文件或代码没写好,但确实挺令人心烦的。
<[if !supportLists]>4. <[endif]>更改数据库的代价太大了
有多少系统是按照软工标准来的?开发到一半来修改数据库也是难免的。这时候就得万分小心了。牵一发而动全身啊!修改XML,修改Model,甚至修改DAO。我不才,想不到好的解决办法。这个问题让我开始对Hibernate望而却步。
Spring和Hibernate都是好东西,但也不是万能的。小系统用这些就是累赘了,得不偿失。虽说Spring + Hibernate已经是轻量级的实现了。但我似乎需要一个更轻量级的工具。
前些天研究过一个PHP的框架CodeIgniter,不得不说PHP真的是一门为做网页而生的语言,LAMP有今天的局面也是必然。PHP和Java整个架构就不一样,所以框架也没有什么可比性,但我想要说的是CodeIgniter提供的Database模块。它设计的思路就和Java的完全不一样,十分简单,但很好用。举两个例子吧(PHP语言描述,我想会用Spring和Hibernate的人应该都能看懂):
<[if !supportLists]>1. <[endif]>查询:
$sql = "select * from user where username=? and password=?"
$query = $this->db->query($sql, array($name, $pwd));
if ($query->num_rows() > 0)
{
foreach ($query->result() as $row)
{
echo $row->first_name;//firs_tname是数据库字段名
echo $row->last_name;
}
}
<[if !supportLists]>2. <[endif]>插入:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);//这里的array相当于Java里面的map
$this->db->insert('mytable', $data);
<[if !supportLists]>3. <[endif]>更新:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->where('id', $artical_id);
$this->db->update('artical', $data);
<[if !supportLists]>4. <[endif]>删除:
同上
当然功能还不止这些,我只是列举了一些常用的。这样的用法和类库我以前的确没有见到过。如果Java能提供这样一个操作数据库的类库一定会很方便。但是我没有找到Java有类似的东东,大概是我孤陋寡闻吧。我想要自己写一个,应该不是很难。
万事都有两面性,Spring + Hibernate是很伟大,但他们不能满足每一个人的需要。在我看来小项目(直观的来说,数据库表少于15张)根本不需要这些,用直接的易于理解的方式去做会有更高的效率。强大的工具不一定是适合的工具,Spring + Hibernate真的适合你吗?
心情: 挺好


