- hibernate不适合多表关联查询,对开发人员要求高,真正产品级应用上要用到Hibernate。hibernate封装的功能和特性比较多,故hibernate的掌握要比Mybatis来得难。
- Hibernate制定合理的缓存策略,尽量使用延迟加载的特性,采用合理的Session管理机制,使用批量抓取,设定合理的批处理参数(batch_size),进行合理的O/R映射设计;Mybatis在Session方面和Hibernate的Session的生命周期是一致的,同样需要合理的Session管理机制。Mybatis同样具有二级缓存机制。Mybatis可以进行详细的SQL优化设计。
- Hibernate的查询会将表中的所有字段查询出来,这一点会有性能的消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发简洁性。Mybatis的SQL是手动编写的,所以可以按需求查询指定的字段。Hibernate是使用封装好的,通用的SQL来应对所有场景。Mybatis是针对相应的场景来设计SQL。Mybatis的SQL会更灵活,可控性更好。
- Hibernate与具体数据库的关联只需要在XML文件中配置即可,所有的hql语句与具体使用的数据库无关,移植性很好。Mybatis项目中所有的SQL都是依赖所使用的数据库的,故移植性比较差。
- Hibernate是在JDBC上进行一次封装。Mybatis是基于原生的JDBC。Mybatis有运行速度上的优势。
- Hibernate提供了很多的功能和特性,要完全掌握非常难;Mybatis自身功能有限,但Mybatis支持plugin,可以使用开源的plugin来扩展功能。
- Mybatis mapper xml支持动态SQL;Hibernate不支持。
- Hibernate和Mybatis都有相应的生成代码的工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL生成与结果映射,可以更加关注业务流程
- 如果又千万级别的表,有单次业务大批量数据提交的需求(百万条及以上)尤其不建议使用Hibernate。有单次业务大批量读取需求(百万条及以上)不建议使用Hibernate多表查询,此时Hibernate多表查询比较费劲,用不好很容易造成性能问题。
- 主要业务表的关联超过20个,不建议使用hibernate
- 开发人员多数不是多年使用hibernate时,建议使用mybatis
- 如果项目要求对于数据库可控性好,可深度调优,用Mybatis
- hibernate只适用场景不太复杂,要求性能不太苛刻的时候;Mybatis拥有动态列,动态表名,同时提供了简易的缓存,日志,级联,但是它的缺陷是需要提供映射规则和sql,所以开发工作量比Hibernate大一些。
- JPA是一套规范,内部是有接口和抽象类组成的。hibernate是一套成熟的ORM框架,Hibernate实现了JPA规范,所以也可以称hibernate是JPA的一种实现方式,我们使用JPA的API编程,其实就是面向接口编程。
- Spring Data JPA 是spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。可使开发者用极简的代码实现对数据库的访问操作。它提供了包括增删改查等在内的常用功能,易于扩展。使用 Spring Data JPA可以极大提高开发效率。推荐使用Spring Data JPA+ORM(hibernate或则Mybatis),使数据库层操作更加简单,方便解耦。