zoukankan      html  css  js  c++  java
  • Spring Data JPA、 MyBatis与Hibernate简单对比

    整体参考:

    https://blog.csdn.net/xihuanyuye/article/details/81201441

    详细参考:

    https://blog.csdn.net/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.csdn.net/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框架的使用需要根据具体的项目业务选择更适合的技术方案,而不能一味地为了技术而技术。

  • 相关阅读:
    元组类型内置方法
    python的两种编程模式
    Python和Python解释器
    异常处理
    文件的三种打开方式
    python解释器的安装
    编程语言的分类
    计算机基础之编程
    linux 安装postgresql
    CentOS7 部署 gitlab
  • 原文地址:https://www.cnblogs.com/levontor/p/10868129.html
Copyright © 2011-2022 走看看