1、Hibernate
HIbernate是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操作数据库,Hibernate可以应用在任何使用JDBC的场合,即可以在Java的客户端程序使用,也可以再Servlet、Jsp的weby应用中使用,最具有革命意义的是,Hibernate可以再应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
1.1、基本功能
Hibernate作为数据持久化的中间件,足以让数据在业务逻辑层开发中去冬眠,它通过扩展标记语言(XML)实现了类和数据表之间的映射,使得程序员在业务逻辑的开发中面向数据库而改为面向对象,使得整个项目开发分工更加明确,提高了程序开发的效率。
Configuration对象:
Configuration类负责管理Hibernate的配置信息,Hibernate运行时需要获取一些底层实现的基本信息,其中几个关键属性包括:
- 数据库URL
- 数据库用户
- 数据库用户密码
- 数据库JDBC驱动类
- 数据库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对象的操作转化为数据库关系表的操作。
1.2、使用步骤
- 编写Hibernate配置文件
Hibernate配置文件有两种,分别是hibernate.cfg.xml文件和Hibernate.properties,推荐使用hibernate.cfg.xml
- PO和映射文件
使用middlegen和hibernate-extensions从数据库导出PO的映射文件,并在hibernate.cfg.xml文件中声明。
- 编写DAO
对每一张关系表编写一个DAO,提供一组增、删、改、查方法供业务逻辑对数据库操作使用。
2、iBATIS
相对于Hibernate和Apache OJB等一站式ORM解决方案而言,ibatis是一种半自动化的ORM实现,所谓半自动,可能理解上有点生涩,纵观目前主流的ORM,无论Hibernate还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全套映射机制,程序员往往只需要定义好了POJO到数据库映射关系,即可通过Hibernate或者OJB提供的方法完成持久层操作,程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL,并调用JDBC接口加以执行。
ibatis最直接的好处是不但为程序员提供了对象与关系数据库之间的映射,同时提供操作方法与SQL间的直接映射,设计者可以直接为一个方法指定一条SQL语句,从而取得更加准确的数据,同时为优化查询、连接查询提供了方便。
2.1、基本功能
作为又一个轻量级的ORM中间件,ibatis除了提供了对数据库的基本的增、删、改、查之外还提供了连接管理、缓存支持、线程支持、分布式事务管理等一套较为完整的数据库管理功能。
SqlMapClient对象时ibatis持久层操作的基础,相当于Hibernate的Session,提供对SQL映射的方法。
insert()方法实现对插入SQL语句的映射。
delete()方法实现对删除SQL语句的映射。
update()方法实现对更新SQL语句的映射。
queryForList()、queryForMap()、queryForObject()、queryForPaginatedList()等方法提供了一组查询SQL语句的映射。
2.2、使用步骤
- ibatis SQL Map配置文件
文件中对所用数据库的连接座了基本配置,包括数据库驱动类型、用户名、密码、以及连接池相关的管理数据
- PO和映射文件
和hibernate一样,PO作为数据库关系表的映射,也需要响应的映射配置文件,可以手写,也可以借助hibernate的相关工具生成PO,不会影响在ibatis中使用,与hibernate不同的是,ibatis的映射文件中没有对PO中每个属性做响应的描述,而是指定了一系列与PO有关的SQL相关操作,也体现了ibatis良好的灵活性与扩展性。
- 编写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开发的工作量和数据库迁移性上让步,为系统设计提供了更大的自由空间。
3、二者对比
1、ibaits非常简单易学、hibernate相对较为复杂,门槛较高
2、二者都是优秀的开源产品
3、当系统属于二次开发,无法对数据库结构做到控制和修改,那么ibatis的灵活性将比hibernate更合适。
4、系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或者存储过程)才能达到系统性能设计指标,在这种情况下ibatis会有更好的可控性和表现。
5、ibatis需要手动写sql语句,也可以生成一部分,hibernate则基本上可以自动生成,偶而写一些sql,同样的需求,ibatis的工作量比hibernate要大的多,类似的,如果设计到数据库字段的修改,hibernate修改的地方很少,而ibatis要把那些sql mapping的地方一一修改。
6、以数据库字段--对应映射得到的PO和Hibernate这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路、
7、hibernate现在已经是主流的O/R Mapping框架,从文档的丰富性、产品的完善性、版本的开发速度都要强于ibatis.