iBatis2实体状态图解

  1. 云栖社区>
  2. 博客>
  3. 正文

iBatis2实体状态图解

技术小阿哥 2017-11-14 10:36:00 浏览619
展开阅读全文
环境:
iBatis2、Hibernate3、Java5
 
大名鼎鼎的iBatis和Hibernate齐名为ORM持久化的两大英雄。相比来说,Hibernate是重量级的,iBatis是轻量级的。
 
与Hibernate相似,iBatis也是通过实体对象来操作数据的,iBatis的实体对象也有三种状态:临时态、持久化态、游离态。只是在概念上,iBatis不怎么区别这个,因为iBatis没有hibarnate复杂。
 
为了说明iBatis的状态,请看下面的简图:
 
1、临时态:实体刚被new出来。
2、持久化态:用实体对象作为参数调用了insert方法。此时,如果,实体对象对应的表为自增的,则插入后,表的主键会回填到此实体中。这样,在保存后,不但可以返回一个持久化的实体,也可以返回新增记录的id。
3、游离态:对象持久化后,连接关闭,对象不和任何的连接有关系了。这时候,持久化态的对象就转变为游离态。游离态的对象可以通过update方法,重新持久化。
 
从中可以发现,iBatis尽可能少的去维护内存中实体对象的状态,对于内存中实体对象的状态,iBatis仅维护从临时态到持久化态的实体对象。也就是说,从临时态的实体持久化后,iBatis会回填实体的id字段,以保证实体对象状态的“可持续”使用。因为我们在保存一个对象后,往往需要立即得到该对象,并做进一步处理,或用到别处,这样可以选择返回该实体对象或者返回其id。
 
相对于Hibernate,Hibernate维护了实体关系的个个状态,Hibernate基本的API接口中都是以对象为参数的。为了维护状态的统一,Hibernate内部对对象的状态的管理也做得相当复杂。Hibernate能在其所有对实体的操作上,保持实体对象状态在内存中的正确性。
 
但是iBatis不然,比如,一个对象被getById()找到了得到一个entity,但是接着又进行了一个deleteById()操作,这时候,先前被查询出来的entity实体对象中的id不会因为调用deleteById()而自动消失,但Hibernate是可以的。
 
在Hibernate和iBatis中,很难说出个孰优孰劣,因为复杂方便的同时带来了性能的消耗。iBatis的做法是将钢用到刀刃上。
 
另外,为了对比Hibernate的持久化的状态图,我引用一个博友的图吧(用的仅仅是连接):
 
 
 
总结:
玩ORM,熟悉ORM对实体对象的管理方式是非常重要的。用贯了Hibernate的开发者,在转向iBatis的时候尤其应该注意这些差别。另外反复强调一点,iBatis在insert一个对象后,可以返回新增记录的id,也可以返回持久化对象。因为这是iBatis对内存对象状态所做的唯一的同步管理。

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/106953,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注