mybatis与hibernate的区别持久层对比【面试题】

Mybatis技术特色:

好处:html

经过直接编写SQL语句,能够直接对SQL进行性能的优化;java

学习门槛低,学习成本低。只要有SQL基础,就能够学习mybatis,并且很容易上手;mysql

因为直接编写SQL语句,因此灵活多变,代码维护性更好。程序员

缺点:面试

不能支持数据库无关性,即数据库发生变动,要写多套代码进行支持,移植性很差。spring

Mysql:limitsql

Oracle:rownum数据库

须要编写结果映射。apache

Hibernate技术特色:

好处:编程

标准的orm框架,程序员不须要编写SQL语句。

具备良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。

之后,mysql数据迁移到oracle,只须要改方言配置

缺点:

学习门槛高,须要对数据关系模型有良好的基础,并且在设置OR映射的时候,须要考虑好性能和对象模型的权衡。

程序员不能自主的去进行SQL性能优化。

 

Mybatis应用场景:

需求多变的互联网项目,例如电商项目。

Hibernate应用景:

需求明确、业务固定的项目,例如OA项目、ERP项目等。

详细总结:

  1. JDBC : java data base connection,只是提供接口,由数据库厂商实现。
  2. JDBCTemplate : 内嵌于Spring框架,对JDBC的封装,缺点:没有缓存
  3. Mybatis :注解+xml+Java反射技术
  4. Hibernate : 不用编写sql,封装HQL+分布式事务

 

1、JDBC
介绍
JDBC(Java DataBase Connectivity ,java数据库链接技术) 用来访问各类数据库 。JDBC 规范定义接口 , 具体的实现由各大数据库厂商来实现。每一个数据库厂商根据自家数据库的通讯格式编写好本身数据库的驱动,数据库驱动由数据库厂商提供。

 

开发步骤
开发步骤:
咱们平时使用jdbc进行编程,大体须要下面几个步骤:
1,使用jdbc编程须要链接数据库,注册驱动和数据库信息
2,操做Connection,打开Statement对象
3,经过Statement对象执行SQL,返回结果到ResultSet对象
4,使用ResultSet读取数据,而后经过代码转化为具体的POJO对象
5,关闭数据库相关的资源
优缺点
使用 JDBC 的好处:

咱们只须要会调用 JDBC 接口中的方法便可,使用简单
使用同一套 Java 代码,进行少许的修改就能够访问其余 JDBC 支持的数据库
jdbc的缺点:
一:工做量比较大,编程复杂;须要链接,而后处理jdbc底层事务,处理数据类型,

二:须要操做Connection,Statement对象和ResultSet对象去拿数据并关闭他们。

 JDBC缺点和解决参考方案:

         1,数据库链接建立,释放繁琐形成系统资源浪费,从而影响系统性能,若是能使用数据库链接池可解决此问题。

         2,Sql语句在代码中硬编码,形成代码不易维护,实际应用Sql变化可能较大,若是sql一变更就要更改java代码。

         3,使用PreparedStatement向占位符传参存在硬编码,由于Sql语句的where条件不必定,可能多也可能少,修改sql还要修改java代码,系统不易维护。

        4,对结果集解析存在硬编码(列名),sql变化致使解析的java代码变化,系统不易维护,若是能将数据库库封装成pojo对象解析比较方便。

 

2、JDBCTemplate

     

  JdbcTemplate针对数据查询提供了多个重载的模板方法,你能够根据须要选用不一样的模板方法.若是你的查询很简单,仅仅是传入相应SQL或者相关参数,而后取得一个单一的结果,那么你能够选择一组便利的模板方法

  • 优势:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务
  • 缺点:必须于Spring框架结合在一块儿使用、不支持数据库跨平台、默认没有缓存

JDBC已经可以知足大部分用户最基本的需求,

可是在使用JDBC时,必须本身来管理数据库资源如:获取

PreparedStatement,设置SQL语句参数,关闭链接等步骤。

JDBCTemplate就是Spring对JDBC的封装,目的是使JDBC更加易于使用。

JDBCTemplate是Spring的一部分。 

JDBCTemplate处理了资源的创建和释放。

他帮助咱们避免一些常见的错误,好比忘了总要关闭链接。​

他运行核心的JDBC工做流,如Statement的创建和执行,而咱们只须要提供SQL语句和提取结果。

使用JdbcTemplate编程咱们只须要作如下步骤:

1)提供SQL语句和占位符的值

2)获得封装好的查询结果集   

 

使用步骤

使用步骤  

1) 导入依赖的jar包(c3p0链接池、mysql驱动、spring相关)

2) 准备链接池

3) 建立 JdbcTemplate 对象,传入链接池对象

4) 编写SQL语句

5) 调用 execute()执行 DDL、update()执行 DML、queryXxx()执行 DQL 等方法

 

jdbcTemplate.queryForObject("select * from user where name=? and password=?",
                                                             new BeanPropertyRowMapper<>(User.class), name, password);

 

3、Hibernate
ORM模型
ORM取代了JDBC,全部的ORM模型都是基于JDBC进行封装的,不一样ORM模型对JDBC封装的强度是不同的

ORM

对象关系映射(Object Relational Mapping),简单的说ORM框架就是数据库的表和简单Java对象的映射关系模型,咱们经过这层映射关系就能够简单迅速地把数据库表的数据转化为POJO
如图

Hibernate介绍

       Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员每每只需定义好了POJO 到数据库表的映射关系,

便可经过Hibernate 提供的方法完成持久层操做。程序员甚至不须要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。

执行过程
1、读取配置文件完成ORM的映射关系
2、获取session进行增删改查的操做

hibernate工做原理:
1、经过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。
2、由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取解析映射信息。
3、经过config.buildSessionFactory();//获得sessionFactory。
4、sessionFactory.openSession();//获得session。
5、session.beginTransaction();//开启事务。
6、persistent operate;
7、session.getTransaction().commit();//提交事务
8、关闭session;
9、关闭sessionFactory;

Hibernate优点

  • 消除了代码的映射规则,它所有被分离到了XML或者注解里面去配置
  • 无需再管理数据库链接,它也能够配置在XML里面
  • 一个会话中,不要操做多个对象,只要操做Session对象便可
  • 关闭资源只须要关闭一个Session即可

   这就是Hibernate的优点,在配置了映射文件和数据库链接文件后,Hibernate就能够经过Session操做,很是容易,消除了jdbc带来的大量代码,大大提升了编程的简易性和可读性。

Hibernate还提供了级联,缓存,映射,一对多等功能。Hibernate是全表映射,经过HQL去操做pojo进而操做数据库的数据。

Hibernate缺陷
全表映射带来了不便,好比更新时须要发送全部的字段
没法根据不一样的条件组装不一样的SQL
对多表关联和复杂SQL查询支持较差,须要本身写SQL,返回后,须要本身将数据组装为POJO
不能有效支持存储过程
虽然有HQL,可是性能较差, 大型互联网系统每每须要优化SQL,而hibernate作不到

4、Mybatis

       为了解决Hibernate的不足,一个半自动映射的框架MyBatis应运而生

mybatis是一个java持久层框架,它封装少、高性能·可优化、维护简单等优势成为了目前java移动互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程

之因此称它为半自动,是由于它须要手工匹配提供POJO、SQL和映射关系,而全表映射的Hibernate只须要提供POJO和映射关系即可

 

历史
Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 而且更名为Mybatis,2013年11月迁移到Github,目前mybaits是由Github维护的

名称
iBatis一词来源于“internet”和“abatis”的组合

mybaits所须要提供的映射文件包含如下三个部分

  • SQL
  • 映射规则
  • POJO

 

 

Mybatis优势

  1. 半自动的执行方式,除sql外操做由框架完成,方便快捷
  2. 手工定制sql,实现sql与java代码分离,灵活性高,方便维护
  3. 只须要sql进行操做,不须要学习额外的内容
  4. 轻量级的框架,执行速度快

何时用mybaits
  hibernate只适用于场景不太复杂,要求性能不太苛刻的时候
mybatis拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存、日志、级联,可是它的缺陷是须要你提供映射规则和sql,因此它的开发工做量比Hibernate略大一些

5、 JPA

JPA 概述
JPA 的全称是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA 经过 JDK 5.0 注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA 与 与 hibernate 的关系
JPA 规范本质上就是一种 ORM 规范,注意不是 ORM 框架——由于 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由服务厂商来提供实现。

 

  1. JPA 和 Hibernate 的关系就像 JDBC 和 JDBC 驱动的关系,JPA 是规范,Hibernate 除了做为 ORM 框架以外,它也是一种 JPA 实现。
  2. JPA 怎么取代 Hibernate 呢?JDBC 规范能够驱动底层数据库吗?答案是否认的,也就是说,若是使用 JPA 规范进行数据库操做,底层须要 hibernate 做为其实现类完成数据持久化工做。

6、Spring Data JPA的概述

      Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可以使开发者用极简的代码便可实现对数据库的访问和操做。它提供了包括增删改查等在内的经常使用功能,且易于扩展!学习并使用 Spring Data JPA 能够极大提升开发效率!

Spring Data JPA 让咱们解脱了DAO层的操做,基本上全部CRUD均可以依赖于它来实现,在实际的工做工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操做,这样在切换不一样的ORM框架时提供了极大的方便,同时也使数据库层操做更加简单,方便解耦

1.2 Spring Data JPA的特性

          SpringData Jpa 极大简化了数据库访问层代码。 如何简化的呢? 使用了SpringDataJpa,咱们的dao层中只须要写接口,就自动具备了增删改查、分页查询等方法。

1.3 Spring Data JPA 与 JPA和hibernate之间的关系

  JPA是一套规范,内部是有接口和抽象类组成的。hibernate是一套成熟的ORM框架,并且Hibernate实现了JPA规范,因此也能够称hibernate为JPA的一种实现方式,咱们使用JPA的API编程,意味着站在更高的角度上看待问题(面向接口编程)

Spring Data JPA是Spring提供的一套对JPA操做更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。

1.4 Spring Data JPA的快速入门
https://blog.csdn.net/qq_42806915/article/details/82707783

6、各类对比/区别
Hibernate 与 mybaits 的对比
 http://www.elecfans.com/d/638827.html

jdbc,mybatis,hibernate的区别

1)从层次上看,
  • JDBC是较底层的持久层操做方式,
  • 而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操做。
2)从功能上看,
  • JDBC就是简单的创建数据库链接,而后建立statement,将sql语句传给statement去执行,若是是有返回结果的查询语句,会将查询结果放到ResultSet对象中,经过对ResultSet对象的遍历操做来获取数据;
  • Hibernate是将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化比较困难;
  • MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便.
3)从使用上看,
  • 若是进行底层编程,并且对性能要求极高的话,应该采用JDBC的方式;
  • 若是要对数据库进行完整性控制的话建议使用Hibernate;
  • 若是要灵活使用sql语句的话建议采用MyBatis框架。

参考资料:

HIbernate和Mybatis的区别和优劣势:https://www.imooc.com/article/27839?block_id=tuijian_wz

 

经过Java经典面试题之MyBatis与Hibernate的区别深刻了解MyBatis:http://baijiahao.baidu.com/s?id=1598595163822471051&wfr=spider&for=pc

相关文章
相关标签/搜索