JDBC,Hibernate,Mybatis对比

1.首先区别ODBC和JDBC

       ODBC(OpenDatabase Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。

       一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。

       JDBC(Java DataBase Connectivity)它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库。JDBC也是Java核心类库的一部分。

       JDBC的最大特点是它独立于具体的关系数据库。与ODBC类似,JDBC API 中定义了一些Java类分别用来表示与数据库的连接(Connections),SQL语句(SQL Statements),结果集(ResultSets)以及其它的数据库对象, 使得Java程序能方便地与数据库交互并处理所得的结果。使用JDBC, 所有Java程序(包括Java Applications, Applets和Servlet)都能通过SQL语句或存储在数据库中的过程(Stored Procedures)来存取数据库。

       要通过JDBC来存取某一特定的数据库,必须有相应的JDBC Driver,它往往是由生产数据库的厂家提供,是连接JDBC API与具体数据库之间的桥梁。

       通常,Java程序首先使用JDBC API来与JDBC Driver Manager交互,由JDBC Driver Manager载入指定的JDBC Driver, 以后就可以通过JDBC API来存取数据库。


2.JDBC, Hibernate, Mybatis各自的优缺点

JDBC:

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

  (1)使用JDBC编程需要连接数据库,注册驱动和数据库信息。

  (2)操作Connection,打开Statement对象。

  (3)通过Statement对象执行SQL,返回结果到ResultSet对象。

  (4)使用ResultSet读取数据,然后通过代码转化为具体的POJO对象。

  (5)关闭数据库相关的资源。

JDBC的缺点:

(1)工作量比较大,需要连接,然后处理JDBC底层事务,处理数据类型,还需要操Connection,Statement对象和ResultSet对象去拿数据并关闭它们。

(2)我们对JDBC编程可能产生的异常进行捕捉处理并正确关闭资源。

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

Hibernate:

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

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做不到。

Mybatis:

       为了解决Hibernate的不足,Mybatis出现了,Mybatis是半自动的框架。之所以称它为半自动,是因为它需要手工匹配提供POJO,SQL和映射关系,而全表映射的Hibernate只需要提供POJO和映射关系即可。

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


3.什么时候使用Hibernate,Mybatis

       Hibernate作为留下的Java ORM框架,它确实编程简易,需要我们提供映射的规则,完全可以通过IDE生成,同时无需编写SQL确实开发效率优于Mybatis。此外Hibernate还提供了缓存,日志,级联等强大的功能,但是Hibernate的缺陷也是十分明显,多表关联复杂sql,数据系统权限限制,根据条件变化的SQL,存储过程等场景使用Hibernate十分不方便,而性能又难以通过SQL优化,所以注定了Hibernate只适用于在场景不太复杂,要求性能不太苛刻的时候使用。

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


4.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框架。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356