Mybatis和Hibernate

来源:互联网 发布:大学取消事业编制 知乎 编辑:程序博客网 时间:2024/05/16 05:08
一、简介
二者都是O/R mapping框架。
1、Hibernate
Hibernate框架对数据库提供了较为完整的封装,实现了POJO(Plain Ordinary Java Object:简单的Java对象,或者叫普通的JavaBean,是为了避免和EJB混淆所创造的简称)和数据库表之间的映射,以及sql的自动生成和执行。程序员往往只需要定义好了POJO到数据库表的映射关系,即可以通过Hibernate提供的方法完成操作。Hibernate/OJB会根据制定的存储逻辑,自动生成对应的sql并调用JDBC接口加以执行。
2、Mybatis
Mybatis的着力点则在于POJO与sql之间的映射关系,通过映射配置文件,将sql所需的参数以及返回的结果字段映射到指定的POJO。
相对于Hibernate的“O/R”而言,Mybatis是一种“Sql Mapping”的ORM实现。
二、系统调优对比
1、Hibernate常用的调优方案:
1)制定合理的缓存策略;
2)尽量使用延迟加载特性;
3)采用合理的Session管理机制;
4)使用批量抓取,设定合理的批处理参数(batch_size);
5)进行合理的O/R映射设计。
2、Mybatis常用的的调优方案:
1)制定合理的缓存策略;
2)采用合理的Session管理机制;
3)进行sql优化设计。
Mybatis在Session方面和Hibernate的Session生命周期是一致的,同样也有二级缓存机制。
三、sql优化方面
1、Hibernate的sql优化:
1)Hibernate的查询会将表中所有的字段查询出来,这一点会有性能损耗;
2)Hibernate也可以自己写sql来制定要查询的字段,但这样就破坏了Hibernate开发的简洁性;
3)Hibernate的HQL语句调优需要将sql打印出来,调整不方便,不直观;
4)Hibernate有自己完整的日志统计,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;
2、Mybatis的sql优化:
1)Mybatis的sql是手动编写的,可以按需求指定查询的字段,调整直观方便;
2)Mybatis本身不带日志统计。
四、扩展性方面
1、Hibernate与具体数据库的关联只需在xml文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好;
2、Mybatis项目中所有的sql语句都是依赖所用的数据库,因此对不同类型数据库的支持不好。
五、对象管理与抓取策略
1、对象管理
Hibernate是完整的对象/关系映射解决方案,它提供了对象状态管理的功能,是开发者不再需要理会底层数据库系统的细节。相对于常见的JDBC/SQL持久层方案中需要管理sql语句而言,Hibernate采用了更自然的面向对象的视角来持久化Java中应用的数据;
Mybatis在对象管理上没有详细的解决方案,需要用户自己对对象进行管理。
2、抓取策略
Hibernate对实体关联对象的抓取有良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式,它是详细配置和处理的;
Mybatis的延迟加载时全局配置的。
六、缓存机制
各自的详细介绍见《磁盘缓存、Hibernate缓存、Mybatis缓存》
1、相同点
Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,还可以通过实现自己的缓存或者采用第三方缓存方案,创建适配器来完全覆盖缓存行为。
2、不同点
1)Hibernate的二级缓存在Session Factory生成的配置文件中进行详细配置,然后再具体的表-对象映射中配置是哪种缓存;
Mybatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过cache-ref来实现。
2)因为Hibernate对查询对象有着良好的管理机制,用户无需关心sql,所以在使用二级缓存时如果出现脏数据,系统会报错;
Mybatis在使用二级缓存时需要特别小心,如果不能完全确定数据更新操作的波及范围,需避免cache的盲目使用,否则,脏数据的出现会给系统的正常运行带来很大的隐患。
七、两个框架对比总结
1、相同点
1)Hibernate和Mybatis都可以通过SessionFactoryBuilder由xml配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session来开启执行事务和sql语句。二者的SessionFactoryBuilder、SessionFactory、Session的生命周期都差不多;
2)Hibernate和Mybatis都支持JDBC和JTA事务处理。
2、优势
Hibernate优势
1)Hibernate数据库无关性好,O/R映射能力强,Mybatis需要维护sql和结果映射;
2)Hibernate对对象的维护和缓存要比Mybatis好,对增删改查的对象的维护要方便;
3)Hibernate数据库移植性很好,Mybatis的数据库移植性不好,不同的数据库需要写不同的sql;
4)Hibernate有更好的二级缓存,Mybatis本身提供的缓存机制不佳。
Mybatis优势
1)Mybatis可以进行更为细致的sql优化,可以减少查询字段;
2)Mybatis容易掌握,Hibernate门槛较高。


0 0
原创粉丝点击