MyBatis和Hibernate有一些共同点,都为持久层框架。但Hibernate可以说是比较老旧的框架,这样讲的原因是虽然Hibernate有比较好的可移植性,而且对JDBC有较好的封装,便于使用SQL进行操作,但由于MySQL数据库只适用于中小企业,所以Hibernate的使用就有一定的局限性;相比于Hibernate,MyBatis对JDBC的封装程度没那么深,对开发人员的要求较高,但对大型数据库的优化和适配性较强,所以适用于处理大量数据。MyBatis和Hibernate两者的特点及对比,具体的不同可见如下:
首先从开发速度来比较,Mybatis其实要比Hibernate要更好上手,因为Hibernate是对JDBC的深度封装,而Mybatis就显得更加开放,而且简单易学。这也是Mybatis更加流行的原因,正因为如此,Mybatis的开发社区近年来也开始活跃起来,下载一些支持开发的工具也较为方便;Mybatis也有自己的代码生成工具,可以生成简单基本的DAO层方法,针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,尚学堂百战程序员陈老师指出开发者无需关心SQL的生成与结果映射,可以把更多的精力放在业务流程上。
在系统调优方面,Hibernate可以制定合理的缓存策略,在延迟加载方面处理得较好,有较为合理的Session管理机制,便于批量抓取,同时有合理的O/R映射设计。Mybatis在调优方面,同样有Session机制和二级缓存,同时还可以对SQL进行优化设计;Hibernate一般是查询数据库的所有字段,如果指定字段查询,程序较为繁琐,而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。虽然Hibernate具有自己的日志统计,但同样可以通过Log4j进行日志记录。
在对象管理方面,Hibernate 是完整的对象/关系映射解决方案,对象管理功能比较完善,使开发者不用再关注底层数据库系统的细节。也就是说,相对于常见的 JDBC/SQL 持久层方案中需要管理 SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。而MyBatis在这方面没有特定的文档说明,但也便于开发者发挥自身的想法来对对象进行管理。
在缓存机制方面,刚才已经提到过,Hibernate的一级缓存是Session缓存,一级缓存是与Session的生命周期相关的。而它的二级缓存是SessionFactory级的缓存其中可分为内置缓存和外置缓存,其中的内置缓存中存放了关于SessionFactory对象的一些集合属性包含的数据,包括映射元素据及预定SQL语句等;而Mybatis一般也可分为二级缓存,一级缓存是 SqlSession 级别的缓存二级缓存是 mapper 级别的缓存,多个 SqlSession 共享,而它默认状态是开启一级缓存,这样对开发者而言是一种便捷。但也有人指出,Mybatis的缓存机制在一定程度上限制了Mybatis的推广。以上就是对MyBatis和Hibernate两者的特点及对比,当然还有很多方面可以比较,今后会继续与大家分享。