Ibatis VS Hibernate

近日,在JavaEye论坛中,看了Ibatis和Hibernate的帖子,看后,心里觉得的憋闷,不说不快, 这里 ,我想更细化一下:

1. 库表的复杂度,首先取决于需求,不取决于设计,设计能力强的人,也要遵守库表设计的规范,从 巴克斯三个范式上,原则上也要遵守。不能说用了Hibernate,自己的库表设计能力就强了。不能为了用 Hibernate,就去一味批判复杂的关系不对。复杂的关系设计对不对,首先取决于是否有复杂的需求,其 次才取决于设计者的能力。

2. 只要你用的是关系数据库,就必须要明白,为什么叫关系数据库,而不叫面向对象数据库,把面向 对象的那些观点,拿到库表设计上,后期维护和调优上,你要担起责任,不能让开发人员替早期决策人员 擦屁股。我见过有的人,打着OO和扩展性的旗号,硬生生的把一个表,拆成了三个表,而这三个表,本来 ,只需要增加一个类型字段,再做一些冗余,就可以是一个表。现在查询时,还要把这三个表Union到一 块来查。当需求变更时,增加一个字段,不仅要改变三个类,还要改变三个表,简直是乱伦。

3.One-One的库表设计,对于DBA来讲,并不是一个best practice的设计。不能为了Hibernate,刻意 把大表拆成小表,再用几个小类,做成One-One的映射关系。整体性,是不能随便的分割,毕竟开发人在 调试、测试和维护的时候,更喜欢看数据库里的数据,本来一个SQL,就查出来,现在要到多个表中去查 。

4. 增删改存的实体维护

Ibatis比不上Hibernate,说实在话,现在让我写SQL来维护一个多对多关系的实体维护,我都要考虑 上半天,别说写代码了。

5. 你需要写原生SQL吗

首先你要确认,你项目的要求不需要写原生SQL,再来讲Ibatis和Hibernate的好坏,在写原生SQL上, 特别是动态生成的SQL,ibatis比Hiberante有得一拼,ibatis就像一个模板一样,将SQL写在配置文件当 中,集中配置,特别方便技术领导者监控项目成员写的SQL好坏,而且没有什么学习曲线,就写SQL就完事 了。

有人会说,Hibernate也支持写SQL,但是写代码当中,就失去了原来基于Hibernate的DAO的简洁性。 那个DAO一点也不简洁,如果你将动态拼SQL的代码也放在DAO当中,那个DAO就会充斥大量的If 。。Else 。。之类的语句,一坨一坨的,非常的壮观。

还有人会说,Hibernate也支持命名查询,将SQL写在映射文件当中,但是命名查询,只支持占位符固 定的情况,也就是说,where a = ? and b = ? and c=?,是三个问号,就是三个问号,传参时,少一个 都不行。但是很多项目的查询,都是动态的,也就是说用户选了这个查询条件,才会生成这个占位符的。

Hibernate办不到。

还有人会说,我自己用Hibernate写一个框架,也可以做到,那你写的可能比Ibatis好,也可能差,你 要造轮子,谁来拦不着。

5. 调优

早期调优,有些Bad SQL,其实在code review阶段,只要看看Ibatis的SQL配置文件,就可以扼杀掉的 ,如果使用HSQL,可能不会被发现,因为它不仅隐藏在代码当中,有的时候,还需要程序跑起来,通过日 志打印出SQL或者通过其它工具如P6Spy来看的出来。

后期调优,既然是调优,我想就一定是遇到了瓶颈,可能要在库表上做冗余,可能要检查那些Bad SQL ,可能要修改代码,可能要动用DBA层次上的一些调优手段,那么调优越深入,Ibatis的优势就越能体现 出来,比如说增加临时表,中间表,增加冗余字段等。

时间: 2024-09-18 00:29:08

Ibatis VS Hibernate的相关文章

项目中使用了ibatis、hibernate时,怎么来控制事务

问题描述 现在的项目中使用了ibatis.hibernate然后在spring的配置文件里面配置<beanid="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><be

ibatis和hibernate 的优缺点

问题描述 ibatis和hibernate的优缺点 解决方案 解决方案二:呵呵!一直用的hibernate,没用过ibatis!解决方案三:引用1楼wangshiyang的回复: 呵呵!一直用的hibernate,没用过ibatis! 你out了解决方案四:Hibernate是ORM中间件MyBatis是SQL翻译中间件解决方案五:都用过,但是了解得不够深刻解决方案六:iBatis在以下情况中更显得适合,这时Hibernate甚至毫无办法:1.系统的部分或全部数据来自现有数据库,处于安全考虑,只

iBatis和Hibernate的对比

  我在最初的选型的时候是打算选择 Hibernate 的,在研究的过程中发现了 iBatis,经过 分析比较之后我选择了 iBatis.现在我已经使用 iBatis 完成了一个中小型的项目.这个 项目在性能.可维护性.可扩展性方面都非常令我满意. 在这个过程中我也不断的与使用过或者正在使用 Hibernate 的人进行过探讨.而且我本身 也在不断的跟进 Hibernate 的发展. 最终,我的结论是 iBatis 的选择非常正确,而且越用越喜欢它了. 当然了,我对 Hibernate 的理解还

Hibernate与IBatis的优缺点及可行性分析

1.优点 简单: 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现. 实用: 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供了dao框架,可以使我们更容易的开发和配置我们的dal层. 灵活: 通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多. 功能完整: 提供了连接管理,缓存支持,线程支持,(分布式)事物管理,通过配置作关系对象映射等数据访问层需要解决的问题.提供了dao支持,并在dao框架中封装了ado.net,H

从头到脚跟你解释什么是Hibernate

Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中).它解放了您,使您可以专注于应用程序的对象和功能,而不必担心如何保存它们或稍后如何找到它们. 大多数应用程序都需要处理数据.Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法.有时候,甚至在编写应用程序之前,数据

漫谈Hibernate的前世今生

Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中).它解放了您,使您可以专注于应用程序的对象和功能,而不必担心如何保存它们或稍后如何找到它们. 历史与背景 大多数应用程序都需要处理数据.Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法.有时候,甚至在编写应用程

在SCA Module中使用iBATIS框架实现数据持久层

在完成 SCA Module 建模后用 Java 对象进行实现时,采用 Hibernate 和采用 iBATIS 实现 SCA Module 的数据持久层,目的都是为 SDO 提供数据访问服务并加快 SCA 模块实现.前文已经讲过关于如何使用 Hibernate 实现 SCA Module 的数据持久层,本文将介绍 iBATIS 框架,比较 iBATIS 和 Hibernate 的异同,并以实例的方式介绍如何使用 iBATIS 实现 SCA Module 的数据持久层. iBATIS 是一种数据

Ibatis入门基本语法(转) good

Ibatis入门基本语法 一个项目中在写ibatis中的sql语句时,where user_id in (#user_id_list# ), 运行时总是不行,后来上网查了查,才知道这里不该用#,而应该用$,随即查了下#与$的区别. 总结如下: 1.#是把传入的数据当作字符串,如#user_id_list#传入的是1,2,则sql语句生成是这样,in ('1,2') ,当然不可以 2.$传入的数据直接生成在sql里,如$user_id_list$传入的是1,2,则sql语句生成是这样,in(1,2

系统-hibernate的关系映射和无关系型数据库

问题描述 hibernate的关系映射和无关系型数据库 小白问个问题: 在hibernate中有多对一.一对一.一对多.多对多这样的关系,只要在hbm.xml文件中配置了,那么去生产数据表的时候就会给表创建外键 这个很好理解,但是我目前在开发中,我发现很多成熟的系统数据库并没有外键,而且架构师提倡不用外键来管理,这样hibernate的关系设计是不是就不符合现在系统设计得需要了? 解决方案 在数据库里可以不设主键或者外键来使用hibernate进行逻辑上的关联.架构师不提倡是因为在对数据库进行增