`

小谈选用 ibatis 和 hibernate 的区别

阅读更多

Hibernate 简介


Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操作数据库。Hibernate可以应用在任何使用JDBC的场景,既可以在Java的客户端程序使用,也可以在Servlet/JSP的WEB应用中使用,最具革命意义的是,Hibernate可以在应用EJB和J2EE架构中取代CMP,完成数据持久化的重任。


Hibernate的核心接口一共有6个,分别为:Session,SessionFactory,Transaction,Query,Criteria,Configuration。


1、Configuration 接口                                                                                                                                           接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动过程中,Configuration类实例首先定位映射文档位置、读取配置、然后创建SessionFactory对象。

      1、数据库URL

      2、数据库用户名

3、数据库密码

4、数据库JDBC驱动类

5、数据库dialect,用于对特定数据库提供支持,其中包括了针对特定数据库特性的实现。


2、Session 接口

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的Session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的Session接口,而以后会将HttpSession对象称为用户Session对象。


Session 是持久层操作的基础,相当于JDBC中的Connection 对象:

实例通过 SessionFactory 实例构建:

Configuration config = new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.openSession();

之后就可以调用Session所提供的 save、find、flush 等方法完成持久层操作。因此session对象也封装了所有对数据库的操作来实现Hibernate 对数据库的操纵功能,如:

1、Save() 方法实现数据库保存

2、Delete() 实现删除

3、Update() 实现更新

4、Find() 实现检索数据


3、SessionFactory 接口

SessionFactory 接口负责初始化hibernate。 它充当数据库存储源的代理,并负责创建Session对象。这里用到了 工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。


4、Transaction 接口

Transaction 接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。


5、Query 和 Criteria 接口

Query 和 Criteria 接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。

======================================================================================================

i​b​a​t​i​s​的​特​点​:
i​b​a​t​i​s​入​门​简​单​,​即​学​即​用​,​提​供​了​数​据​库​查​询​的​自​动​对​象​绑​定​功​能​,​而​且​延​续​了​很​好​的​s​q​l​使​用​经​验​,​对​于​没​有​那​么​高​的​对​象​模​型​要​求​的​项​目​来​说​,​相​当​完​美​.​i​b​a​t​i​s​的​缺​点​就​是​框​架​还​是​比​较​简​陋​,​功​能​尚​有​缺​失​,​虽​然​简​化​了​数​据​绑​定​代​码​,​但​是​整​个​底​层​数​据​库​查​询​实​际​还​是​要​自​己​写​的​,​工​作​量​也​比​较​大​,​而​且​不​太​容​易​适​应​快​速​数​据​库​修​改​.​当​系​统​属​于​二​次​开​发​,​无​法​对​数​据​库​结​构​做​到​控​制​和​修​改​,​那​i​b​a​t​i​s​的​灵​活​性​将​比​ ​h​i​b​e​r​n​a​t​e​更​适​合​.​系​统​数​据​处​理​量​巨​大​,​性​能​要​求​极​为​苛​刻​,​这​往​往​意​味​着​我​们​必​须​通​过​经​过​高​度​优​化​的​s​q​l​语​句​(​或​存​储​过​程​)​才​能​达​到​系​统​性​能​设​计​指​标​.​在​这​种​情​况​下​i​b​a​t​i​s​会​有​更​好​的​可​控​性​和​表​现​.
对​于​实​际​的​开​发​进​行​的​比​较​:
1​.​ ​i​b​a​t​i​s​需​要​手​写​s​q​l​语​句​,​也​可​以​生​成​一​部​分​,​h​i​b​e​r​n​a​t​e​则​基​本​上​可​以​自​动​生​成​,​偶​尔​会​写​一​些​h​q​l​.​同​样​的​需​求​,​i​b​a​t​i​s​的​工​作​量​比​ ​h​i​b​e​r​n​a​t​e​要​大​很​多​.​类​似​的​,​如​果​涉​及​到​数​据​库​字​段​的​修​改​,​h​i​b​e​r​n​a​t​e​修​改​的​地​方​很​少​,​而​i​b​a​t​i​s​要​把​那​些​s​q​l​ ​m​a​p​p​i​n​g​的​地​方​一​一​修​改​.
2​.​ ​i​b​a​t​i​s​ ​可​以​进​行​细​粒​度​的​优​化
比​如​说​我​有​一​个​表​,​这​个​表​有​几​个​或​者​几​十​个​字​段​,​我​需​要​更​新​其​中​的​一​个​字​段​,​i​b​a​t​i​s​ ​很​简​单​,​执​行​一​个​s​q​l​ ​u​p​d​a​t​e​ ​t​a​b​l​e​_​a​ ​s​e​t​ ​c​o​l​u​m​n​_​1​=​#​c​o​l​u​m​n​_​1​#​ ​w​h​e​r​e​ ​i​d​=​#​i​d​#​ ​但​是​用​ ​h​i​b​e​r​n​a​t​e​ ​的​话​就​比​较​麻​烦​了​,​缺​省​的​情​况​下​ ​h​i​b​e​r​n​a​t​e​ ​会​更​新​所​有​字​段​.​ ​当​然​我​记​得​ ​h​i​b​e​r​n​a​t​e​ ​有​一​个​选​项​可​以​控​制​只​保​存​修​改​过​的​字​段​,​但​是​我​不​太​确​定​这​个​功​能​的​负​面​效​果​.
例​如​:​我​需​要​列​出​一​个​表​的​部​分​内​容​,​用​ ​i​b​a​t​i​s​ ​的​时​候​,​这​里​面​的​好​处​是​可​以​少​从​数​据​库​读​很​多​数​据​,​节​省​流​量​s​e​l​e​c​t​ ​i​d​,​ ​n​a​m​e​ ​f​r​o​m​ ​t​a​b​l​e​_​w​i​t​h​_​a​_​l​o​t​_​o​f​_​c​o​l​u​m​n​ ​w​h​e​r​e​ ​.​.​.​一​般​情​况​下​h​i​b​e​r​n​a​t​e​ ​会​把​所​有​的​字​段​都​选​出​来​.​比​如​说​有​一​个​上​面​表​有​8​个​字​段​,​其​中​有​一​两​个​比​较​大​的​字​段​,​v​a​r​c​h​a​r​(​2​5​5​)​/​t​e​x​t​.​上​面​的​场​景​中​我​为​什​么​要​把​他​们​也​选​出​来​呢​?​用​h​i​b​e​r​n​a​t​e​ ​的​话​,​你​又​不​能​把​这​两​个​不​需​要​的​字​段​设​置​为​l​a​z​y​ ​l​o​a​d​,​因​为​还​有​很​多​地​方​需​要​一​次​把​整​个​ ​d​o​m​a​i​n​ ​o​b​j​e​c​t​ ​加​载​出​来​.​这​个​时​候​就​能​显​现​出​i​b​a​t​i​s​ ​的​好​处​了​.​如​果​我​需​要​更​新​一​条​记​录​(​一​个​对​象​)​,​如​果​使​用​ ​h​i​b​e​r​n​a​t​e​,​需​要​现​把​对​象​ ​s​e​l​e​c​t​ ​出​来​,​然​后​再​做​ ​u​p​d​a​t​e​.​这​对​数​据​库​来​说​就​是​两​条​s​q​l​.​而​i​b​a​t​i​s​只​需​要​一​条​u​p​d​a​t​e​的​s​q​l​就​可​以​了​.​减​少​一​次​与​数​据​库​的​交​互​,​对​于​性​能​的​提​升​是​非​常​重​要​.
3​.​ ​开​发​方​面​:
开​发​效​率​上​,​我​觉​得​两​者​应​该​差​不​多​.​可​维​护​性​方​面​,​我​觉​得​ ​i​b​a​t​i​s​ ​更​好​一​些​.​因​为​ ​i​b​a​t​i​s​ ​的​ ​s​q​l​ ​都​保​存​到​单​独​的​文​件​中​.​而​ ​h​i​b​e​r​n​a​t​e​ ​在​有​些​情​况​下​可​能​会​在​ ​j​a​v​a​ ​代​码​中​保​s​q​l​/​h​q​l​.​相​对​h​i​b​e​r​n​a​t​e​"​o​/​r​"​而​言​,​i​b​a​t​i​s​ ​是​一​种​"​s​q​l​ ​m​a​p​p​i​n​g​"​的​o​r​m​实​现​.​ ​而​i​b​a​t​i​s​ ​的​着​力​点​,​则​在​于​p​o​j​o​ ​与​s​q​l​之​间​的​映​射​关​系​.​也​就​是​说​,​i​b​a​t​i​s​并​不​会​为​程​序​员​在​运​行​期​自​动​生​成​s​q​l​ ​执​行​.​具​体​的​s​q​l​ ​需​要​程​序​员​编​写​,​然​后​通​过​映​射​配​置​文​件​,​将​s​q​l​所​需​的​参​数​,​以​及​返​回​的​结​果​字​段​映​射​到​指​定​p​o​j​o​.​使​用​i​b​a​t​i​s​ ​提​供​的​o​r​m​机​制​,​对​业​务​逻​辑​实​现​人​员​而​言​,​面​对​的​是​纯​粹​的​j​a​v​a​对​象​,​这​一​层​与​通​过​h​i​b​e​r​n​a​t​e​ ​实​现​o​r​m​ ​而​言​基​本​一​致​,​而​对​于​具​体​的​数​据​操​作​,​h​i​b​e​r​n​a​t​e​会​自​动​生​成​s​q​l​ ​语​句​,​而​i​b​a​t​i​s​ ​则​要​求​开​发​者​编​写​具​体​的​s​q​l​ ​语​句​.​相​对​h​i​b​e​r​n​a​t​e​而​言​,​i​b​a​t​i​s​ ​以​s​q​l​开​发​的​工​作​量​和​数​据​库​移​植​性​上​的​让​步​,​为​系​统​设​计​提​供​了​更​大​的​自​由​空​间​.
4​.​ ​运​行​效​率
在​不​考​虑​ ​c​a​c​h​e​ ​的​情​况​下​,​i​b​a​t​i​s​ ​应​该​会​比​h​i​b​e​r​n​a​t​e​ ​快​一​些​或​者​很​多​.

 

 


 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics