JDBC,Mybatis,Hibernate区别

来源:互联网 发布:网络统考app 编辑:程序博客网 时间:2024/06/05 20:35

第一次写项目的时候使用到了NHibernate,那时候知道了ORM框架,所谓ORM,就是 Object-Relation Mapping,即”对象-关系映射“。对象是指存在于内存中的业务对象,数据是持久保存到数据库中的数据实体。ORM框架我的理解就是将对象与关系数据库中的表映射的一种中间层框架。

JDBC和ORM

JDBC是Java提供的统一访问多种数据库的API,是Java的统一规范接口。ORM框架基本基于JDBC(我个人接触过的都是这样),在JDBC上封装更高级的接口。比如Hibernate,Mybatis都是基于JDBC的。使用JDBC是原生的访问数据库的方式,JDBC的问题是侵入式代码+连接问题+细节过多。

使用JDBC,SQL语句硬编码到java文件中,修改很不方便,如果是遗留系统基本没法改。

使用JDBC频繁开闭连接,导致资源浪费。

细节过多,对于一个用户来说只想要通过一个SQL完成一项查询,但是JDBC暴露了过多细节比如PreparedStatement,增加了用户工作量不说,还带来了使用上的问题。

针对以上这些情况,出现了解决方案ORM框架。

现在比较常用的ORM框架是Hibernate和Mybatis。前几年比较流行Hibernate,不知道现在是不是依然流行。不过我的朋友们告诉我,现在都在用Mybatis,哈哈,好几年没玩过这一套,其实早就跟不上时代了。但是既然最近接到了这方面的任务,就趁这个机会,多了解一下吧。

Hibernate

Hibernate通过POJO与xml/注解提供的规则映射到数据表上,是一种全表映射。全表映射会带来优势,但会有一些问题。Hibernate高度封装JDBC,甚至HQL替代了SQL,直接操作POJO更贴近面向对象的思想,但HQL同样带来问题。

优点:

  • HQL直接通过对象操作数据,Hibernate提供的映射支持用户更专注于业务而非数据;
  • XML的可配置特点,使修改、更新更方便;
  • HQL做到数据库无关,具有更好的移植性。

缺点:

  • 全表映射导致全表数据的获取和发送,可能产生浪费;
  • 多表关联比较麻烦,使用上很不方便;
  • HQL性能较差,需要优化,这也是Hibernate比较难的地方。

Mybatis

针对Hibernate的问题,Mybatis提出了新的解决方案。
Mybatis比起Hibernate属于半自动化框架,当然也是通过XML或者注解配置的,需要配置POJO,SQL,关系,这解决了Hibernate的很大一部分问题比如 HQL问题,多表联合和全表映射带来的问题。同时由于基于SQL,所以学习的成本也低了些,毕竟大部分人还是对SQL熟悉一些。但因此,Mybatis比起Hibernate也增加了一些工作量。

优点:

  • 非侵入代码,易维护;
  • 自定义SQL,比起Hibernate全表映射,不会产生浪费;
  • 多表联合、复杂语句上支持更好;
  • 基于SQL,学习更简单;

缺点:

  • 半自动化,工作量比Hibernate稍多一些;
  • 本身并非重量级框架,对比Hibernate,在级联、缓存上有差距(?此处没有更深的了解过,道听途说罢了。)

JDBC,Mybatis,Hibernate应用

对于三者的性能对比,已经有很多人做过了,JDBC具有最优秀的查询效率,如果关注效率且偏底层,显然JDBC最合适。

而Mybatis对比Hibernate没有太大的差别,根据应用场景的不同而不同,Hibernate优化过SQL的查询效率可能还要高于Mybatis,所以他们在这方面似乎没有太大的区别。但是Mybatis对于SQL的灵活配置是比Hibernate更优秀的地方。

如果项目需要大量的多表查询、复杂语句,Mybatis可能更合适。

如果特别强调开发速度,专注业务层面,可能Hibernate更合适一些。

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

原创粉丝点击