Spring Data JPA 和MyBatis比较

Posted cuiqq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data JPA 和MyBatis比较相关的知识,希望对你有一定的参考价值。

两种框架自己都用过一段时间,现在想总结一下各自适用的场景,部分比较取自群友分享

框架简介

Spring Data JPA是Spring Data的子模块。使用Spring Data,使得基于“repositories”概念的JPA实现更简单和容易。Spring Data JPA的目标是大大简化数据访问层代码的编码。作为使用者,我们只需要编写自己的repository接口,接口中包含一些个性化的查询方法,Spring Data JPA将自动实现查询方法。
JPA默认使用hibernate作为ORM实现,所以,一般使用Spring Data JPA即会使用hibernate。我们再看看hibernate的官方概念,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

比较

维度一:hibernate是面向对象的,而MyBatis是面向关系的

1.面向对象考虑的是对象的整个生命周期包括在对象的创建、持久化、状态的改变和行为等,对象的持久化只是对象的一种状态,而面向关系型数据库的概念则更关注数据的高效存储和读取;
2.面向对象更强调对象状态的封装性,对象封装自己的状态(或数据)不允许外部对象随意修改,只暴露一些合法的行为方法供外部对象调用;而关系型数据库则是开放的,可以供用户随意读取和修改关系,并可以和其他表任意的关联(只要sql正确允许的情况下);
3.面向对象试图为动态的世界建模,他要描述的是世界的过程和规律,进而适应发展和变化,面向对象总是在变化中处理各种各样的变化。而关系型模型为静态世界建模,它通过数据快照记录了世界在某一时候的状态,它是静态的。

维度二:从项目功能类型比较(这个真心需要JPA的高手哦,请定位清晰再参考)

数据分析型的OLAP应用适合用MyBatis,事务处理型OLTP应用适合用JPA。 
越是复杂的业务,越需要领域建模,建模用JPA实现最方便灵活。但是JPA想用好,门槛比较高,不懂DDD的话,就会沦为增删改查了。 
复杂的查询应该是通过CQRS模式,通过异步队列建立合适查询的视图,通过视图避免复杂的Join,而不是直接查询领域模型。 
从目前的趋势来看OLAP交给NoSQL数据库可能更合适

维度三:项目维护迭代维度比较(长期快速迭代类、变动较小的类型)

追求快速迭代,需求快速变更,灵活的 mybatis 修改起来更加方便,而且一般每一次的改动不会带来性能上的下降。JPA经常因为添加关联关系或者开发者不了解优化导致项目越来越糟糕(这里可能要考研功力了)。

个人总结(请参考上面一些维度,或者还有许多其它维度,总结自己的理解)

1.表关联较多的项目,优先使用mybatis

2.持续维护开发迭代较快的项目建议使用mybatis,因为一般这种项目需要变化很灵活,对sql的灵活修改要求较高

3.对于传统项目或者关系模型较为清晰稳定的项目,建议JPA(比如DDD设计中的领域层)

4.目前微服务比较火,基于其职责的独立性,如果模型清晰,可以考虑使用JPA,但如果数据量较大全字段返回数据量大的话可能在性能有影响,需要根据实际情况进行分析

以上是关于Spring Data JPA 和MyBatis比较的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA 和MyBatis比较

spring data jpa详解

Mybatis/Hibernate/Spring Data Jpa选型对比

markdown jdbc,jpa,spring data jpa,hibernate,mybatis区别

spring-data-jpa和mybatis可以整合在一起使用有啥优缺点

纯干货,Spring-data-jpa详解(转)