MyBatis和ORM的区别以及Mybatis和Hibernate的区别

ORM: 即Object Relation Mapping,即对象关联映射。所以ORM就是将Java中的对象和数据库中的表关联对应起来。

思考一下Mybatis,Mybatis相当于将mapper中的入参和出参结果集封装到java的POJO类中,听上去好像就是ORM啊?!

但是实际上Mybatis是半ORM,它鼓励开发人员自己去写sql,也正是因为sql语句要自己写,所以Mybatis是将java方法与sql语句关联起来,而没有将java对象与数据库关联起来。

这样Mybatis的好处就是如果我们懂得sql开发和调优,我们就可以对sql进行更好的管理和优化,同时,我们也可以充分利用数据库的各种功能,比如存储视图以及各种复杂的查询及某些数据库的专有特性。有好处的同时也有坏处啊,因为要自己写sql,所以在面对众多的数据库时,通过这种方式会导致平台的可移植性并不是很高。

说了半天那么有没有真`ORM框架呢?
到这我们就不得不把另外一位请出来了,Hibernate~
上文说道Mybatis是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。
那么Hibernate也是非常流行的ORM框架,通过对数据对象的操作为数据库结构提供了较为完整的封装。
所以通过说Mybatis和ORM的区别就引到了Mybatis和Hibernate区别。


接下来说一下Mybatis和Hibernate的区别

  1. 主要区别比较
    Mybatis是将java方法和sql语句进行关联,半自动,Hibernate则是java对象和数据库进行关联,全自动。Mybatis需要自己动手编写SQL语句及resultMap等,而Hibernate通过映射机制让我们不再关注SQL的生成和结果映射,可以更集中关注于业务。
  2. 开发难度
    Mybatis的开发难度要比Hibernate低,因为Mybatis需要我们写的SQL,大多数的程序员应该在学校的时候就开始写SQL了,而后期直接在SQL的基础上进行调优也是很亲切熟悉有思路的。
    而Hibernate则需要通过大量的配置使框架自动对数据库进行发送sql语句,从而完成我们想要进行的数据库操作,虽然Hibernate也可以自己写SQL来制定需要查询字段,但是这就破坏了框架的特性了。
  3. 移植性
    通过上面开发难度的对比,其实就可以带到他的移植性对比上了,Mybatis易上手,自己写SQL,但是我们自己写的SQL毕竟还是和我们当时所依赖的数据库相关,所以SQL与数据库的耦合性导致了如果写的SQL与很多数据库不通用的话就会导致Mybatis的可移植性下降很多。
    而Hibernate其强大的映射结构和HQL就降低了对象与各个数据库的耦合性,Hibernate与数据库的具体关联都写在XML中,所以HQL就对我们当前用的什么数据库或者以后要用什么数据库不是很care了。
  4. 日志系统
    Mybatis没有日志统计的功能,所以需要借助log4j,而HIbernate就有日志统计并且其日志系统非常健全,包括SQL记录、关系异常、缓存提示、优化警告脏数据警告等。
  5. SQL优化
    Mybatis是自己手写SQL,SQL写在XML中或注解中,既然能写SQL那么也得自己来优化SQL,优化的方式就和SQL优化方式一样,所以在使用Mybatis的时候你只需要思考你应该如何优化你的SQL。
    Hibernate在SQL优化方面则是比较困难了,Hibernate的概念中Java对象拥有三种状态。瞬时状态,游离状态,持久状态,当这些状态发生改变时,Hibernate框架会自动的对数据库发送sql语句,从而完成对数据库的操作。因为Hibernate有QBC,HQL,SQL三种查询方式,其SQL很多都是自动生成的,我们没有办法较为直接的去维护SQL这意味着我们在SQL语句优化时会遇到一定的困难。
  6. 缓存机制
    MyBatis的二级缓存配置是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。Mybatis使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
    Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存,对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

当然二者也不全是不同,接下来说一下两者的相同之处。
Mybatis和Hibernate都运用了ORM的思想,都Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期差不多并且Hibernate和MyBatis都支持JDBC和JTA事务处理,其二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。


优略势总结

Mybatis优势

  • Mybatis入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
  • 二级缓存机制不佳。

Hibernate优势

  • Hibernate的数据库无关性好,O/R映射能力强,功能强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

形象比喻(这个比喻真的太好了)

  • mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。
  • hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。

参考
https://www.zhihu.com/question/21104468
https://baijiahao.baidu.com/s?id=1598595163822471051&wfr=spider&for=pc
https://blog.csdn.net/qq_41378597/article/details/88070335
https://www.cnblogs.com/lixuwu/p/10941649.html
https://www.zhihu.com/question/21104468

你可能感兴趣的:(Java,mybatis,java,数据库)