面试之mybatis和hibernate的区别

Posted 皇问天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试之mybatis和hibernate的区别相关的知识,希望对你有一定的参考价值。

mybatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架。封装了 几乎所有的JDBC代码和参数的手工设置 以及结果集的检索:

封装了:1,获取连接,执行sql,释放连接。

              2,sql的参数设置,属性自动传递参数(例如emp有name和age属性,sql语句写成“insert into emp (name,age) values(#{name},#{age})”就可以了,不用像jdbc                    一样还要用preparedstatement对象设置参数ps.setString(1,“xiaoming”)

              3,封装了记录映射成实体对象的的过程,(jdbc要自己写rowmapper)

hibernate也是当前流行的orm工具,访问数据库的框架,对数据结构提供了较完整的封装。

封装了:1,获取连接,sql编写,执行sql,释放连接。

              2,sql参数设置,

              3,记录封装成实体对象等一系列过程。

对比上面两个,一目了然,hibernate相比mabatis居然连sql编写也封装了。这点本质的不同,是mybatis与hibernate的最大区别,很多网上写的区别,看起来很乱,很头大其实大多都是从这点引发出来的。

接下来我们一点一点的说。

区别一:扩展性方面。使用mybatis要自己根据相应的数据库写不同的sql实现,例如用MySQL数据库写了一个sql的分页语句,如果换成了oracle数据库就用不了了。然而如果是hibernate的hql语句则是对实体类(User)和属性的操作,也拿分页查询来说,string hql=“from User”; Query q1=session.creatQuery(hql); q1.setFirstResult(m);q1.setMaxResult(n);   List<User> list=q1.list();会根据具体的数据库生成各自相应不同的查询的语句,所以移植性很好。

区别二:sql效率,优化方面。Hibernate的查询,更新都是对所有字段的操作例如(根据id查询,sessin.get(User.class,"id"),还有要session.update(对象)时,按照对象的id做条件,更新其他字段信息。如果想要更新部分字段,其他字段保持不变,则对象的其他字段对应的属性也要有原值),这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。maybatis的优化,就是对sql语句的优化,MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。hibernate的优化(可以记一下):

  1. 制定合理的缓存策略;
  2. 尽量使用延迟加载特性;
  3. 采用合理的Session管理机制;
  4. 使用批量抓取,设定合理的批处理参数(batch_size);
  5. 进行合理的O/R映射设计

 

还有一点被面试问到过,就是sql和hql形式上的区别。个人认为属于第一点区别:

       sql: select 字段名...from table_name  where  字段名...   sql是直接对数据库表的操作

       hql:select 属性名...from 实体类 where 属性 条件 ...group by 属性order by属性。hql是对与表有映射关系的实体类的操作,底层会再自动生成相应的sql。  

 

以上点就是最大的区别了。当然网上还有说对象管理和抓取策略,缓存机制什么的,太高级了这里不再讨论了。附上连接:

http://blog.csdn.net/firejuly/article/details/819022

以上是关于面试之mybatis和hibernate的区别的主要内容,如果未能解决你的问题,请参考以下文章

面试之hibernate 和mybatis

mybatis和hibernate的区别

mybatis和hibernate的区别面试题

MyBatis面试题

MyBatis面试题

MyBatis面试题