java中mybatis和hibernate的用法总结

 更新时间:2021年01月19日 11:18:13   作者:小妮浅浅  
在本篇文章里小编给大家整理的是一篇关于java中mybatis和hibernate的用法总结内容,有兴趣的朋友们可以学习参考下。

在项目开发上,hibernate提供的经验简化了不少工作量和兼容性,但这些绝对需要有经验后才能明白,对于新手来说使用起来很困难。hibernate比mybatis掌握难度要高一些,对sql的控制弱一些。下面我们就三个方面带来mybatis和hibernate的总结分析,一起来看看二者的比较吧。

1.开发效率

如果是做一些简单的CMS类似的只有简单的增删改查的项目,那么使用Hibernate更有优势,不需要掌握太多的Hibernate知识,只需要会一些基本的查询和一些配置(Hibernate真正要学会,个人感觉知识量比mybatis大很多)。hiberbate是用java对象拼sql,mybatis是直接写原生sql。hibernate提供了很好的映射机制,mybatis还需要自己写resultmap paramMap这些东西。Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。综上所述,那么从开发效率上来讲,Hibernate> mybatis。

2.可维护性

hiberbate是用java对象拼sql,mybatis是直接写原生sql。直接写SQL更容易维护,而前者需要通过java对象来看SQL,你得把sql,用System.out.println(sql);把SQL打印出来,才可以看到。Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。

3.性能

两者都提供了缓存,session机制。小项目两者差不多吧.大型项目mybatis>hibernate。

4.常见面试题

什么样的情况下,Hibernate 会慢MyBatis10倍?

当Hibernate用错了的情况下,会出现:P

比如, Hibernate的对象A里的内嵌对象B加载被你从默认懒加载改为预加载(假设你没有搞懂影响,就改动了配置), 你要查询对象A的列表,就会出现N+1查询, 但你的大部分业务逻辑又不需要读取内嵌对象B,性能就会很差。

而一般情况下MyBatis, 这种查询是需要手写的。 出现这种情况的概率较小。

知识点扩展:

Hibernate缓存

Hibernate一级缓存是Session缓存,利用好一级缓存就需要对Session的生命周期进行管理好。建议在一个Action操作中使用一个Session。一级缓存需要对Session进行严格管理。

Hibernate二级缓存是SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。

MyBatis缓存

MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。

默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行: <cache/>

字面上看就是这样。这个简单语句的效果如下:

  1. 映射语句文件中的所有 select 语句将会被缓存。
  2. 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
  3. 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
  4. 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
  5. 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  6. 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

到此这篇关于java中mybatis和hibernate的用法总结的文章就介绍到这了,更多相关java中mybatis和hibernate的总结内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java swing实现电影购票系统

    java swing实现电影购票系统

    这篇文章主要为大家详细介绍了java swing实现电影购票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • myeclipse导出可运行jar包简介

    myeclipse导出可运行jar包简介

    这篇文章主要介绍了myeclipse导出可运行jar包简介,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java线程中断及线程中断的几种使用场景小结

    Java线程中断及线程中断的几种使用场景小结

    在并发编程中,合理使用线程中断机制可以提高程序的鲁棒性和可维护性,本文主要介绍了Java线程中断及线程中断的几种使用场景小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Mybatis之通用Mapper动态表名及其原理分析

    Mybatis之通用Mapper动态表名及其原理分析

    这篇文章主要介绍了Mybatis之通用Mapper动态表名及其原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • springboot+vue2+elementui实现时间段查询方法

    springboot+vue2+elementui实现时间段查询方法

    这篇文章主要介绍了springboot+vue2+elementui实现时间段查询方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • java web实现邮箱激活与忘记密码

    java web实现邮箱激活与忘记密码

    这篇文章主要为大家详细介绍了java web实现邮箱激活与忘记密码、重置密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Java编程实现数组转成list及list转数组的方法

    Java编程实现数组转成list及list转数组的方法

    这篇文章主要介绍了Java编程实现数组转成list及list转数组的方法,结合实例形式较为详细的总结分析了java实现数组与list之间相互转换的操作技巧,需要的朋友可以参考下
    2017-09-09
  • mybatis plus实现条件查询

    mybatis plus实现条件查询

    这篇文章主要为大家介绍了mybatis plus实现条件查询,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 利用exe4j生成java的exe文件

    利用exe4j生成java的exe文件

    本文主要介绍了利用exe4j生成java的exe文件,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • SpringAop中的Advice通知实例

    SpringAop中的Advice通知实例

    这篇文章主要介绍了SpringAop中的Advice通知详解,Spring的AOP功能中一个关键概念是通知Advice与切点Pointcut表达式相关联在特定节点织入一些逻辑,Spring提供了五种类型的通知,需要的朋友可以参考下
    2023-09-09

最新评论