jdbc,mybatis,hibernate各自优缺点及区别
先比较下 jdbc 编程和hibernate编程各自的优缺点。
JDBC:
我们平时使用 jdbc 进行编程,大致需要下面几个步骤:
1,使用 jdbc 编程需要连接数据库,注册驱动和数据库信息
2,操作 Connection,打开 Statement 对象
3,通过 Statement 对象执行 SQL,返回结果到 ResultSet 对象
4,使用 ResultSet 读取数据,然后通过代码转化为具体的 POJO 对象
5,关闭数据库相关的资源
jdbc 的缺点:
一:工作量比较大,需要连接,然后处理 jdbc 底层事务,处理数据类型,还需要操作 Connection,Statement 对象和 ResultSet 对象去拿数据并关闭他们。
二:我们对 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 所有能做到的事情。
什么时候使用 Hibernate,Mybatis
Hibernate 作为留下的Java orm 框架,它确实编程简易,需要我们提供映射的规则,完全可以通过 IDE 生成,同时无需编写 sql 确实开发效率优于 Mybatis。此外 Hibernate 还提供了缓存,日志,级联等强大的功能,但是 Hibernate 的缺陷也是十分明显,多表关联复杂 sql,数据系统权限限制,根据条件变化的 sql,存储过程等场景使用 Hibernate 十分不方便,而性能又难以通过 sql 优化,所以注定了 Hibernate 只适用于在场景不太复杂,要求性能不太苛刻的时候使用。
如果你需要一个灵活的,可以动态生成映射关系的框架,那么 Mybatis 确实是一个最好的选择。它几乎可以替代 jdbc,拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存,日志,级联。但是它的缺陷是需要你提供映射规则和 sql,所以开发工作量比 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 框架。