Hibernate?br />
Hibernate是一个开放源代码的对象关pL框Ӟ它对JDBCq行了非常轻量的对象封装,使得JavaE序员可以随心所Ʋ的使用对象~程思维来操U|据库。Hibernate可以应用在Q何用JDBC的场合,既可以在Java的客LE序使用Q也可以在Servlet/JSP的Web应用中用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMPQ完成数据持久化的重仅R?
一、基本功?br />
Hibernate作ؓ数据持久化的中间Ӟ以让数据库在业务逻辑层开发中d眠。它通过可扩展标记语aQXMLQ实Ccd数据表之间的映射QɽE序员在业务逻辑的开发中面向数据库而改为面向对象开发。整个目开发分工更加明,提高了程序开发的效率?
configuration对象Q?
Configuration c负责管理Hibernate 的配|信息。Hibernate q行旉?br />
获取一些底层实现的基本信息Q其中几个关键属性包括:
1Q?数据库URL
2Q?数据库用?br />
3Q?数据库用户密?br />
4Q?数据库JDBC驱动c?br />
5Q?数据库dialectQ用于对特定数据库提供支持,其中包含了针对特定数据库Ҏ的实现Q如Hibernate数据cd到特定数据库数据cd的映等?
以上信息一般情况下由hibernate.cfg.xml或者hibernate.properties文g来配|,实现与不同数据库的连接?
Session对象Q?
Session是持久层操作的基Q相当于JDBC中的Connection:
实例通过SessionFactory实例构徏:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
之后我们可以调用Session所提供的save、find、flush{方法完成持久层操作。因此Session对象也封装了所有对数据库的操作来实现HibernateҎ据库的操U功能,如:
Save()Ҏ实现增加和保存;
Delete()Ҏ实现数据的删除;
Update()Ҏ实现数据更新和修改;
Find()Ҏ实现数据的检索;
Hibernate会根据不同的操作自动生成相应的SQL语句Q从而实CE序员对PO对象的操作{化ؓҎ据库关系表的操作?
二、用步?br />
1Q编写Hibernate配置文g
Hibernate配置文g有两U,分别是hibernate.cfg.xml文g和hibernate.properties,推荐使用hibernate.cfg.xml?
2QPO和映文?
使用middlegen和hibernate-extensions从数据库导出PO的映文Ӟq在hibernate.cfg.xml当中声明?
3Q编写DAO
Ҏ一张关p表~写一个DAOQ提供一l增、删、改、查Ҏ供业务逻辑Ҏ据库操作使用?
更多的细节请大家参阅hibernate的网站获取详l的信息。ƈ在各自的实践和开发中加深体会?br />
Ibatis?br />
相对Hibernate和Apache OJB {?一站式"ORM解决Ҏ而言Qibatis 是一U?半自动化"的ORM实现。所?半自?Q可能理解上有点生ӆ。纵观目前主的ORMQ无论Hibernate q是Apache OJBQ都Ҏ据库l构提供了较为完整的装Q提供了从POJO 到数据库表的全套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系Q即可通过Hibernate或者OJB 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟l掌握,Hibernate/OJB 会根据制定的存储逻辑Q自动生成对应的SQL q调用JDBC 接口加以执行?
Ibatis最直接的好处就是不但ؓE序员提供了对象与关pL据库之间的映,同时提供操作Ҏ与SQL间的直接影射Q设计者可以直接ؓ一个方法指定一条SQL语句Q从而取得更加准的数据Q同时ؓ优化查询、连接查询提供了方便?
一、基本功?br />
作ؓ又一个轻量的ORM中间Ӟibatis除了提供了对数据库基本的增、删、改、查外还提供了连接管理,~存支持Q线E支持,Q分布式Q事物管理等一套教为完整的数据库管理功能?
SqlMapClient对象是ibatis持久层操作的基础Q相当于hibernate中的sessionQ提供对SQL映射的方法?
insert()Ҏ实现Ҏ入SQL语句的映;
delete()Ҏ实现对删除SQL语句的映;
update()Ҏ实现Ҏ新SQL语句的媄;
queryForList()、queryForMap()、queryForObject()、queryForPaginatedList(){方法提供了一l查询SQL语句的媄;
二、用步?br />
1Qibatis SQL Map 配置文g
文g中对所用数据库的连接做了基本配|,包括数据库驱动类型、用户名、密码,以及q接池的相关理数据?
2QPO和映文?
和hibernate一PPO作ؓ数据库关p表的媄,也需要响应的映射配置文gQ可以手写,也可以借助hibernate的相兛_L成POQ不会媄响PO在ibatis中的使用。与hibernate不同的是Qibatis的映文件中没有对PO中每个属性做响应的描qͼ而是指定了一pd与PO有关的SQL相关操作Q也体现了ibatis良好的灵zL与可扩展性?
3Q编写DAO
在DAO中,可以使用SqlMapClient提供的方法来对应的指定对PO操作的SQL语句Q从而业务逻辑层的开发仍然是面向对象的操作?/p>
选择Hibernateq是iBATIS都有它的道理Q?br />
Hibernate的特点:
Hibernate功能强大Q数据库无关性好QO/R映射能力强,如果你对Hibernate相当_N,而且对Hibernateq行了适当的封装,那么你的目整个持久层代码会相当单,需要写的代码很,开发速度很快Q非常爽。以数据库字D一一对应映射得到的PO和Hibernteq种对象化映得到的PO是截然不同的Q本质区别在于这UPO是扁q_的,不像Hibernate映射的PO是可以表辄体的对象l承Q聚合等{关pȝQ这会直接影响C的整个Y件系l的设计思\。HibernateҎ据库l构提供了较为完整的装QHibernate的O/R Mapping实现了POJO 和数据库表之间的映射Q以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系Q即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟l掌握, Hibernate/OJB 会根据制定的存储逻辑Q自动生成对应的SQL q调用JDBC 接口加以执行。Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射Q在性能和对象模型之间如何权衡取得^衡,以及怎样用好Hibernate斚w需要你的经验和能力都很强才行,但是Hibernate现在已经是主O/R Mapping框架Q从文档的丰富性,产品的完善性,版本的开发速度都要ZiBATIS?br />
iBATIS的特点:
iBATIS入门单,卛_即用Q提供了数据库查询的自动对象l定功能Q而且延箋了很好的SQL使用l验Q对于没有那么高的对象模型要求的目来说Q相当完。iBATIS的缺点就是框架还是比较简陋,功能有~失Q虽然简化了数据l定代码Q但是整个底层数据库查询实际q是要自己写的,工作量也比较大,而且不太Ҏ适应快速数据库修改。当pȝ属于二次开?无法Ҏ据库l构做到控制和修?那iBATIS的灵zL将比Hibernate更适合。系l数据处理量巨大Q性能要求极ؓ苛刻Q这往往意味着我们必须通过l过高度优化的SQL语句Q或存储q程Q才能达到系l性能设计指标。在q种情况下iBATIS会有更好的可控性和表现?br />
对于实际的开发进行的比较Q?br />
1Q?iBATIS需要手写sql语句Q也可以生成一部分QHibernate则基本上可以自动生成Q偶会写一些Hql。同L需?iBATIS的工作量比Hibernate要大很多。类似的Q如果涉及到数据库字D늚修改QHibernate修改的地方很,而iBATIS要把那些sql mapping的地方一一修改?br />
2. iBatis 可以q行l粒度的优化
比如说我有一个表Q这个表有几个或者几十个字段Q我需要更新其中的一个字D,iBatis 很简单,执行一个sql UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是?Hibernate 的话比较麻烦了,~省的情况下 hibernate 会更新所有字Dc?当然我记?hibernate 有一个选项可以控制只保存修改过的字D,但是我不太确定这个功能的负面效果?
例如Q我需要列Z个表的部分内容,?iBatis 的时候,q里面的好处是可以少从数据库d多数据,节省量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...一般情况下Hibernate 会把所有的字段都选出来。比如说有一个上面表?个字D,其中有一两个比较大的字段Qvarchar(255)/text。上面的场景中我Z么要把他们也选出来呢Q用hibernate 的话Q你又不能把q两个不需要的字段讄为lazy loadQ因有很多地斚w要一ơ把整个 domain object 加蝲出来。这个时候就能显现出ibatis 的好处了。如果我需要更C条记录(一个对象)Q如果?hibernateQ需要现把对?select 出来Q然后再?update。这Ҏ据库来说是两条sql。而iBatis只需要一条update的sql可以了。减一ơ与数据库的交互Q对于性能的提升是非常重要?br />
3. 开发方面:
开发效率上Q我觉得两者应该差不多。可l护性方面,我觉?iBatis 更好一些。因?iBatis ?sql 都保存到单独的文件中。?Hibernate 在有些情况下可能会在 java 代码中保sql/hql。相对Hibernate“O/R”而言QiBATIS 是一U?#8220;Sql Mapping”的ORM实现?而iBATIS 的着力点Q则在于POJO 与SQL之间的映关pR也是_iBATISq不会ؓE序员在q行期自动生成SQL 执行。具体的SQL 需要程序员~写Q然后通过映射配置文gQ将SQL所需的参敎ͼ以及q回的结果字D|到指定POJO。用iBATIS 提供的ORM机制Q对业务逻辑实现人员而言Q面对的是纯_的Java对象Q这一层与通过Hibernate 实现ORM 而言基本一_而对于具体的数据操作QHibernate会自动生成SQL 语句Q而iBATIS 则要求开发者编写具体的SQL 语句。相对Hibernate而言QiBATIS 以SQL开发的工作量和数据库移植性上的让步,为系l设计提供了更大的自q间?br />
4. q行效率
在不考虑 cache 的情况下QiBatis 应该会比hibernate 快一些或者很多?br />

]]>