数据库中的持久化指的是数据的生命周期比程序的执行周期更长。持久化就是指将数据存储得尽可能长久,至于多久没有限制,但至少要久于程序的运行周期(即程序退出后,数据仍然要在)。在通常情况下,持久化就是将数据写入硬盘中,以达到长期存储的目的。
从结绳记事、甲骨文到竹简、纸张,再到如今的磁盘、硬盘,随着时代的变迁,数据的存储介质技术也在不断进化。不管是容量还是存储的安全性和持久性,都发生了质的变化。
我们为什么要想方设法地长久存储数据呢?因为数据非常重要!如今,人们每天都在产生数据,也越来越离不开数据,如看过什么电影、听过什么音乐、去过什么地方等。这些数据就是我们的电子记忆。所谓“硬盘有价,数据无价”,数据对于一个企业的重要性不言而喻。试想一下,如果腾讯的用户数据丢失会出现什么后果?可能你跟很多人就此断了联系。也许这对你的影响不算太大,那么再试想一下,如果支付宝或者银行的数据丢失会出现什么后果?想到这里,真为我那两位数的存款捏一把汗!
发展
持久化操作(对数据库的操作)一直都是Java的核心内容,并且在Java的发展历史中,数据库持久化层面的技术也在不断地发展与更新。JDBC(Java Database Connectivity)是Java中访问数据库的规范,由Sun公司(2009年被Oracle收购)制定。原生的JDBC代码臃肿、冗余、非常难用,使得Java EE在当时备受质疑,所以Sun公司推出了EJB。现在已经少有人提及EJB(当年靠着Sun公司的力捧名噪一时)了,这是因为EJB太重量级、太难用,很快就被Hibernate所取代(事实再一次告诉我们,“打铁还需自身硬”)。
Hibernate凭借自身强大的功能迅速走红,与Struts和Spring组成了当时风靡一时的SSH组合。后来,Sun公司借鉴了Hibernate的设计思路,制定了JPA(Java Persistence API)规范。在Hibernate后来的版本中,也实现了对JPA的完全支持。这也使得Hibernate在当时进一步巩固了自己在持久层框架的“霸主”地位。
走JPA路线的Hibernate发展得“风生水起”,但JDBC并没有因此“沉沦”。随着互联网的发展,尤其是移动互联网的飞速扩展,MyBatis(基于JDBC的轻量级持久层框架,前身是iBatis)凭借其简单、高效、灵活等特点迅速成为新时代的“宠儿”。
派系之争
目前,Java的持久层框架分为两派:一派是以Hibernate为代表的JPA路线;另一派是以MyBatis为代表的JDBC路线。两派在“江湖”上都有很多拥护者,而业界对于两者孰好孰坏的争论也从未停止过。通过图6-1和图6-2,我们可以直观地感受一下两者在国内和国外的关注度。
通过上面两张图,我们可以发现一个有意思的结果:国内和国外对于两者的关注度正好相反,国内更关注MyBatis,而国外则更关注Hibernate。我们再来看一组数据,如图6-3所示
可以看出,亚洲地区普遍更关注MyBatis,而欧美地区更关注Hibernate,这很有意思。
Hibernate实现了JPA规范,而MyBatis则是基于JDBC的进一步封装;Hibernate更关注实体,而MyBatis则更关注表。Hibernate对数据库的操作封装得极好,几乎完全屏蔽了不同数据库之间的差异,如果需要进行数据库迁移,也毫不费力。MyBatis则更加灵活多变,对于SQL优化更加友好。JPA与JDBC的对比如图6-4所示。
JPA和MyBatis就像气宗和剑宗一样,气宗并非不练剑招,剑宗也并非不练内功,只不过两者的侧重点不同而已。那一晚,华山派在药王庙集体被困,提126不起半点内力的令狐冲凭借着精妙的“独孤九剑”连败两名剑宗高手——丛不弃和封不平,后来又以一招“破箭式”刺瞎15名黑衣蒙面人的眼睛而一战成名。
身怀“紫霞神功”的气宗传人岳不群被敌人所擒,而内力尽失的令狐冲却凭借刚学会不久,甚至还不太熟练的“独孤九剑”就将强敌一一击溃。这难道说明剑宗的理念远远超过气宗的理念吗?很明显,不是的。令狐冲能够取胜主要有两个原因:一是“独孤九剑”招式奇特,打了对手一个措手不及;二是对手虽然武功不错,但也绝非顶尖高手。令狐冲后来成为顶尖高手,还是因为他兼具了深厚的内力和精妙的剑法,这两者缺一不可。所以,我们也不用争论是Hibernate好,还是MyBatis棒,都学好才是硬道理!