Mybatis具有较高的灵活性,通过灵活的sql语句可以实现按需查询,查询字段比较干净,直接关联到映射对象。
Hibernate具有较高的封装机制,良好的对象映射机制,hibernate为了保证POJO的数据完整性,需要将关联的数据加载,需要额外地查询更多的数据。,这一点比Mybatis有性能消耗。但Hibernate具有更高的开发简洁性。
myBatis相对Hibernate 等封装较为严密的ORM 实现而言,因为hibernate对数据对象的操作实现了较为严密的封装,可以保证其作用范围内的缓存同步,而ibatis 提供的是半封闭的封装实现,因此对缓存的操作难以做到完全的自动化同步。从这里引出Hibernate的独有的四种对象状态,1、临时状态,2、持久化状态(托管状态),3、删除状态,4、游离状态(也称脱管状态)
临时状态:表示对象和数据库没有关联,id为null,不存在session的缓存中,在数据库中没有对应的记录,一般是指new 出来的对象。
持久化状态:id不为null,位于session的缓存中,持久化对象和数据库中的相关记录对应。session在flush缓存时,会把对象的状态更新到数据库对应的记录中
删除状态:在数据库中已经没有和其id对应的记录,不存在session缓存中
游离状态:id不为null,但不存在session缓存中,一般情况下,由持久化对象转换过来,数据库中可能还有其对应的记录。
从上面的四个状态中,我们可以知道,到对象处于持久化状态时,对象属性值发生改变时,Hibernate就会自动提交对象状态。这就需要我们在开发时注意了。当需要改变对象的状态,有不希望把对象的状态提交到数据库时,要么转换对象的状态,要么创建一个vo对象(临时对象),把持久化对象的属性赋值给对应的vo对象,对vo对象进行操作。