iBatis和Hibernate浅析

iBatis和Hibernate浅析

Hibernate程序员

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了很是轻量级的对象封装,使得Java程序员能够为所欲为的使用对象编程思惟来操纵数据库。Hibernate能够应用在任何使用JDBC的场合,既能够在Java的客户端程序使用,也能够在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate能够在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。sql

1、基本功能数据库

Hibernate做为数据持久化的中间件,足以让数据库在业务逻辑层开发中去冬眠。它经过可扩展标记语言(XML)实现了类和数据表之间的映射,使程序员在业务逻辑的开发中面向数据库而改成面向对象开发。使整个项目开发分工更加明确,提升了程序开发的效率。 
configuration对象:编程

Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时须要缓存

获取一些底层实现的基本信息,其中几个关键属性包括:session

1. 数据库URL架构

2. 数据库用户app

3. 数据库用户密码框架

4. 数据库JDBC驱动类分布式

5. 数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。以上信息通常状况下由hibernate.cfg.xml或者hibernate.properties文件来配置,实现与不一样数据库的链接。

Session对象:

Session是持久层操做的基础,至关于JDBC中的Connection:

实例经过SessionFactory实例构建:

Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();

以后咱们就能够调用Session所提供的save、find、flush等方法完成持久层操做。所以Session对象也封装了全部对数据库的操做来实现Hibernate对数据库的操纵功能,如:

Save()方法实现增长和保存;

Delete()方法实现数据的删除;

Update()方法实现数据更新和修改;

Find()方法实现数据的检索; ……

Hibernate会根据不一样的操做自动生成相应的SQL语句,从而实现了程序员对PO对象的操做转化为对数据库关系表的操做。

2、使用步骤

1.编写Hibernate配置文件

Hibernate配置文件有两种,分别是hibernate.cfg.xml文件和hibernate.properties,推荐使用hibernate.cfg.xml。

2.PO和映射文件

使用middlegen和hibernate-extensions从数据库导出PO的映射文件,并在hibernate.cfg.xml当中声明。

3.编写DAO

对每一张关系表编写一个DAO,提供一组增、删、改、查方法供业务逻辑对数据库操做使用。

iBATIS

相对Hibernate和Apache OJB 等"一站式"ORM解决方案而言,ibatis 是一种"半自动化"的ORM实现。所谓"半自动",可能理解上有点生涩。纵观目前主流的ORM,不管Hibernate 仍是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全套映射机制。程序员每每只需定义好了POJO 到数据库表的映射关系,便可经过Hibernate或者OJB 提供的方法完成持久层操做。程序员甚至不须要对SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。 
Ibatis最直接的好处就是不但为程序员提供了对象与关系数据库之间的映射,同时提供操做方法与SQL间的直接影射,设计者能够直接为一个方法指定一条SQL语句,从而取得更加准确的数据,同时为优化查询、链接查询提供了方便。

1、基本功能

做为又一个轻量级的ORM中间件,ibatis除了提供了对数据库基本的增、删、改、查外还提供了链接管理,缓存支持,线程支持,(分布式)事物管理等一套教为完整的数据库管理功能。

SqlMapClient对象是ibatis持久层操做的基础,至关于hibernate中的session,提供对SQL映射的方法。

insert()方法实现对插入SQL语句的映射;

delete()方法实现对删除SQL语句的映射;

update()方法实现对更新SQL语句的影射;

queryForList()、queryForMap()、queryForObject()、queryForPaginatedList()等方法提供了一组查询SQL语句的影射;

2、使用步骤

1.ibatis SQL Map 配置文件

文件中对所用数据库的链接作了基本配置,包括数据库驱动类型、用户名、密码,以及链接池的相关管理数据。

2.PO和映射文件

和hibernate同样,PO做为数据库关系表的影射,也须要响应的映射配置文件,能够手写,也能够借助hibernate的相关工具生成PO,不会影响PO在ibatis中的使用。与hibernate不一样的是,ibatis的映射文件中没有对PO中每一个属性作响应的描述,而是指定了一系列与PO有关的SQL相关操做,也体现了ibatis良好的灵活性与可扩展性。

3.编写DAO

在DAO中,可使用SqlMapClient提供的方法来对应的指定对PO操做的SQL语句,从而使业务逻辑层的开发仍然是面向对象的操做。

相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。

Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员每每只需定义好了POJO 到数据库表的映射关系,便可经过Hibernate 提供的方法完成持久层操做。程序员甚至不须要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。

而iBATIS 的着力点,则在于POJO 与SQL之间的映射关系。也就是说,iBATIS并不会为程序员在运行期自动生成SQL 执行。具体的SQL 须要程序员编写,而后经过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。使用iBATIS 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这一层与经过Hibernate 实现ORM 而言基本一致,而对于具体的数据操做,Hibernate会自动生成SQL 语句,而iBATIS 则要求开发者编写具体的SQL 语句。相对Hibernate而言,iBATIS 以SQL开发的工做量和数据库移植性上的让步,为系统设计提供了更大的自由空间。

两者的对比:

1.iBATIS很是简单易学,Hibernate相对较复杂,门槛较高。

2.两者都是比较优秀的开源产品

3.当系统属于二次开发,没法对数据库结构作到控制和修改,那iBATIS的灵活性将比Hibernate更适合

4.系统数据处理量巨大,性能要求极为苛刻,这每每意味着咱们必须经过通过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种状况下iBATIS会有更好的可控性和表现。

5.iBATIS须要手写sql语句,也能够生成一部分,Hibernate则基本上能够自动生成,偶尔会写一些Hql。一样的需求,iBATIS的工做量比Hibernate要大不少。相似的,若是涉及到数据库字段的修改,Hibernate修改的地方不多,而iBATIS要把那些sql mapping的地方一一修改。

6.以数据库字段一一对应映射获得的PO和Hibernte这种对象化映射获得的PO是大相径庭的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是能够表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。

7.Hibernate如今已是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS

8.最关键的一句话是iBATIS的做者说的:

If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.

If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy.

选择Hibernate仍是iBATIS都有它的道理:

Hibernate功能强大,数据库无关性好,O/R映射能力强,若是你对Hibernate至关精通,并且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会至关简单,须要写的代码不多,开发速度很快,很是爽。

Hibernate的缺点就是学习门槛不低,要精通门槛更高,并且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面须要你的经验和能力都很强才行。

iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,并且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来讲,至关完美。

iBATIS的缺点就是框架仍是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,可是整个底层数据库查询实际仍是要本身写的,工做量也比较大,并且不太容易适应快速数据库修改。
个人建议就是:

若是你的团队没有Hibernate高手,那么请用iBATIS,要把Hibernate用好,并不容易;不然你应该选择Hibernate,那样你的开发速度和代码简洁性都至关棒!

BTW:

rails的ActiveRecord是平衡性作的最好的,避免了Hibernate的复杂性和学习HQL的成本,同时具有iBATIS即学即用的简单性。

iBatis和Hibernate的较量其实就是他们之间的一个简单的比较,不知道你在实际应用中有没有发现其余别的区别和联系。

相关文章
相关标签/搜索