出身
hibernate:出身于.NET(开发平台),现在已成为JBoss(类似于Tomcat服务器)的一部分。
mybatis:属于Apache(开发组织)的子项目。
简介
hibernate:对数据库提供了较为完整的封装,尤其是实体和表之间的映射,以及SQL的自动生成和执行。我们往往只需要定义实体和表的映射,即可通过hibernate提供的方法完成持久层操作,甚至我们不需要对SQL熟练掌握,hibernate会根据制定的储存逻辑,自动的生成对应的SQL,并调用JDBC接口加以执行。
mybatis: mybatis的着力点在于实体与表之间的映射,然后通过配置文件,将SQL所需的参数,以及返回的结果映射到指定的实体。
开发速度
hibernate: 学习成本大,掌握起来要比mybatis难,不易上手,支持的工具多,更新快,最高版本5.2,开发者无需关注sql语句的使用。
mybatis: 学习成本低,掌握相比hibernate简单,易上手,支持工具少,更新慢,最高版本3.4,开发者必须着力用sql语句。
调优方面
hibernate:1、制定合理缓存策略;2、尽量使用延迟加载;3、采用合理的session管理机制;4、使用批量抓取,设定合理的批处理参数;5、进行实体和表合理的映射。
mybatis: 1、session同hibernate的session生命周期一致,同样需要合理的session管理机制;2、同样有二级缓存机制,指定合理缓存策略;3、详细的sql优化设计。
SQL优化方面
hibernate: 默认查询会将所有的字段查询出来,这一点会消耗性能,也可以自己手写sql,但是这样就破坏了hibernate开发的简洁性。hibernate有自己的日志统计。
mybatis: 由于是手动编写的sql,所以可以按需求指定查询字段。mybatis本身不带日志统计,使用第三方采集日志,如:log4j。
扩展性方面
hibernate: 与数据库的关联只需在xml文件中配置即可,所用的hql语句与具体使用的数据库无关,移植性很好。
mybatis: 项目中所用的sql语句都是依赖所用的数据库,所以不同的数据库类型,支持的不是很好。
操作方面
hibernate: 开发者不需要理会底层数据库系统的细节,只需要关注对象的状态。hibernate对实体关联(多表查询)有着良好的机制,对于每一个关联关系都可以详细的设置是否延迟加载,并且提供关联查询,查询抓取,子查询抓取,批量抓取四种模式,他是详细配置和处理的。
mybatis: 开发者需要手动编写sql语句,需要对sql参数以及结果进行详细的管理。
缓存机制方面
hibernate: hibernate有一级(session缓存,默认开启),二级(sessionFactory缓存,又分为内置缓存和外置缓存,默认关闭),查询缓存(默认关闭)。
mybatis: mybatis有一级(session缓存,默认开启),二级缓存(sessionFactory缓存,默认关闭)。和spring集成后一级缓存会失效,二级缓存可能出现脏读。所以很难用。
相同点:
两者的二级缓存除了系统默认的配置外,都可以通过自定义或者使用第三方缓存方案。因为两者都是用session开启事物,执行sql,并且生命周期大致相同。
不同点:
hibernate: 二级缓存针对的是实体与表之间映射的缓存。如果因为缓存出现了脏读,系统会报出错误并提示。
mybatis: 二级缓存根据配置文件中namespace的命名来进行缓存,不同的namespace可以制定不同的缓存机制。因此用二级缓存容易有脏读,并且不会提示。
一句话总结
hibernate: 强大、方便、高效、复杂、间接、全自动化。
mybatis: 小巧、方便、高效、简单、直接、半自动化。