在持久层框架中无可厚非的就是mybatis了,但是也会经常被人问到为啥要用mybatis,为啥不用hibernate,jpa。很多人各级都是地铁爷爷看手机的表情,似乎从来没想过这个问题。“公司叫用我就用了呗”

如果期望有好的发展我觉得我们应该学会知其然&知其所以然,这样才会有自己想要的进步,今天就来具体讲讲他们之间的区别以及为什么现在mybatis都在用却摒弃了以前那么牛*的Hibernate。希望可以帮助到思进取的你。

SpringJPA、Hibernate、 Mybatis简述

Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Spring Data JPA:Spring Data JPA是Spring Data的子模块,默认由Hibernate实现。Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。
Mybatis:MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。Mybatis:着力于POJO与SQL之间的映射关系。

由上面的简述就可以看到SpringJPA、Hibernate、 Mybatis三者对比其实就是Hibernate与Mybatis之间的对比(Spring Data JPA默认由Hibernate实现)

Hibernate与 Mybatis的比较

使用方式上的比较

Hibernate是一个自动化更强的持久性框架,省去了绝大多数的SQL的编写。Hibernate面向对象与对象之间的模型,因为封装了完整的对象关系映射机制所以内部十分复杂,学习周期也比较长。而Mybatis将sql的入参和查询结果映射成POJOs,面向于ResultMap的映射,需要写的SQL语句跟多。
总结:封装程度越高东西越不灵活,大家应该都有过体验吧。Hibernate使用起来简单,但是很不灵活,很多复杂场景的运用很鸡肋。不如Mybatis的随心DIY舒心。

开发难度的比较

上面有说过,因为Hibernate封装了完整的对象关系,因此学习难度大于Mybatis,使用Mybatis的时候专注于SQL的编写以及映射关系就OK了。

查询的比较

简单查询

Hibernate 提供了基础的查询方法
Mybatis需要手动编写SQL语句

高级查询

Hibernate通过对象映射机制,开发者无需关心SQL的生成与结果映射,专注业务流程;
Mybatis需要通过手动在XML文件中编写SQL语句以及ResultMap或者注解。
也就是说Hibernate用起来简单,但是DIY能力远差于Mybatis。

缓存机制的比较

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

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

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

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

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

总结
抛开业务场景,只针对使用上来看的话,Hibernate 比Mybatis更加方便。但是写程序永远脱离不了业务,面对日益复杂话的业务场景,Mybatis的灵活性尤为重要。

ORM框架的使用需要根据具体的项目业务选择更适合的技术方案,而不能一味地为了技术而技术。但是在大数据时代为了应对复杂的场景Mybatis首当其冲的成为首选的持久化框架。

亲~全部手写,个别错误字眼请忽略

ORM框架 Mybatis、Hibernate、Spring Data JPA之到底该用谁,谁更牛*的更多相关文章

  1. MyBatis 与 Spring Data JPA 选择谁?

    MyBatis 与 Spring Data JPA 选择谁? https://www.v2ex.com/t/285081 jpa predicate优缺点 https://blog.csdn.net/ ...

  2. Hibernate、Mybatis与Spring Data JPA

    从零开始集成Springboot+MyBatis+JPA https://www.jianshu.com/p/e14c4a6f6871 MyBatis 与Hibernate的区别 http://xhr ...

  3. 【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中

    执行了save()方法  sql语句也执行了,但是数据并未插入数据库中 解决方法: 是因为执行了save()方法,也执行了sql语句,但是因为使用的是 @Transactional 注解,不是手动去提 ...

  4. spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  5. 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  6. 【ORM框架】Spring Data JPA(一)-- 入门

    本文参考:spring Data JPA入门   [原创]纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...

  7. 实例对比 hibernate, spring data jpa, mybatis 选型参考

    原文: 最近重构以前写的服务,最大的一个变动是将mybatis切换为spring data jpa,切换的原因很简单,有两点:第一.它是spring的子项目能够和spring boot很好的融合,没有 ...

  8. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

  9. 来说说JPA、Hibernate、Spring Data JPA之间的什么关系?

    目录 JPA Hibernate Spring Data JPA 实践 来说说JPA.Hibernate.Spring Data JPA之间的什么关系 Java 持久层框架访问数据库的方式大致分为两种 ...

随机推荐

  1. 【python数据可视化】之plotly

    安装plotly pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly 验证plotly版本 import plotly plo ...

  2. 【python基础】datetime类各种坑

    import datetime end_time = 1525104000000 d = datetime.datetime.fromtimestamp(end_time / 1000, None) ...

  3. Pyqt5_QPushButton

    QPushButton 状态 isDown() 提示按钮是否已按下 isChecked() 提示按钮是否已经标记 isEnable() 提示按钮是否可以被用户点击 isCheckAble() 提示按钮 ...

  4. PhpStorm2016.3激活

    选择License server,输入以下任意一个地址: http://idea.imsxm.com/http://114.215.133.70:41017/http://mcpmcc.com:101 ...

  5. php实用正则

    1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z ...

  6. Verilog代码和FPGA硬件的映射关系(一)

    代码和硬件之间的映射关系是一个很奇妙的过程,也展现出人类的智慧.单片机内部的硬件结构都是固定的,无法改变,我们通过代码操作着寄存器的读写,来执行各种复杂的任务.FPGA的硬件结构并不像单片机一样是固定 ...

  7. Oracle阻塞会话源头查找-单机和RAC环境

    在写 Oracle session相关数据字典(一)  这篇文章时,提到使用v$session视图的树形查询可以得到Oracle锁树,这样就便于我们找出阻塞会话的源头,但是仅仅可以在单机环境中使用.今 ...

  8. Python中对文件的读写

    读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘. 读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系 ...

  9. 子串 NOIP2015 D2T2 luoguP2679 字符串处理+DP

    AC通道! 题目大意: 给定两个长度分别为 n 和 m 的字符串 A 和 B,选取 A 中的 k 个子串,使这 k 个子串按照先后顺序连接起来后等于 B 子串.   输入输出样例 输入 #1 6 3 ...

  10. Could not find the Qt platform plugin windows错误解决方法

    在PyCharm中运行PyQt5窗口程序时,出现了下图所有的错误提示. 出现该问题的原因是环境变量没有添加. 解决方法:在环境变量中增加:QT_QPA_PLATFORM_PLUGIN_PATH 路径: ...