我对hibernate和mybatis框架的比較

系统在选择操作数据库的框架上面,究竟是选择hibernate,还是mybatis。

首先说下两者的原理,假设你要关联几张表做查询,查出20条记录:

1.假设是mybatis

SELECT *

FROM (SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM

FROM (select SP_WORK_PLAN.name, sprocorgan1_.code --仅仅是查询

from SP_WORK_PLAN      workplanvo0_,

v_sp_organization sprocorgan1_,

V_SP_USER         sprocuserv2_,

v_sp_organization sprocorgan3_,

V_SP_USER         sprocuserv4_,

V_SP_USER         sprocuserv5_,

v_sp_organization sprocorgan6_

from workplanvo0_.APPLY_DEPARTMENT_OID =

sprocorgan1_.ORG_ID and

workplanvo0_.CONFIRMATION_UID = sprocuserv2_.USER_ID and

sprocuserv2_.ORG_ID = sprocorgan3_.ID and

workplanvo0_.CREATE_UID = sprocuserv4_.USER_ID and

workplanvo0_.WORK_MASTER_UID = sprocuserv5_.USER_ID and

workplanvo0_.WORK_TEAM_ID = sprocorgan6_.ORG_ID) INNER_TABLE

WHERE ROWNUM <= 20) OUTER_TABLE

WHERE OUTER_TABLE_ROWNUM > 0;

2.假设是hibernate,像以下的SQL要查20次。

select

workplanvo0_.ID as ID9_6_,

workplanvo0_.UPDATE_TIME as UPDATE2_9_6_,

workplanvo0_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_9_6_,

workplanvo0_.CODE as CODE9_6_,

workplanvo0_.DATA_FROM as DATA5_9_6_,

workplanvo0_.DATA_STATE as DATA6_9_6_,

workplanvo0_.END_LIFECYCLE as END7_9_6_,

workplanvo0_.NAME as NAME9_6_,

workplanvo0_.START_LIFECYCLE as START9_9_6_,

workplanvo0_.FLOW_STATE as FLOW10_9_6_,

workplanvo0_.PROCESS_INS_ID as PROCESS11_9_6_,

workplanvo0_.ACTUAL_END_TIME as ACTUAL12_9_6_,

workplanvo0_.ACTUAL_START_TIME as ACTUAL13_9_6_,

workplanvo0_.APPLY_DEPARTMENT_OID as APPLY40_9_6_,

workplanvo0_.ATTENTION_LEVEL as ATTENTION14_9_6_,

workplanvo0_.COMPLETE_CONDITION as COMPLETE15_9_6_,

workplanvo0_.CONFIRMATION_TIME as CONFIRM16_9_6_,

workplanvo0_.CONFIRMATION_UID as CONFIRM41_9_6_,

workplanvo0_.CREATE_UID as CREATE42_9_6_,

sprocorgan1_.ID as ID26_0_,

sprocorgan1_.UPDATE_TIME as UPDATE2_26_0_,

sprocorgan1_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_26_0_,

sprocorgan1_.CODE as CODE26_0_,

sprocorgan1_.DATA_FROM as DATA5_26_0_,

sprocorgan1_.DATA_STATE as DATA6_26_0_,

sprocorgan1_.END_LIFECYCLE as END7_26_0_,

sprocorgan1_.NAME as NAME26_0_,

sprocorgan1_.START_LIFECYCLE as START9_26_0_,

sprocorgan1_.AREA_ID as AREA10_26_0_,

sprocorgan1_.STATE as STATE26_0_,

sprocuserv2_.ID as ID27_1_,

sprocuserv2_.UPDATE_TIME as UPDATE2_27_1_,

sprocuserv2_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_27_1_,

sprocuserv2_.CODE as CODE27_1_,

sprocuserv2_.DATA_FROM as DATA5_27_1_,

sprocuserv2_.DATA_STATE as DATA6_27_1_,

sprocuserv2_.END_LIFECYCLE as END7_27_1_,

sprocuserv2_.NAME as NAME27_1_,

sprocuserv2_.START_LIFECYCLE as START9_27_1_,

sprocuserv2_.ACCOUNT as ACCOUNT27_1_,

sprocorgan3_.ID as ID26_2_,

sprocorgan3_.UPDATE_TIME as UPDATE2_26_2_,

sprocorgan3_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_26_2_,

sprocorgan3_.CODE as CODE26_2_,

sprocorgan3_.DATA_FROM as DATA5_26_2_,

sprocorgan3_.DATA_STATE as DATA6_26_2_,

sprocuserv4_.ID as ID27_3_,

sprocuserv4_.UPDATE_TIME as UPDATE2_27_3_,

sprocuserv4_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_27_3_,

sprocuserv4_.CODE as CODE27_3_,

sprocuserv4_.DATA_FROM as DATA5_27_3_,

sprocuserv4_.DATA_STATE as DATA6_27_3_,

sprocuserv4_.END_LIFECYCLE as END7_27_3_,

sprocuserv4_.NAME as NAME27_3_,

sprocuserv5_.ID as ID27_4_,

sprocuserv5_.UPDATE_TIME as UPDATE2_27_4_,

sprocuserv5_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_27_4_,

sprocuserv5_.CODE as CODE27_4_,

sprocuserv5_.DATA_FROM as DATA5_27_4_,

sprocuserv5_.DATA_STATE as DATA6_27_4_,

sprocuserv5_.END_LIFECYCLE as END7_27_4_,

sprocorgan6_.ID as ID26_5_,

sprocorgan6_.UPDATE_TIME as UPDATE2_26_5_,

sprocorgan6_.OPTIMISTIC_LOCK_VERSION as OPTIMISTIC3_26_5_,

sprocorgan6_.CODE as CODE26_5_,

sprocorgan6_.DATA_FROM as DATA5_26_5_,

sprocorgan6_.DATA_STATE as DATA6_26_5_,

sprocorgan6_.END_LIFECYCLE as END7_26_5_,

sprocorgan6_.NAME as NAME26_5_,

sprocorgan6_.START_LIFECYCLE as START9_26_5_,

sprocorgan6_.STATE as STATE26_5_

from

SP_WORK_PLAN workplanvo0_

left outer join

v_sp_organization sprocorgan1_   on workplanvo0_.APPLY_DEPARTMENT_OID=sprocorgan1_.ORG_ID

left outer join

V_SP_USER sprocuserv2_   on workplanvo0_.CONFIRMATION_UID=sprocuserv2_.USER_ID

left outer join

v_sp_organization sprocorgan3_  on sprocuserv2_.ORG_ID=sprocorgan3_.ID

left outer join

V_SP_USER sprocuserv4_  on workplanvo0_.CREATE_UID=sprocuserv4_.USER_ID

left outer join

V_SP_USER sprocuserv5_  on workplanvo0_.WORK_MASTER_UID=sprocuserv5_.USER_ID

left outer join

v_sp_organization sprocorgan6_  on workplanvo0_.WORK_TEAM_ID=sprocorgan6_.ORG_ID

where  workplanvo0_.ID=? ;

1.设计阶段的影响

无法验证模型的合理性和预測性能。依据界面原型做数据库设计,长处是能够保证数据都能存到数据中,不足之处是无法保证模型的合理和性能。

假设调整架构用ibatis,我们能够在设计完毕后,写代码之前把复杂的查询写出来,制造一些数据进行性能预測。

2.开发阶段的影响

a.Hibernate无法使用层次查询、分析函数、正則表達式等。不错。hibernate有调用SQL的结果。假设通过接口调用SQL,不便于调试,用ibatis很适合调试。

b.在开发阶段也无法预測性能,就是測试SQL。

c.hibernate的内部实现比較复杂。假设没有人能读懂里面的源码。最好是仅仅使用最简单的增、删、改。查(依据主键查)。反观mybatis,实现非常easy。hold住。

3.运维阶段的影响

在运维阶段每天监控数据库,找到性能隐患,是业界的最佳实践。

假设是hibernate的架构,即使我们找出了问题SQL,也无法对修改SQL进行调优。由于它是生成处理的。最多加一个索引。

最后:所实用hibernate对DB操作。把hibernate当做一个SQL生成的工具。事实上就是把数据库当做一个黑盒。好像不须要对它有深入的了解,这样是被误导,看看我们如今有些组开发的报表开发工具,假设遇到大数据量,往往歇菜。

时间: 2024-10-07 14:01:18

我对hibernate和mybatis框架的比較的相关文章

我对hibernate和mybatis框架的比较

系统在选择操作数据库的框架上面,到底是选择hibernate,还是mybatis. 首先说下两者的原理,如果你要关联几张表做查询,查出20条记录: 1.如果是mybatis SELECT * FROM (SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM FROM (select SP_WORK_PLAN.name, sprocorgan1_.code --只是查询 from SP_WORK_PLAN      workplanvo0_, v_sp_o

Hibernate框架与Mybatis框架的对比

学习了Hibernate和Mybatis,但是一直不太清楚他们两者的区别的联系,今天在网上翻了翻,就做了一下总结,希望对大家有帮助! 原文:http://blog.csdn.net/firejuly/article/details/8190229 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R mapping框架.目前属于apache的

MyBatis框架与Hibernate 框架的区别,SpringMVC和MyBatis区别:

MyBatis框架与Hibernate 框架的区别 Hibernate 框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射.是一个全自动的.完全面向对象的持久层框架. Mybatis框架 Mybatis是一个开源对象关系映射框架,原名:ibatis,2010年由谷歌接管以后更名.是一个半自动化的持久层框架. 两者区别 开发方面 在项目开发过程当中,就速度而言:  - hibernate开发中,sql语句已经被封装,直接可以

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好Hibernate. 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求

Hibernate 与 mybatis 区别

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结 我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还

MyBatis框架知识整理

MyBatis框架 一.介绍: MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 和数据库打交道的技术有: 原生的JDBC技术---> Spring的JdbcTemplate技术 这些工具都是提供简单的SQL语句的执行,但是和我们这里学的MyBatis框架还有些不同,框架是一整套的东西,例如事务控制,查询缓存,字段映射等等. 我们用原生JDBC操作数据库的时候都会经过: 编写sql---->预编译---->设置参数----->执行sql

Mybatis框架中实现一对多关系映射

学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢? 其实很简单 首先我们照常先准备前期的环境(具体解释请  参考初识Mybatis进行增.删.改.查 blogs )这里我就直接上代码了 主配置文件:Configuration.xml <?xml version="1.0" encoding="UTF-8" ?&

【MyBatis框架】MyBatis入门程序第二部分

我们通过写一个简单的MyBatis小项目来在实战中学习MyBatis,接着上一篇继续 我们开始实现需求中的添加和删除用户功能 (1)向数据库中添加用户数据 使用User.xml,加入添加用户的sql语句. [html] view plain copy <!-- 添加用户 parameterType:指定输入参数类型是pojo(包括用户信息) #{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性 --> <insert id="ins

Hibernate与 MyBatis的比较

最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R mapping框架.目前属于apache的一个子项目. MyBatis 参考资料官网:http://www.mybatis.org/core/zh/index.html Hibernate参考资料: http