在企业开发过程中最头痛的就是DA层(Data Access)的开发了,关系数据库这个冬冬最讨人嫌了,我就因为讨厌关系数据库,大学有一段时间很讨厌写web程序。
这些问题主要都是因为以前都是直接用Sql和数据库打交道,每次web项目一把以上的时间花在了DA层了。工作后接触的第一种DA技术是Spring support的DAO编写,这样就可以减少了很多的代码,而且我还写了一个代码生成器来自动生成代码,这样开发速度就上来了,但是就算是这样我们还是很烦恼,因为单表的操作是简单了,但是多表的操作也是很烦恼,我们是用java代码建立了一个DBManger层专门用来组装多表的,当然很多人都是用sql进行多表的拼装,这样运行效率高,但是我们当时是选择了开发效率,所以多表都是在DBManager层用java代码组装的,没有利用数据库的特性,这样增加了web服务器的负担。而且在做查询的时候特别苦恼,每次都是把整个List全部给load出来了,这样更加耗费内存了。比如我们的订单列表的功能现在还没有多少个订单的时候都慢得不行了,一个是因为我们每次都load所有的Order对象,二是把Order对象的子对象也全部都Load出来了,本来用户只是想看其中几个订单而已,而且我们也没有做缓存,总之我们原来项目里面的DA层真的是问题重重。
这两天把Hibernate引入了我们现在新的项目中来了,开心啊,开心,给我们带来了解决上述问题的曙光:
1、在开发效率上面,我们现在所有的工作就是建立数据表,根据数据表生成hbm.xml的表对应Java bean的映射,以及生成java代码。而DAO只是需要一行代码。多表的联合也是定义在hbm.xml中的,整个过程看不到一行sql语句,开心。这样我们体系结构里面的DBManager就没有存在的必要了。而且DAO也只是需要做一个DAO,现在我们就只有Order的DAO了,所有的操作都在这里进行。
2、运行效率上,首先利用了延时加载,数据如果不用就不load出来,这样我们的Web服务器就没有那么大的负担了,然后就是多表的操作自动生成多表联合的Sql充分利用数据库的特性,这样也是减少web的负担。
接着最重要的问题就是在做订单列表的时候,这里真的要好好赞扬一下HQL,这个Hibernate的查询语言,用完全面向对象的方式解决了我们所有的问题:
a、分页问题:这里我们可以使用Query接口的来限制每次从第几个开始最多获取多少个数据,这样就可以按页获取数据,而且可以利用sum来得到数据的总量,这样分页功能就可以很容易实现了。根据我的试验,速度比原来快了一倍以上,而且原来根据数据量的增长还是线性下降的,而现在保持比较平稳的速度。
b、构造小对象的问题:这个问题来自于订单列表的时候只是需要几个简单的字段,而不需要整个order,这个问题可以通过在HQL的select语句中利用new语句来构造一个小的order对象,这样进一步节省了web服务器的内存:)
c、联合表查询:比如需要根据联系人信息查order,而联系人是order的一个子表,这个时候可以利用HQL很直观的写出这样的查询:eg:select new SmallOrder(order.a,order.b,order.c) from Order as order where order.contact.name='crab'(结合了b问题)这样我们根本就不需要担心客户的bt要求,他想怎么查询订单我都可以很容易的给他加上查询条件。
最后就是我们的产品模块,原来为了能够最大限度的扩展,利用了万能表的方式,这样什么产品都可以定义出来,但是这样的设计不利于做报表和查询,现在可以利用Hibernate重新设计产品模块,也可以很方便的万能化,但是查询和报表就可以很方便了。
总之,Hibernate给我们项目带来了真真实实的好处,从开发效率和运行效率上都是,特别是可以使用面向对象的方式去操作数据库,这样可以很面向对象地写企业程序,可以带来开发时候真实地快乐:)
还有一个最大的体会是Hibernate很少违反我的直觉,很多时候我只是觉得这个特性Hibernate应该支持,然后就试验,然后就成功了,根本不需要去看文档,这个和Python的“最少惊奇”原则妙曲同工。
文章来源:
http://blog.donews.com/crabhn/archive/2006/02/24/739825.aspx