除了Hibernate外,另一流行的ORM框架iBATIS也使用广泛。两者的不同的在于,Hibernate提供的是“一站式”的ORM解决方案,而iBATIS提供的是“半自动化”的ORM实现。
Hibernate提供了从POJO到数据库表的全套映射机制,开发人员往往只需要定义好POJO到数据库表的映射关系,即可通过Hibernate提供的方法完成持久层操作,甚至不需要对SQL的熟练掌握,因为Hibernate会自动生成对应的SQL,并调用JDBC接口加以执行。但是Hibernate这种“一站式”的解决方法并不适用于所有的情况,例如:
1、有些系统基于安全考虑,只对开发人员提供查询SQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2、有些系统要求所有牵涉到业务逻辑部分的数据库操作必须在数据库层由存储过程实现,例如金融行业等。
3、有些系统数据处理量巨大,性能要求极为苛刻,这往往意味着必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
在这些场景中,全自动化的Hibernate已经不能满足要求,而iBATIS刚好可以解决这个问题。它定义POJO与SQL之间的映射关系,但并不会为开发人员在运行期自动生成SQL执行,具体的SQL需要自行编写,然后通过映射配置文件将SQL所需的参数以及返回的结果字段映射到指定的POJO。
面试题:与Hibernate相比,iBATIS有哪些优缺点?
答:Hibernate和iBATIS都是使用广泛的ORM框架,但前者提供的是“一站式”的解决方案,后者是“半自动”的实现方式。iBATIS的优点如下:
1、iBATIS适用于这些场合,例如系统无法给出比较完整的表结构的场合,以及对安全性比较高、只能提供SQL或存储过程的场合,例如金融行业的项目。另外在系统数据处理量巨大,对性能要求极为苛刻的情况下,使用iBATIS会有更好的可控性。
2、iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当理想。
3、Hibernate学习门槛不低,要精通门槛更高,怎么设计好O/R映射,对性能影响较大。
缺点如下:
1、iBATIS需要手写SQL语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些HQL。同样的需求,iBATIS的工作量比Hibernate要大很多。
2、以数据库字段映射得到的PO和Hibernate对象化映射得到的PO有着本质区别,前者的PO是扁平化的,而Hibernate的PO是可以表达立体的对象继承、聚合等关系的。
3、Hibernate功能强大,数据库无关性比较好,O/R映射能力强。
4、Hibernate与iBATIS相比,使用更加广泛,它的文档、产品完整性,以及版本的开发速度都需要更加强大。