最近学习了SSH(Spring,Struts2,Hibernate)和SSM(Spring,SpringMVC,Mybatis)这两套框架,在框架单独学习以及框架整合的过程中,对于SSH与SSM有了基本的对比认识。
Hibernate与mybatis比较
我更喜欢Mybatis
jar包管理: 不论Hibernate或是Mybatis,感觉jar包都很简单,算上数据库驱动,也就2个jar包,引入而言,两者不相上下,起码不会因为什么jar包不全,jar包冲突苦恼。
学习难度: Hibernate显然要比Mybatis难于掌握,明显的是,那些我看得头晕的API,虽说使用上会不觉得数据库的存在,而且可以正向生成数据表这两点挺好,但是有时候有的操作假如完全使用Hibernate提供的API,会觉得有些苦恼,学习已经是比较耗费精力了,而且我自己有时候不得不使用HQL,但是其实我并不希望这样,我认为既然我要混用两种方式操作数据库,为什么我不直接使用一种呢?相比之下,我更喜欢使用HQL,因为在学习servlet+jsp的时候,我比较喜欢通过sql操作数据库的感觉,到了学习Hibernate的时候,自然也会偏向于自己相对熟悉的方式,然而,如果通通使用HQL,感觉又与Hibernate的理念不一致,也没有完全体现那种面向对象方式操作数据库的感觉,所以在使用Hibernate的时候,我自己是挺矛盾的。还有各种级联参数等等,都需要比较多对精力去学习。当然这跟我自己学习阶段比较初级有关系。而Mybatis,在学习的时候,一下子感觉很熟悉,因为基本上我只需要编写SQL语句就可以了,不需要再去学习一堆API的使用了,比较而言,显得很简单。
使用: 使用而言,我也是更喜欢Mybatis,如果是使用Hibernate,每一个实体类,都会需要一个映射文件,还需要一个总的Hibernate配置文件,这也仅仅是配置文件,我们还不能使用Hibernate,还要使用一堆API进行各种条件添加等等,着实不易。不过,Hibernate可以使用正向生成数据库表,也是挺方便的,然而,国内都是先设计表再根据表做的实体类,这一点略微可惜。反观Mybatis,它也需要一个总的配置文件,但实体类而言它并不需要映射文件,只需要为为每个实体类定义一个操作性质的接口就可以了,并不需要实现类。当然,还需要对应的mapper.xml文件,不过基本上所有的操作都集中在了那个mapper.xml里,它完成了各种操作,包括所有的条件添加。动态SQL的加入,也是让这个mapper.xml文件显得很灵活,不过确实SQL需要写很多。再加上Mybatis有反向生成的能力,实体类甚至都可以不用写了。因为我自己偏向于直接使用SQL,所以我显得很偏向Mybatis。
Struts2与SpringMVC比较
我更喜欢SpringMVC
jar包管理:这一点我想吐槽很久了,Struts2的jar包分散凌乱,版本更新后也存在一些坑,好几次让我无力吐槽(这当然也是我自己的学习阶段问题)。而SpringMVC,很简单,在Spring的基础上只加入了web相关的包,又因为Spring的命名比较规范,所以很容易找齐需要的jar包。
学习难度:学习难度上,Struts2显得相对难一点。Struts2的操作还比较繁琐。SpringMVC则显得很直观。
使用:显然,springMVC是比Struts2好用方便的。一个最基本的功能,表单数据获取,Struts2的操作就显得繁琐得多了,既要为Action提供对应的字段,又要提供setter/getter方法,而SpringMVC的数据绑定就简单得不能再简单,只需要属性名字相同或就可以了,并没有太多需要注意的细节,一次成功率高的多。特别要指出,Struts2的配置文件也是麻烦的,配置一个拦截器,需要好几行代码,每个Action的配置也是够复杂的了。反观Spring MVC,可以自动组装url,再配合注解开发,简直不能再开心了。还有,Struts2不支持Restful风格的url,SpringMVC这方面天然支持。
漏洞:还有一点,需要单独提出来,就是Struts2已经曝出过两次重大漏洞了,SpringMVC则还好,这一点相信除非是旧项目,不然不会使用Struts2了,不省心。
SSH与SSM比较
SSM这套框架组合相比SSH而言,整合起来相对更轻松。因为SpringMVC本来就是Spring框架内的一个模块,引入jar包后,基本不需要额外的配置,只是要注意避免二次扫描注解而已,就算不注意这个也没有问题,最多扫描2次注解。再加上dao层里,使用Mybatis的话连实现类都省了,在配置了Mybatis的接口扫描后,也可以实现自动注入了,这里又省了很多步骤,却是方便很多。而且基本上SSM的整合,很容易成功,一些细节问题比SSH要少。所以,当下流行SSM确实有原因的,就是因为SSM比SSH要好用灵活。
以上是我学习这两套框架的时候的对比感受,目前来说自己对这两套框架的理解还很浅,所以如果以后有机会在实际工作中对比两套框架的更多的优劣细节,我会回来更新的。