先从几个方面说说两者的区别:1.两者最大的区别:对于简单的逻辑,Hibernate和MyBatis都有对应的代码生成工具,可以生成简单基础的代码DAO层方法。对于高级查询,Mybatis需要手动编写SQL语句和ResultMap。Hibernate有很好的映射机制,开发者无需关心SQL的生成和结果映射,可以更专注于业务流程。2、相对于开发难度,Hibernate的开发难度要大于Mybatis。主要原因是Hibernate复杂庞大,学习周期长。Mybatis比较简单,Mybatis主要靠sql的编写,让开发者感觉比较熟悉。3.sql写法对比Mybatis的SQL是手工写的,所以可以根据自己的需要指定查询字段。但是没有自己的日志统计,所以使用log4j来记录日志。Hibernate也可以自己写SQL来指定需要查询的字段,但这破坏了Hibernate开发的简单性。但是Hibernate有自己的日志统计。4、数据库扩展性比较Mybatis的扩展性和迁移性差,因为所有的SQL都写在一个数据库里。Hibernate和数据库的具体关系是在XML中的,所以HQL不太关心具体使用的是什么数据库。5、缓存机制类似:除了系统默认的缓存机制外,Hibernate和Mybatis的二级缓存可以通过自己实现缓存或者为其他第三方缓存方案创建适配器来完全覆盖缓存行为。不同点:Hibernate的二级缓存配置是在SessionFactory生成的配置文件中详细配置,然后在具体的表-对象映射中配置。MyBatis的二级缓存配置在每个具体的表-对象映射中都进行了详细的配置,从而可以针对不同的表定制不同的缓存机制。而Mybatis可以通过Cache-ref在namespace中共享相同的缓存配置和实例。两者比较:由于Hibernate对查询对象有很好的管理机制,用户不需要关心SQL。所以在使用二级缓存时如果有脏数据,系统会报错并提示。对此,MyBatis在使用二级缓存时需要非常小心。如果不能完全确定数据更新操作的范围,避免盲目使用Cache。否则,脏数据的出现会给系统的正常运行带来极大的隐患。6、总结:mybatis:小巧、方便、高效、简单、直接、半自动hibernate:强大、方便、高效、复杂、迂回、全自动Hibernate和MyBatis都可以通过SessionFactoryBuider从XML配置文件生成SessionFactory,然后生成通过SessionFactorySession,最终Session用于开启和执行事务和SQL语句。MyBatis的优点是MyBatis可以进行更细致的SQL优化,减少查询字段,容易掌握。Hibernate的优点是DAO层开发比MyBatis简单,MyBatis需要维护SQL和结果映射。数据库移植性很好,但是MyBatis的数据库移植性不好,不同的数据库需要写不同的SQL。有更好的二级缓存机制,也可以使用第三方缓存。MyBatis本身提供的缓存机制并不好。mybatis:上手简单,学完就可以上手。为数据库查询提供自动对象绑定功能,延续了良好的SQL使用体验。它非常适合没有如此高对象模型要求的项目。可以进行更细致的SQL优化,减少查询字段。缺点是框架还是比较简单,功能还是有所欠缺。虽然简化了数据绑定代码,但整个底层数据库查询实际上需要自己编写,工作量比较大,不易适应快速修改数据库。二级缓存机制差。hibernate:功能强大,数据库独立性好,O/R映射能力强,如果你对Hibernate相当精通,并且对Hibernate进行了适当的封装,那么你项目的整个持久层代码就会相当简单,需要的代码要写的很简单Less,开发速度很快,很爽。有更好的二级缓存机制,也可以使用第三方缓存。缺点是学习门槛不低,熟练门槛更高,如何设计O/R映射,如何平衡性能和对象模型,如何用好Hibernate,需要你的经验和能力..打个形象比喻:mybatis:机械工具,简单易用,拿来就可以用,但还是得自己干活,但工具是活的,我决定怎么用。hibernate:智能机器人,但是开发它的成本(学习、熟练)非常高,工作可以摆脱他,但仅限于它能做什么。1.1.Mybatis解决jdbc编程问题1.频繁创建和释放数据库连接造成系统资源浪费,影响系统性能。如果使用数据库连接池,就可以解决这个问题。解决方法:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。2.sql语句写在代码中,导致代码难以维护。sql的实际应用可能变化很大,sql的变化需要改变java代码。解决方法:在XXXXmapper.xml文件中配置Sql语句,与java代码分离。3、给SQL语句传递参数比较麻烦,因为SQL语句的where条件不一定一定,可能多也可能少,占位符需要和参数一一对应。解决方法:Mybatis自动将java对象映射到sql语句,通过语句中的parameterType定义输入参数的类型。4.解析结果集比较麻烦。sql的变化导致解析代码的变化,需要先遍历再解析。将数据库记录解析成pojo对象更方便。解决方法:Mybatis自动将sql执行结果映射到java对象,通过语句中的resultType定义输出结果的类型。1.2.Mybatis不同于hibernate。Mybatis不同于hibernate。它不完全是一个ORM框架,因为MyBatis需要程序员自己写Sql语句。mybatis可以通过xml或者注解灵活配置运行的sql语句,将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果映射生成java对象。Mybatis学习门槛低,简单易学。程序员可以直接写nativesql,可以严格控制sql的执行性能,灵活性高。非常适合对关系数据模型要求不高的软件开发,比如互联网软件,企业运营软件等。因为这类软件的需求变化频繁,一旦需求变化,结果需要快速输出。但是灵活性的前提是mybatis不能是数据库无关的。如果需要实现支持多数据库的软件,需要自定义多套sql映射文件,工作量大。Hibernate具有强大的对象/关系映射能力和良好的数据库独立性。如果使用hibernate开发对关系模型要求高的软件(比如定制化的需求固定的软件),可以节省大量代码,提高效率。但是Hibernate的学习门槛和熟练门槛都比较高,如何设计O/Rmapping,如何在性能和对象模型之间权衡,如何用好Hibernate,都需要很强的经验和能力。总之,只要在有限的资源环境下,能够根据用户的需求做出一个具有良好可维护性和可扩展性的软件架构,就是一个好的架构,所以最好的框架才是合适的。如果这篇文章对你有帮助,别忘了连打3个,点赞、转发、评论,我们下期再见!获取方式:点赞、评论、关闭~学习更多JAVA知识技能,关注并私信博主(666)
