Spring Data JPA、 MyBatis与Hibernate简单对比

整体参考:

https://blog.youkuaiyun.com/xihuanyuye/article/details/81201441

详细参考:

https://blog.youkuaiyun.com/qq897958555/article/details/53208002

1.Spring Data JPA与Hibernate

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程序员可以随心所欲的使用对象编程思维来操纵数据库。

2.MyBatis

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

主要比较Hibernate与Mybatis:

1.概念:

Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。着力点对象与对象之间关系

Mybatis:MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。着力于POJO与SQL之间的映射关系

(Spring Data:Spring Data:是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。)

从表面上看,Hibernate能方便、自动化更强,而MyBatis 在Sql语句编写方面则更灵活自由。如果更上一个抽象层次上看,对于数据的操作,Hibernate是面向对象的,而MyBatis是面向关系的。

2.面向对象与面向关系型模型

A.面向对象致力于解决计算机逻辑问题,而关系模型致力于解决数据的高效存取问题。

 

我们不妨对比一下面向对象的概念原则和关系型数据库的不同之处:

B.面向对象考虑的是对象的整个生命周期包括在对象的创建、持久化、状态的改变和行为等,对象的持久化只是对象的一种状态,而面向关系型数据库的概念则更关注数据的高效存储和读取

C.面向对象更强调对象状态的封装性,对象封装自己的状态(或数据)不允许外部对象随意修改,只暴露一些合法的行为方法供外部对象调用;而关系型数据库则是开放的,可以供用户随意读取和修改关系,并可以和其他表任意的关联(只要sql正确允许的情况下);

D.面向对象试图为动态的世界建模,他要描述的是世界的过程和规律,进而适应发展和变化,面向对象总是在变化中处理各种各样的变化。而关系型模型为静态世界建模,它通过数据快照记录了世界在某一时候的状态,它是静态的。

 

从上面两者基本概念和思想的对比来看,可以得出结论Hibernate和MyBatis两个框架的侧重点完全不同。

3、选型及使用思路

使用两个框架时候的时候,注意最佳的步骤和流程:

Hibernate的一般使用步骤如下:

1、分析、抽象和归纳出系统中的业务概念,并梳理出各个业务概念之间的关系——创建概念模型;
2、根据概念模型,进一步细化设计系统中的对象类以及类的依赖关系——创建设计模型;
3、将设计好的类映射到数据库的表和字段配置好;
4、Hibernate可以根据配置信息自动生成数据库表,这个时候也可以集中精力去梳理一下表关系,看看表结构是否合理,并适当调整一下类和表的映射关系,重新生成表结构;

完成以上步骤,基本上完成了体统中主要的业务概念类和表结构的设计工作,只是完成表结构设计的出发点事如何持久化系统的对象,同时兼顾数据库表、字段、字段类型、表的关联关系的合理性和合规性,而不是单纯表设计。这两者思考和关注点还是有很大差别的。另外,需要说明一点,这只是使用hibernate的最通用步骤,实际操作过程中还是需要根据具体项目情况来安排。

MyBatis使用步骤:

而MyBatis对于面向对象的概念强调比较少,更适用于灵活的对数据进行增、删、改、查,所以在系统分析和设计过程中,要最大的发挥MyBatis的效用的话,一般使用步骤则与Hibernate有所区别:

1、综合整个系统分析出系统需要存储的数据项目,并画出E-R关系图,设计表结构;
2、根据上一步设计的表结构,创建数据库、表;
3、编写MyBatis的SQL 映射文件、Pojos以及数据库操作对应的接口方法;

通过上面的使用步骤我们可以看出MyBatis更适合于面向关系(或面向数据、或面向过程)的系统设计方法,这样的系统一般称为“事务脚步”系统(事务脚步(Transaction Script) 出自Martin Fowler 2004年所著的企业应用架构模式(Patterns of Enterprise Application Architecture))。而hibernate(也可以说Spring Data JPA)更适合于构建领域模型类的系统。

 

参考:https://blog.youkuaiyun.com/qq897958555/article/details/53208002

得到最重要的区别,我们看一下其他的区别:

1.查询区别:

简单查询:

Hibernate 提供了基础的查询方法,也可以根据具体的业务编写相应的SQL;

Mybatis需要手动编写SQL语句;

Spring Data 继承基础接口,可使用内置的增删改查方法。

高级查询:

Hibernate通过对象映射机制,开发者无需关心SQL的生成与结果映射,专注业务流程;

Mybatis需要通过手动在XML文件中编写SQL语句以及ResultMap或者注解;

Spring Data 提供了命名规范查询和注解查询更简便的编写想要的SQL。

2.数据库的扩展性:

Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。

Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。

Spring Data 与数据具体的关联可以通过命名规范查询、注解查询,无需关心数据库的差异,但是通过本地化SQL查询的话,就不易扩展。

3.缓存机制:

相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

不同点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

 

4.查询方式:
Hibernate查询:
1.HQL  --->from Admin as admin where admin.name =:name 使用命名参数,仅使用与Hiberante框架

2.Criteria---->对象化查询 

  Criteria c = getSession().Criteria(Admin.class)

   c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
   c.add(Restrictions.eq("apassword", password));

3.DetachedCriteria----->动态分离查询

4.例子查询-Example.create(user).list()

5.sql查询

Query q = s.createSQLQuery("select * from user").addEntity(User.class);

6.命名查询:Query q = getSession().getNamedQuery(“getUserByID”);


Mybatis查询:

定义xml例如;userMapper.xml

定义接口userMapper 定义相关的方法 不必编写接口的实现类

通过mybatis内部处理机制解析xml文件中的sql 

调用存储过程 {call 存储过程名}


Spring Data查询:

1.命名查询,需要遵循Spring Data规范,例如findByUser、deleteById 等从右向左解析生成sql

2.注解查询:@Query(“ql语句”)

总结:

Hibernate 对数据库提供了较为完整的封装,封装了基本的DAO层操作,有较好的数据库移植性

Mybatis 可以进行更细致的SQL优化,查询必要的字段,但是需要维护SQL和查询结果集的映射,而且数据库的移植性较差,针对不同的数据库编写不同的SQL,

Spring Data JPA 极大的简化了数据库访问,可以通过命名规范、注解的方式较快的编写SQL。

 

ORM框架的使用需要根据具体的项目业务选择更适合的技术方案,而不能一味地为了技术而技术。

 

转载于:https://www.cnblogs.com/levontor/p/10868129.html

### Spring Data JPA MyBatis 的差异 #### 基本概念和框架目标 Spring Data JPAMyBatis 在基本概念和框架目标上存在显著差异。前者是 Spring Framework 的一部分,在 JPA 上提供了高层次的抽象,减少了大量模板代码;后者则是允许灵活编写 SQL 语句并将这些语句的结果映射到 POJOs 中的持久化层框架[^2]。 #### 自动化程度对比 Hibernate(作为 Spring Data JPA 默认实现的一部分)具有更高的自动化水平和支持面向对象的操作方式处理关系型数据库中的数据。相比之下,MyBatis 提供了更大的灵活性给开发者手动控制 SQL 编写过程[^3]。 #### 数据库操作方法设计 对于增删改查等常见 CRUD 操作而言,Spring Data JPA 使用统一的方法 `save` 来完成新增或更新记录的工作,并通过是否存在主键 ID 或版本号字段判断具体行为。然而这可能导致每次调用时都需要先查询再决定插入还是修改,从而增加了额外开销。另一方面,MyBatis 明确区分了不同的操作类型并分别定义了相应的 API 方法如 `insert`, `updateById` 等[^4]。 #### 动态SQL构建机制 当涉及到动态 SQL 构建需求时,两种技术也采取不同策略:Spring Data JPA 利用接口 `JpaSpecificationExecutor` 实现此功能;而在 MyBatis 中,则通常借助 XML 文件内嵌脚本来达到相同目的。 #### 学习曲线开发效率考量 考虑到实际项目中的应用情况,由于 Hibernate 封装了一个完整的 ORM 解决方案,因此其内部结构较为复杂庞大,这也意味着初学者可能面临更陡峭的学习曲线以及较长的学习时间。相反地,MyBatis 因为其相对简单的架构使得入门更加容易一些[^5]。 综上所述,选择哪一个框架取决于具体的业务逻辑和技术栈偏好等因素: - 如果追求快速原型搭建或是希望最大限度减少手写的 SQL 数量,那么 Spring Data JPA 可能会更适合; - 对于那些需要高度定制化的查询性能优化或者已经习惯直接操纵 SQL 文本的应用程序来说,MyBatis 应该是一个不错的选择。 ```java // 示例代码展示如何使用 Spring Data JPA 进行保存操作 public interface EmployeeRepository extends JpaRepository<Employee, Long> { @Override <S extends Employee> S save(S entity); } // 而这是 MyBatis 方式的简单例子 @Mapper public interface EmployeeMapper { int insert(Employee record); int updateByPrimaryKeySelective(Employee record); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值