Mybatis和Spring Data JPA区别

MybatisSpring Data JPA区别

对于这个面试老常客,很多新手或者老司机对其不是很清楚,本篇文章将对于两者做一个介绍。

Spring Data JPA

在介绍Spring Data JPA之前需要了解几个概念,如下:

什么是JPA?

JPA规范本质上就是一种ORM规范,英文名称为: Java persistence api,是 Sun 官方提出的 Java 持久化规范

JPA所维护的核心是实体(Entity Bean),而它是通过一个持久化上下文(Persistence Context)来使用的。持久化上下文包含了以前3个部分:

  • • 对象关系映射(Object Relational Mapping,简称ORM)描述,JPA支持注解或XML两种形式的描述。

  • • 实体操作API,内置通用CRUD操作,来完成对象的持久化与查询。

  • • 查询语言,约定了面向对象的查询语句JPQL。

什么是hibernate?

Hibernate是Java中的对象关系映射解决方案。对象关系映射或ORM框架是将应用程序数据模型对象映射到关系数据库表的技术。Hibernate 不仅关注于从 Java 类到数据库表的映射,也有 Java 数据类型到 SQL 数据类型的映射。实现了JPA规范。

JPA和Hibernate的关系:

• JPA是一个规范,而不是框架

• Hibernate是JPA的一种实现,是一个框架

• JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate是一种JPA实现

什么是Spring Data?

Spring Data是Spring 社区的一个子项目,主要用于简化数据(关系型&非关系型)访问,其主要目标是使得数据库的访问变得方便快捷。

• 它提供很多模板操作

– Spring Data ElasticSearch

– Spring Data MongoDB

– Spring Data Redis

– Spring Data Solr

• 强大的 Repository 和定制的数据储存对象的抽象映射

• 对数据访问对象的支持

什么是Spring Data JPA?

spring Data JPA是在实现了JPA规范的基础上封装的一套 JPA 应用框架,虽然ORM框架都实现了JPA规范,但是在不同的ORM框架之间切换仍然需要编写不同的代码,而使用Spring Data JPA能够方便大家在不同的ORM框架之间进行切换而不需要更改代码。Spring Data JPA旨在通过将统一ORM框架的访问持久层的操作,来提高开发人的效率。

Mybatis和Spring Data JPA区别
img

Spring Data JPA和Hibernate的关系

Hibernate其实是JPA的一种实现,而Spring Data JPA是一个JPA数据访问抽象。也就是说Spring Data JPA不是一个实现或JPA提供的程序,它只是一个抽象层,主要用于减少为各种持久层存储实现数据访问层所需的样板代码量。但是它还是需要JPA提供实现程序,其实Spring Data JPA底层就是使用的 Hibernate实现

总结就是:

• Hibernate是JPA的一种实现,是一个框架

• Spring Data JPA是一种JPA的抽象层,底层依赖Hibernate

什么是MyBatis?

MyBatis源于Apache的一个开源项目 iBatis。2002年,Clinton Begin开发了iBatis框架,并引入了SQL映射作为持久化层开发的一种方法,不久后Clinton Begin将 iBatis捐献给Apache 软件基金会。2010年,这个项目由Apache迁移到了Google Code,并改名为MyBatis。2013年11月,MyBatis迁移到目前最大的源代码托管平台 Github。MyBatis是一款在持久层使用的 SQL 映射框架,可以将SQL 语句单独写在 XML 配置文件中,或者使用带有注解的 Mapper 映射类来完成数据库记录到 Java实体的映射。与另一款主流的ORM框架 Hibernate 不同,MyBatis属于半自动的ORM框架,它虽然不能将不同数据库的影响隔离开,仍然需要自己编写SQL 语句,但是可以灵活地控制SQL 语句的构造,将SQL 语句的编写和程序的运行分离开,使用更加便捷,与其他的ORM(对象关系映射)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。

Mybatis的关注点在于:

  • • SQL与POJO的映射,或者说查询结果集与POJO的映射

  • • 数据的高效存储于读写

  • • 可定制化SQL,支持原生SQL

可以从以下几个维度做区分

维度一: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,但如果数据量较大全字段返回数据量大的话可能在性能有影响,需要根据实际情况进行分析。


原文始发于微信公众号(Rockey小何同学):Mybatis和Spring Data JPA区别

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/251646.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!