持久层框架 Hibernate 和 Mybatis 的比较

简介

持久化:持久化(Persistence)是程序数据在瞬时状态(如内存中的对象)和持久状态(可永久保存的存储设备中,如磁盘)间转换的过程。持久化的主要应用是将内存中的数据存储在关系型的数据库中,也可以存储在磁盘文件中、XML数据文件中等
持久层(Persistence Layer):专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。
对象数据映射(ORM):Object/Relational Mapper,即“对象-关系型数据映射组件”。表示必须同时使用面向对象和关系型数据进行开发。

1、Hibernate

Hibernate是当前最流行的ORM框架之一,对JDBC提供了较为完整的封装。Hibernate的O/R Mapping实现了 POJO 和数据库表之间的映射,以及SQL的自动生成和执行

2、Mybatis

Mybatis同样也是非常流行的ORM框架,主要着力点在于 POJO 与 SQL 之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO 。相对Hibernate“O/R”而言,Mybatis 是一种“Sql Mapping”的ORM实现。

一、Hibernate

Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 POJO 与数据库表建立映射关系,是一个全自动的 ORM 框架,Hibernate 可以自动生成 SQL 语句,自动执行。Hibernate的持久化解决方案将用户从原始的 JDBC 访问中释放出来,用户无须再关注底层的 JDBC 的操作(底层数据连接的获得,数据访问的实现,事务控制都无须用户关心),使得Java程序员可以以面向对象的编程思维来操纵数据库

1、工作原理

在这里插入图片描述
(1)Hibernate框架需要2种配置文件,分别是:hibernate.cfg.xml(存放数据库连接信息)与xxx.hbm.xml(确定持久类与数据表,数据列之间的对应关系)。

(2)hibernate不再是直接调用JDBC访问,而是Session会话访问。在hibernate框架中,只有处于Seesion管理下的POJO对象才有持久化操作的能力。

SessionFatory:hibernate关键对象,它是单个数据库映射关系经过编译后的内存镜像,线程安全。主要作用是生成Session的工厂,该对象可以为事务之间可重用的数据提供可选的二级缓存。

Session:它是应用程序与持久储存层之间交互操作的一个单线程对象,是hibernate持久化操作的关键对象,所有的持久化对象必须在Session管理下才可以进行持久化操作。此对象的生命周期极短,底层封装了JDBC连接。Session对象持有一个必选的一级缓存,显式执行flush()之前,所有持久化操作的数据都缓存在Session对象处。

持久化对象:系统创建的 POJO 实例,一旦与特定的Session关联,并对应数据表的指定记录,该对象就处于持久化状态,这一系列对象都被称为持久化对象。在程序中对持久化对象执行的修改,都将自动被转换为持久层的修改。持久化对象完全可以是普通的JavaBean,唯一特殊的是他们正与一个Session关联。

事务(transaction):具有数据库事务的概念,Hibernate 事务是对底层具体的JDBC、JTA、以及CORBA事务的抽象,在某些情况下,一个Transaction之内可能包含多个Session对象。虽然事务操作是可选的,但所有持久化操作都应该在事务管理下进行,即便是只读操作。

连接提供者(ConnctionProvider):生成 JDBC 连接的工厂,通过抽象将应用程序与底层的 DataSource 或 DriverManager 隔离开,该对象无须应用程序直接访问,仅在应用程序需要扩展时使用。注:实际开发中,很少有采用DriverManager来获取数据库连接, 通常都会使用DataSource来获取数据库连接。

事务工厂(TransactionFactory):是生成 Transaction 对象实例的工厂,该对象无须应用程序直接访问,它负责对底层具体的事务实现进行封装、将底层具体的事务抽象成Hibernate事务

2、执行流程
在这里插入图片描述
3、体系架构
在这里插入图片描述
4、Hibernate实体类的三种状态

(1)瞬时状态:对象由new操作符创建,且尚未与Hibernate Session关联的对象,被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标示,如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate session可以让其变为持久化状态。

(2)持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(identifier),持久化的实例可以是刚保存的,也可以是刚被加载的。无论那种,持久化对象都必须与指定的Hibernate Session关联。Hibernate会检测到处于持久化状态对象的改动,在当前操作执行完成时将对象数据写回数据库。开发者不需要手动执行UPDATE。

(3)游离:某个实例曾经处于持久化状态,但随着与之关联的session被关闭,该对象就变成游离状态了。游离对象的引用依旧有效,对象可以继续被修改,只是不会同步到数据库中如果重新让游离对象与某个session关联,该对象会重新转换为持久化状态
在这里插入图片描述

二、Mybatis

MyBatis 是一款优秀的持久层框架,半自动化的ORM实现,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Objects,普通的 Java 对象)映射成数据库中的记录。
Mybatis底层封装了JDBC,使用了动态代理模式。

1、工作原理
在这里插入图片描述
2、执行流程
在这里插入图片描述

(1)加载 mybatis 全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis 基于XML配置文件生成Configuration和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
(2)SqlSessionFactoryBuilder 通过 Configuration 对象生成 SqlSessionFactory,用来开启SqlSession
(3)SqlSession对象完成和数据库的交互
通过 SqlSession 拿到 Mapper 代理对象通过 MapperProxy 调用Mapper中增删改查的方法。
a、用户程序调用 mybatis 接口层 api(即Mapper接口中的方法)
b、SqlSession 通过调用api的Statement ID找到对应的 MappedStatement 对象
c、通过 Executor(负责动态SQL的生成和查询缓存的维护)将 MappedStatement 对象进行解析,sql 参数转化、动态 sql 拼接,生成 jdbc Statement 对象,使用 Paramterhandler 填充参数,使用 statementHandler 绑定参数。
d、JDBC执行sql。
e、借助 MappedStatement 中的结果映射关系,使用 ResultSetHandler 将返回结果转化成HashMap、JavaBean 等存储结构并返回。
f、关闭 sqlsession 会话。

3、体系结构
在这里插入图片描述

① ConfigurationMyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中。
② SqlSession : 作为 MyBatis 工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能。既可以发送 SQL 执行返回结果,也可以获取Mapper的接口。
③ Executor : MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
④ StatementHandler:封装了JDBC Statement操作,负责对 JDBC statement 的操作,如设置参数等。
⑤ ParameterHandler : 负责对用户传递的参数转换成 JDBC Statement 所对应的数据类型。
⑥ ResultSetHandler :负责将JDBC返回的 ResultSet 结果集对象转换成 List 类型的集合。
⑦ TypeHandler : 负责 java 数据类型和 jdbc 数据类型(也可以说是数据表列类型)之间的映射和转换。
⑧ MappedStatement: MappedStatement维护一条<select|update|delete|insert>节点的封装。
⑨ SqlSource :负责根据用户传递的 parameterObject,动态地生成 SQL 语句,将信息封装到BoundSql对象中,并返回。
⑩ BoundSql: 表示动态生成的SQL语句以及相应的参数信息。

三、Hibernate 与 Mybatis 对比

1、相同点

(1)Hibernate 与 MyBatis 都可以是通过 SessionFactoryBuider 由 XML 配置文件生成 SessionFactory,然后由 SessionFactory 生成 Session,最后由 Session 来开启执行事务和 SQL 语句。其中SessionFactoryBuider、SessionFactory 和 Session的生命周期都是差不多的。

(2)Hibernate 和 MyBatis 都支持 JDBC 和 JTA 事务处理。

2、不同点

(1)查询目标不同

在使用Hibernate的时候,我们查询的是POJO实体类,而不再是数据库的表,例如hql语句 select count(*) from User,里面的User是一个Java类,而不是数据库表User。可以使用纯的面向对象的思维方式,查询POJO对象,查询条件是对象属性,不再需要有任何表、字段等关系的概念,这样java程序员就更容易做持久层的操作。Hibernate封装SQL,使用另一种纯的面向对象查询语言 hql 代替 sql

MyBatis 则是另外一种类型的持久化框架,它没有封装 SQL 也没有创建一种新的面向对象的查询语言,而是直接使用SQL作为查询语言只是把结果填入 POJO 对象而已。查询速度快,可以灵活使用任意复杂的查询只要数据库支持。

(2)优势对比

● Mybatis 优势

可以进行更为细致的SQL优化,可以减少查询字段;
sql 优化更方便;

● Hibernate 优势

DAO 层开发比 MyBatis 简单,Mybatis 需要维护SQL和结果映射。
Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
Hibernate 拥有完整的日志系统,mybatis 则欠缺一些。
Hibernate 数据库移植性很好;MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate 有更好的二级缓存机制,可以使用第三方缓存;MyBatis本身提供的缓存机制不佳。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值