hibernate 与 mybatis 的区别

来源:互联网 发布:淘宝网小商品 编辑:程序博客网 时间:2024/06/05 01:08

面试被问到了这个,在这里总结一下

二者区别从以下几个方面来进行对比阐述

一  开发速度

  hibernate掌握起来要难于mybatis,但是mybatis易上手同时也比较简陋。

开发速度要基于项目而谈,如果一个项目中需要的复杂的查询语句较少,就是较为简单的增删改查,选择hibernate开发速度会很快。因为hibernate已经将基本sql语句feng封装,不需要自己去写sql语句,这样会节省大量的时间。 开发大型项目如果复杂的查询语句较多,选择hibernate不是最优的(当然项目里hibernate大神较多就另说了)一般选择mybatis去开发。


二  开发工作量

hibernate与mybatis都有自己的代码生成工具,可以生成简单的DAO层代码。对于高级查询来说,mybatis需要自己手动编写Sql语句,以及ResultMap(映射)。   而hibernate有良好的映射机制,开发者无需关心sql生成和结果映射,更加专注于业务流程。


三  sql优化

hibernate查询会将表中所有字段查询出来,这一点会消耗数据库性能。虽然hibernate也可以通过自己写sql语句来指定查询字段,但是这样使用破坏了hibernate开发的简洁性。 而mybatis是手动编写,所以sql优化起来更加容易,可以按需查询。


四  对象管理

hibernate是完整的对象-关系映射解决方案,它提供了对象管理状态功能,这样开发者就不用关心底层系统数据库细节。简而言之,对于常见的JDBC/SQL持久方案中需要管理SQL语句来说,hibernate采用了更加自然的面向对象视角来持久化java应用中的数据,开发者总是关注对象的状态而不必考虑SQL语句的执行。这一部分已经被hibernate掌控妥当。进行系统调优时才需要深入了解。mybatis没有说明,用户需要自己对对象进行详细管理。


五  缓存机制

hibernate有一级缓存跟二级缓存。

一级缓存是对session的缓存,使用一级缓存需要对session的生命周期管理好,最好在一个action操作中使用一级缓存。 

        二级缓存是对SessionFactory级的缓存,sessionFactory的缓存。

mybatis包含一个强大的查询缓存,方便配置。默认情况下没开启缓存,除了局部的session缓存,若要开启二级缓存需要在sql映射文件中添加<cache/>详细解释在文末端。

二者相同点:hibernate和mybatis的二级缓存除了采用系统默认的缓存机制,都可以通过自己的缓存或者第三方缓存,创建适配器来完全覆盖缓存。

二者不同点:hibernate的二级缓存配置在sessionFactory生成的配置文件中详细配置,在具体的表-映射中配置是哪种缓存。hibernate对查询对象有良好的管理机制,用户无需关心sql。所以使用二级缓存出现脏数据,系统会提示并报错。

      mybatis的二级缓存都是在每个具体的表-对象映射中配置,这样针对不同的表就有不同的缓存机制。mybatis使用二级缓存要小心。如果不能完全确定数据更新操作的范围避免使用,脏数据会给系统正常运行带来很大隐患。

     


原创粉丝点击