JDBC、Hibernate和Mybatis的区别——每天一个Java小常识

加我微信ppz2759,领取上万G编程资源!
代码代写(实验报告、论文、小程序制作)服务请加微信:ppz2759

JDBC、Hibernate和Mybatis整体对比:

名称 使用性能 编写效率
JDBC
Hibernate 低(SQL优化比较困难) 高(不需要使用SQL,自动化的持久层框架)
Mybatis 中(封装少,映射多样化,支持存储过程) 中(半自动化的持久层框架)

Mybatis要求程序员写sql的能力要相对使用hibernate的开发人员要高的多,且可移植性也不是很好,但是便于SQL优化。
涉及到大数据的系统使用Mybatis比较好,因为优化较方便。涉及的数据量不是很大且对优化没有那么高,可以使用hibernate

JDBC使用方法:

我们平时使用jdbc进行编程,大致需要下面几个步骤:

  1. 使用jdbc编程需要连接数据库,注册驱动和数据库信息
  2. 操作Connection,打开Statement对象
  3. 通过Statement对象执行SQL,返回结果到ResultSet对象
  4. 使用ResultSet读取数据,然后通过代码转化为具体的POJO对象
  5. 关闭数据库相关的资源

Hibernate使用方法:

Hibernate是建立在若干POJO通过xml映射文件(或注解)提供的规则映射到数据库表上的。我们可以通过POJO直接操作数据库的数据,他提供的是一种全表映射的模型。相对而言,Hibernate对JDBC的封装程度还是比较高的,我们已经不需要写SQL,只要使用HQL语言就可以了。

Mybatis使用方法:

第一种方法:

  1. 定义表对应的实体类
  2. 定义MyBatista的mybatisConfig.xml配置文件和对应数据表(如:user表)的sql映射文件userMapper.xml
  3. userMapper.xml文件,该配置文件在com.mybatis包下,user表对应的实体类User也在com.mybatis包下。

第二种方法(基于注解的方式使用MyBatis):

  1. 首先定义对应表的sql映射接口
  2. 然后在mybatisConfig.xml配置文件中注册该接口

JDBC、Hibernate和Mybatis各自的简介

jdbc:

JDBC是较底层的持久层操作方式,是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据,对性能要求极高的话,应该采用JDBC的方式;

Hibernate:

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

在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难。对数据库进行完整性控制的话建议使用Hibernate;

Mybatis:

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

在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便.如果要如果要灵活使用sql语句的话建议采用MyBatis框架。

如果你需要一个灵活的,可以动态生成映射关系的框架,那么Mybatis确实是一个最好的选择。它几乎可以替代jdbc,拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存,日志,级联。但是它的缺陷是需要你提供映射规则和sql,所以开发工作量比hibernate要大些。

jdbc的缺点:

缺点:工作量比较大,需要连接,然后处理jdbc底层事务,处理数据类型,还需要操作Connection,Statement对象和ResultSet对象去拿数据并关闭他们。我们对jdbc编程可能产生的异常进行捕捉处理并正确关闭资源。

由于JDBC存在的缺陷,在实际工作中我们很少直接使用jdbc进行编程,用的更多的是ORM对象关系模型来操作数据库,Hibernate就是一个ORM模型

Hibernate:

使用Hibernate进行编程有以下好处:

  1. 消除了代码的映射规则,它全部分离到了xml或者注解里面去配置。
  2. 无需在管理数据库连接,它也配置到xml里面了。
  3. 一个会话中不需要操作多个对象,只需要操作Session对象。
  4. 关闭资源只需要关闭一个Session便可。

这就是Hibernate的优势,在配置了映射文件和数据库连接文件后,Hibernate就可以通过Session操作,非常容易,消除了jdbc带来的大量代码,大大提高了编程的简易性和可读性。Hibernate还提供了级联,缓存,映射,一对多等功能。Hibernate是全表映射,通过HQL去操作pojo进而操作数据库的数据。

Hibernate的缺点:

  1. 全表映射带来的不便,比如更新时需要发送所有的字段。
  2. 无法根据不同的条件组装不同的SQL。
  3. 对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
  4. 不能有效的支持存储过程。
  5. 虽然有HQL,但是性能较差,大型互联网系统往往需要优化sql,而hibernate做不到。

为了解决Hibernate的不足,Mybatis出现了,Mybatis是半自动的框架。之所以称它为半自动,是因为它需要手工匹配提供POJO

Mybatis:

Mybatis是半自动的框架。之所以称它为半自动,是因为它需要手工匹配提供POJO,sql和映射关系,而全表映射的Hibernate只需要提供pojo和映射关系即可。
Mybatis需要提供的映射文件包含了一下三个部分:sql,映射规则,pojo。在Mybatis里面你需要自己编写sql,虽然比Hibernate配置多,但是Mybatis可以配置动态sql,解决了hibernate表名根据时间变化,不同条件下列不一样的问题,同时你也可以对sql进行优化,通过配置决定你的sql映射规则,也能支持存储过程,所以对于一些复杂和需要优化性能的sql查询它就更加方便。Mybatis几乎可以做到jdbc所有能做到的事情。

接下来是Hibernate和Mybatis的整体大比拼

对象管理比对

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

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

开发方面

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

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

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

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

sql优化方面

Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也不行,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。

Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。

总之写sql的灵活度上hibernate不及mybatis。

开发效率方面

hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。

mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目

hibernate是全自动,而mybatis是半自动

hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。

mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

数据库移植性

hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(Oracle、MySQL等)的耦合性。hibernate数据库移植性远大于mybatis

mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

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

hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;

mybatis则除了基本记录功能外,功能薄弱很多。

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

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

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

Hibernate优势

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

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

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

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

Mybatis优势

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

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

两者最大的区别

针对简单逻辑,Hibernate与MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。

针对高级查询,MyBatis需要手动编写SQL语句,以及ResultMap,而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于流程。

开发难度对比

Hibernate的开发难度大于MyBatis,主要由于Hibernate比较复杂,庞大,学习周期比较长。

MyBatis则相对简单,并且MyBatis主要依赖于生气了的书写,让开发者刚进更熟悉。

sql书写比较

Hibernate也可以自己写sql来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性,不过Hibernate具有自己的日志统计。

MyBatis的sql是手动编写的,所以可以按照要求指定查询的字段,不过没有自己的日志统计,所以要借助Log4j来记录日志。

数据库扩展性计较

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

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

缓存机制比较

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

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

SQL操作

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

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

你可能感兴趣的:(java,笔记)