JDBC,Hibernate,MyBatis的优缺点
一.JDBC
首先让我们来总结一下使用传统JDBC操作数据需要经过哪几个步骤:
- 使用JDBC编程需要连接数据库,注册驱动和数据库信息。
- 操作Connection,打开 Statement 对象 。
- 通过Statement执行SQL, 返回结果到ResultSet对象。
- 使用ResultSet读取数据,然后通过代码转化为具体的POJO对象。
- 关闭数据库的相关资源。
那么,如果我们还是继续使用传统的JDBC方式来操作数据库会存在哪些优缺点呢?
JDBC优点:
- 简单易学,上手快,非常灵活构建SQL,效率高。
- 因为它是原始,所以封装的内容不多,可控性好。
JDBC缺点:
- 工作量相对较大,操作相对繁琐。我们需要先连接,然后处理JDBC底层事务,处理数据类型。我们还需要操作Connection对象、Statement对象和ResultSet对象去拿到数据,并准确的关闭它们。
- 我们要对JDBC编程可能产生的异常进行捕捉处理并正确关闭资源。
- jdbc没有实现数据的缓存,在面对需要不断向数据库发送请求的情况时,效率非常不乐观。
对于一个JDBC操作简单的SQL尚且如止的复杂,何况是更为复杂的应用呢?所以这种模式很快的就被一些新 的方法所取代了。于是ORM就出现了。不过,我们要知道所有的ORM模型都是基于对JDBC的进行封装,不同的ORM模型对JDBC封闭的强度是不一样的。
那么问题来了。什么是ORM模型。ORM模型的作用是什么 。为什么要用ORM模型等一系列疑问。
由于JDBC存在的缺陷,所以我们在实际工作中很少使用JDBC进行操作数据库的编程。于是我们就提出了对象关系映射(Object Relational Mapping)简称 ORM,或者O/RM,或者 O/R mapping。
什么是ORM模型?
ORM模型就是数据库的表和简单Java对象(Plain Ordinary Java Object,简称POJO)的映射关系模型。
ORM模型的作用是什么 ?
它主要解决数据库数据和POJO对象的相互映射。我们通过这层映射就可以简单的把数据库表的数据转化为POJO。以便程序员更加容易的理解和应用Java程序.而且程序员一般只需要了解Java应用而无需对数据库进行深入的了解。此外,ORM模型提供了统一的规则使得数据库的数据通过配置便可轻易的映射到POJO上。
目前我们接触到有Hibernate和MyBatis。
二.Hibernate:
Hibernate是建立在若干POJO通过xml映射文件(或注解)提供的规则映射到数据库表上的。我们可以通过POJO直接操作数据库的数据,他提供的是一种全表映射的模型。相对而言,Hibernate对JDBC的封装程度还是比较高的,我们已经不需要写SQL,只要使用HQL语言就可以了。
Hibernate优点:
- 消除了代码的映射规则,它全部分离到了xml或者注解里面去配置。
- 无需在管理数据库连接,它也配置到xml里面了。
- 一个会话中不需要操作多个对象,只需要操作Session对象。
- 关闭资源只需要关闭一个Session便可。
这就是Hibernate的优势,在配置了映射文件和数据库连接文件后,Hibernate就可以通过Session操作,非常容易,消除了jdbc带来的大量代码,大大提高了编程的简易性和可读性。Hibernate还提供了级联,缓存,映射,一对多等功能。Hibernate是全表映射,通过HQL去操作pojo进而操作数据库的数据。
Hibernate的缺点:
- 全表映射带来的不便,比如更新时需要发送所有的字段。
- 无法根据不同的条件组装不同的SQL。
- 对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
- 不能有效的支持存储过程。
- 虽然有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所有能做到的事情。
MyBatis优点:
- 简单易学
- 灵活
- 可维护性高
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
MyBatis缺点:
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
四.那么什么时候使用Hibernate,Mybatis呢?
Hibernate作为留下的java orm框架,它确实变成简易,需要我们提供映射的规则,完全可以通过IDE生成,同时无需编写sql确实开发效率优于Mybatis。此外Hibernate还提供了缓存,日志,级联等强大的功能,但是Hibernate的缺陷也是十分明显,多表关联复杂sql,数据系统权限限制,根据条件变化的sql,存储过程等场景使用Hibernate十分不方便,而性能又难以通过sql优化,所以注定了Hibernate只适用于在场景不太复杂,要求性能不太苛刻的时候使用。
如果你需要一个灵活的,可以动态生成映射关系的框架,那么Mybatis确实是一个最好的选择。它几乎可以替代jdbc,拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存,日志,级联。但是它的缺陷是需要你提供映射规则和sql,所以开发工作量比hibernate要大些。