hibernate mysql 性能_MyBatis和Hibernate相比,优势在哪里?

MyBatis和Hibernate相比,优势在哪里?

发布时间:2020-06-07 22:57:08

来源:51CTO

阅读:435

作者:qq5923dd411b8fa

栏目:数据库

1、开发对比开发速度

hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。

开发社区

Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2。

开发工作量

Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。

针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。

2、系统调优对比Hibernate的调优方案制定合理的缓存策略;

尽量使用延迟加载特性;

采用合理的Session管理机制;

使用批量抓取,设定合理的批处理参数(batch_size);

进行合理的O/R映射设计

Mybatis调优方案

MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。 MyBatis可以进行详细的SQL优化设计。

SQL优化方面

Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。

Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。

扩展性方面

Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。

3、对象管理与抓取策略对象管理

Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者不再需要理会底层数据库系统的细节。也就是说,相对于常见的 JDBC/SQL 持久层方案中需要管理 SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。

换句话说,使用 Hibernate 的开发者应该总是关注对象的状态(state),不必考虑 SQL 语句的执行。这部分细节已经由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。

而MyBatis在这一块没有文档说明,用户需要对对象自己进行详细的管理。

抓取策略

Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。 它是详细配置和处理的。

而Mybatis的延迟加载是全局配置的。

4、缓存机制对比Hibernate缓存

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

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

5、优势对比

Mybatis优势MyBatis可以进行更为细致的SQL优化,可以减少查询字段。

MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。

Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。

Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

愿意了解框架技术或者源码的朋友直接加求求(企鹅):2042849237

更多详细源码参考来源:http://×××/technology

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx离线安装_web高可用-基于keepalived和nginx

一.体系架构在Keepalived Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟…

C#数组的合并拆分

1.合并拆分数组 ///<summary>///合并数组 ///</summary>///<param name"First">第一个数组</param>///<param name"Second">第二个数组</param>///<returns>合并后的数组(第一个数组第二个数组&#xff…

VC嵌入python时debug版lib下载

前些天发的一个随笔中得知python做界面很强&#xff0c;加之以前也听说过&#xff0c;所以学习了一下&#xff0c;主要想看看python和C的互操作以取长补短。 化了大约4天时间草草看了《Python编程金典》&#xff0c;觉得思想和Java的差不多&#xff0c;面向对象的思想和机制都…

php mysql 实现原理_php+mysql分页原理实现

完整代码如下&#xff1a;!htmlhead-"-type"";GBK"styletype"text/css"body{font-size:12px;font-family:verdana;width:100%;}div.page{text-align:center;}div.content{height:300px;}div.pagea{border:#aaaadd1pxsolid;text-decoration:none;…

Tiny6410上安装debian基本系统的过程

Tiny6410上安装debian基本系统的过程&#xff1a;注&#xff1a;debootstrap工具可以在已有的任何linux中使用&#xff0c;不过建议用debian或其衍生系统(如ubuntu等)&#xff0c;以下步骤可以在电脑上做&#xff0c;也可以直接在Tiny6410上做&#xff0c;不过很慢&#xff0c;…

python任意代码都可以缩进去_我发现了个 Python 黑魔法,执行任意代码都会自动念上一段 『平安经』...

最近的"平安经"可谓是引起了不小的风波啊。作为一个正儿八经的程序员&#xff0c;最害怕的就是自己的代码上线出现各种各样的 BUG。为此&#xff0c;明哥今天分享一个 Python 的黑魔法&#xff0c;教你如何在你执行任意 Python 代码前&#xff0c;让 Python 解释器自…

域用户更改密码提示拒绝访问_AD域中的ACL攻防探索

前言关于域内ACL的攻防近两年经常被人所提起&#xff0c;同时也产生了很多关于域内ACL相关的工具和攻击方式&#xff0c;本文将会从ACL的概念谈起&#xff0c;然后介绍几种不同的域内攻击方式以及如何监测和防御对于ACL的攻击。ACL的概念和作用ACM&#xff1a;首先想要了解ACL首…

Codeforces Round #143 (Div. 2) C

http://codeforces.com/contest/231/problem/C 昨天的cf。比赛的时候其实有点思路的&#xff0c;但是因为B搞错方向了没敢写C。刚刚写了下&#xff0c;AC了。用的思路还真是昨天晚上的。囧。昨天晚上看的时候有一个地方不知道怎么转换&#xff0c;就是怎么快速求出i-->ians需…

go MySQL 多语句_八、MySQL经典查询语句-Go语言中文社区

student表course表score表teacher表1、 查询Student表中的所有记录的Sname、Ssex和Class列。select Sname,Ssex,Class from Student;2、 查询教师所有的单位即不重复的Depart列。select distinct Depart from Teacher3、 查询Student表的所有记录。select * from Student4、 查…

ffmpeg编译 MingW + MSYS

环境要求&#xff1a; MinGW:5.1.4 make: 3.81 gcc: 4.3.2 w32api: 3.13 SDL: 1.2.1 MinGW-Runtime:3.15 1.Minimal SYStem (MSYS) 安装 下载MSYS-1.0.10.exe并安装&#xff1a;下载地址&#xff1a;http://downl…

如何干净的删除vm_如何在macOS 10.15 Catalina绕过XProtect?

在macOS 10.15 Catalina中&#xff0c;Apple进行了许多安全性能地改进&#xff0c;包括通过使所有可执行文件都受XProtect扫描来加固系统&#xff0c;而不管文件是否带有com.apple.quarantine位标记。对于安全研究人员而言&#xff0c;这意味着不再像以前的macOS一样&#xff0…

vtun中setsockopt fcntl等有关套接字设置

client.c文件中在建立socket后有一句 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); SO_REUSEADDR允许重用本地地址。 client.c文件在bind之后的connec_t函数中&#xff0c; 先将socket设为非阻塞&#xff0c;然后connect 然后select然后再将socket状态改为…

mysql行级锁作用_Mysql事务及行级锁的理解

在最近的开发中&#xff0c;碰到一个需求签到&#xff0c;每个用户每天只能签到一次&#xff0c;那么怎么去判断某个用户当天是否签到呢&#xff1f;因为当属表设计的时候&#xff0c;每个用户签到一次&#xff0c;即向表中插入一条记录&#xff0c;根据记录的数量和时间来判断…

activexobject对象不能创建_Oracle数据库用户管理之系统权限和对象权限

【关键术语】Privileges 权限System privileges 系统权限Object privileges 对象权限Grant 授予Revoke 撤消2.1 Oracle 权限概述2.1.1 权限的作用权限(privilege)是指执行特定类型 SQL 命令或访问其他模式对象的权利。Oracle 使用 权限来控制用户对数据的访问以及用户所能执行的…

视频文件大小计算

1.每小时录像文件大小计算公式: 码率大小*3600/8/1024 MB/小时。2.硬盘录像机硬盘容量计算公式: 每小时录像文件大小*每天录像时间&#xff08;时&#xff09;*硬盘录像机路数*需要保存的天数。例如&#xff1a;8路硬盘录像机&#xff0c;音视频录像&#xff0c;采用512Kbps定…

【啃不完的算法导论】- 动态规划 - 最长公共子序列(概念篇)

以下内容纯是为了熟悉《算法导论》中的内容&#xff0c;高手可略过&#xff0c;其中涉及的书本内容的版权归原作者、译者、出版社所有 求最长公共子序列&#xff0c;一个典型的 动态规划题 和 字符串处理算法&#xff0c;写在这里是希望自己以后能多来看看和改改&#xff0c;温…

python发送邮箱_你知道怎么用Python发送邮件吗?

作者 | 陈熹来源 | 早起Python(ID&#xff1a;zaoqi-python)头图 | CSDN 下载自东方IC前言本文主要对邮件操作基础知识及代码进行介绍&#xff0c;用Python发邮件有哪些优势&#xff1f;批量发送邮件&#xff0c;并且各邮件可以不同高度自定义的定时发送更有效地管理收件箱基本…

解决 avformat_alloc_context无法识别的问题

由于最近库更新&#xff0c;如果还是用原来的测试用例会碰到avformat_alloc_context 无法识别的问题 avformat_alloc_context is cannot indentified。 解决办法就是将 ocavformat_alloc_context 改成 ocav_alloc_format_context(); 就ok啦 注:我用的库是FFmpeg-full-SD…

python去空格的函数_Python怎么去掉最后的空格

strip()函数 去空格nrt函数的用法 strip 同时去掉左右两边的空格&#xff08;推荐学习&#xff1a;Python视频教程&#xff09; lstrip 去掉左边的空格 rstrip 去掉右边的空格 具体示例如下&#xff1a;>>>a" hello world&#xff01;&#xff01; " >&g…

Java中getResource()的用法

用JAVA获取文件&#xff0c;听似简单&#xff0c;但对于很多像我这样的新人来说&#xff0c;还是掌握颇浅&#xff0c;用起来感觉颇深&#xff0c;大常最经常用的&#xff0c;就是用JAVA的File类&#xff0c;如要 取得c:/test.txt文件&#xff0c;就会这样用File file new Fil…