Mybatis和Hibernate的区别。

2020-10-20 09:07发布

8条回答
IngmarL
2楼 · 2020-10-20 09:30

Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句

小猪仔
3楼 · 2020-10-20 09:35

1.开发速度

MyBatis支持的学习相比Hibernate更简单,支持原生sql,学习更简单。Hibernate的学习难度更大。开发速度差距不大。MyBatis要维护层数据dao库字段和bean属性映射,Hibernate要在bean中添加字段映射。

2.运行效率

MyBatis支持原生sql自定义查询字段更加灵活,基本属于JDBC操作。hibernate是对JDBC更复杂的封装。每次查询需要完整的映射,对待复杂的查询通过HQL语句生成的sql语句效率不能保证。所以MyBatis会比Hi稍快。


魏魏姐
4楼 · 2020-10-20 09:41

mybatis:小巧、方便、高效、简单、直接、半自动

hibernate:强大、方便、高效、复杂、绕弯子、全自动


浅浅77
5楼 · 2020-10-20 09:46

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架。 

Mybatis是一个开源对象关系映射框架,原名:ibatis,2010年由谷歌接管以后更名。是一个半自动化的持久层框架。

两者区别

1 开发方面

在项目开发过程当中,就速度而言:

hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发;

Mybatis 属于半自动化,sql需要手工完成,稍微繁琐;

但是,凡事都不是绝对的,如果对于庞大复杂的系统项目来说,发杂语句较多,选择hibernate 就不是一个好方案。

sql优化方面

Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;

Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;

对象管理比对

Hibernate 是完整的对象-关系映射的框架,开发工程中,无需过多关注底层实现,只要去管理对象即可;

Mybatis 需要自行管理 映射关系;

缓存方面    

相同点:

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

不同点:

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

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

 

 

 

 

 




比较:

Hibernate 具有良好的管理机制,用户不需要关注SQL,如果二级缓存出现脏数据,系统会保存

Mybatis 在使用的时候要谨慎,避免缓存CAche 的使用。


Hibernate优势

  1. Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。

  2. Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。

  3. Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

  4. Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

Mybatis优势

  1. MyBatis可以进行更为细致的SQL优化,可以减少查询字段。

  2. MyBatis容易掌握,而Hibernate门槛较高。

  3. 一句话总结

Mybatis:小巧、方便、高效、简单、直接、半自动化

Hibernate:强大、方便、高效、复杂、间接、全自动化

三岁奶猫
6楼 · 2020-10-20 10:58

1、hibernate是全自动,而mybatis是半自动。hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
2、hibernate数据库移植性远大于mybatis。hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

乐xenia
7楼 · 2020-10-21 16:15

7.1 相同点

Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句

其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。Hibernate和MyBatis都支持JDBC和JTA事务处理。

7.2 不同点

(1)hibernate是全自动,而mybatis是半自动

hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

(2)hibernate数据库移植性远大于mybatis

hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(Oracle、MySQL等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

(3)hibernate拥有完整的日志系统,mybatis则欠缺一些

hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。

(4)mybatis相比hibernate需要关心很多细节

hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。

(5)sql直接优化上,mybatis要比hibernate方便很多

由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等{{BANNED}}需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。

(6)缓存机制上,hibernate要比mybatis更好一些

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

而Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。


我的网名不再改
8楼 · 2020-10-25 15:58

MyBatis因为具有封装少,映射多样化,支持存储过程,可以进行SQL优化等特点。使得它取代了Hibernate成为了java互联网中首选的持久框架。

无论MyBatis或Hibernate都可以称为ORM框架,Hibernate的设计理念是完全面向POJO的,而MyBatis不是。
Hibernate基本不再需要编写SQL就可以通过映射关系来操作数据库,是一种全表映射的体现,而MyBatis需要我们提供SQL去运行。程序员不用精通SQL,只要懂得操作POJO就能够操作对应数据库的表。

在管理系统时代,首先是实现业务逻辑,然后才是性能,所以Hibernate在当时是主流。

在移动互联网时代,MyBatis是首选,不屏蔽SQL,程序员可以自己制定SQL规则,能更加精确定义SQL,从而优化性能。更符合移动互联网高并发,大数据,高性能,高响应的要求。

Hibernate和MyBatis的增、删、查、改.对于业务逻辑层来说大同小异,对于映射层而言Hibernate的配置不需要接口和SQL.相反MyBatis是需要的。对于Hibernate而言,不需要编写大量的SQL,就可以完全映射,同时提供了日志、缓存、级联(级联比MyBatis强大)等特性,此外还提供HQL (Hibernate Query Language)对POIO进行操作,使用十分方便,但是它也有致命的缺陷。

由于无须SQL,当多表关联超过3个的时候,通过Hibernate的级联会造成太多性能的丢失,又或者我现在访问一个财 务的表,然后它会关联财产信息表,财产又分为机械、原料等.显然机械和原料的字段是不一样的,这样关联字段只能根据特定的条件 变化而变化,而Hibernate无法支持这样的变化。遇到存储过程,Hibernate只能作罢。更为关键的是性能,在管理系统的时代,对于性能的要求不是那么苛刻,但是在互联网时代性能就是系统的根本,响应过慢就会丧失客户,试想一下谁会去用一个经常需要等待超过10 秒以上的应用呢?

以上的问题MyBatis都可以解决,MyBatis 可以自由书写SQL、支持动态SQL、处理列表、动态生成表名,支持存储过程。这样就可以灵活地定义查询语句,满足各类需求和性能优化的需要,这些在互联网系统中是十分重要的。

但MyBatis也有缺陷。首先,它要编写SQL和映射规则,其工作量稍微大于 Hibernate.其次,它支持的工具也很有限,不能像Hibernate那样有许多的插件可以帮助生成映射代码和关联关系,而即使使用生成工具,往往也需要开发者进一步简化, MyBatis 通过手工编码,工作量相对大些。所以对于性能要求不太苛刻的系统,比如管理系统、ERP 等推荐使用Hibernate;而对于性能要求高、响应快、灵活的系统则推荐使用MyBatis.


pipi雪
9楼 · 2021-03-11 13:59
  1. 开发速度MyBatis支持的学习相比Hibernate更简单,支持原生sql,学习更简单。Hibernate的学习难度更大。开发速度差距不大。MyBatis要维护层数据dao库字段和bean属性映射,Hibernate要在bean中添加字段映射。


2.运行效率

MyBatis支持原生sql自定义查询字段更加灵活,基本属于JDBC操作。hibernate是对JDBC更复杂的封装。每次查询需要完整的映射,对待复杂的查询通过HQL语句生成的sql语句效率不能保证。所以MyBatis会比Hi稍快。



相关问题推荐

  • 大数据怎么样?2021-01-13 14:45
    回答 36

    大数据薪资待遇挺可观的

  • 回答 7

    用的挺多的呀,首先以前很多项目都是基于ssm的,所以现在如果不升级的话,就需要维护,然后现在很多项目也不一定非得用比如springboot或者springcloud来处理。

  • 回答 3
    已采纳

    大数据的主要特点有哪些?大数据这个概念自被各界媒体所关注后,便一直站在风口浪尖引人注目。不落后的你想要深入浅出地了解大数据?大圣众包以4V为你详尽讲述大数据的四个特点。大数据主要特点:1.准确(Veracity)这是一个在讨论大数据时时常被忽略的一个属性...

  • 回答 9

    redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符串数组,以下简称C字符串)。C字符串并不能满足redis对字符串安全性、效率以及功能的要求,所以Ridis自定义SDS抽象类型。       Redis中,C字符串只会作为字符串字面量(string literal)用...

  • 大数据框架有哪些?2020-05-07 20:16
    回答 6

    Impala:hadoop的sql平台、支持hbase/hdfs、支持超大数据、支持多并发、sql支持好、对内存依赖比较严重。需要自己优化,并且有的语句超过内存会报错。Spark:各种格式、各种计算(机器学习、图形计算)、可sql、可代码处理、支持scala/java/python语言开发。...

  • 回答 7

    世界编程语言有很多种,但在网络编程中应用比较广泛又适合大数据开发的java是比较合适的,因为java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。 如果你对java有一定的了解,就更应该清楚java是一个强类型编程...

  • 回答 5

    1、模板热部署        在SpringBoot中,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的,因此我们可以在application.properties中关闭模版引擎的缓存,如下:        Thymeleaf的配置:spring.thymeleaf...

  • 回答 2

    mysql默认用户名是 root ,默认没有密码

  • 回答 2

    一.成员变量和局部变量1.程序例子:public class HelloThreadTest{public static void main(String[] args){HelloThread r = new HelloThread();Thread t1 = new Thread(r);Thread t2 = new Thread(r);t1.start();t2.start();}}clas......

  • 回答 2

        方法一:使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,这样在多线程对数据访问就不会出现冲突。因为每一个线程都拥有自己的变量副本,因此也就不需要同步该变量。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可...

  • 回答 4

    我们知道Spring相对于之前框架的明显一点区别就是Spring容器生成的Bean都是默认单例的,初读到这里的时候我也是有点疑惑,所以写这篇文章来谈谈线程安全和单例多例的问题。在讲单例和线程安全之前首先我们要明白一点,那就是在单例模式下多线程也可以同时访问...

  • 回答 2

    一、在 SQL 映射文件的 select 标签中添加 useGeneratedKeys=true 属性与 keyProperty=  属性,keyProperty 的值表示的是将获取到的自增主键值赋给 JavaBean 中的某个字段。                  insert into t_employee(username, ge...

没有解决我的问题,去提问