由于我已经不是第一次接触这两个框架了,面试中也经常问到这两个问题,所以在这里写下自己的一些理解。
首先从全自动和半自动开始说起,网上经常有人说MyBatis和Hibernate一个全自动的ORM映射框架,一个是半自动的ORM框架、那么究竟体现在哪里
一切还要从JDBC说起,我们通常知道JDBC的实现步骤包括获取连接,创建Statement,传递查询字段,执行SQL,获取结果集,映射结果集,释放连接。
MyBatis封装:
- MyBatis封装了获取连接,执行Sql,关闭连接。
- Sql传递的时候类的属性自动传递参数,不用再自己去写statement
- 结果集也由MyBatis来映射。不用手动实现。但是要配置和编写ResultMap
Hibernate封装:
- HIbernate封装了数据连接,Sql编写,执行Sql,关闭连接
- SQL参数的传递
- 完全封装了结果集的映射
由此可见Hibernate相对于Batis更加自动一点。
区别:
- Hibernate简化了持久层的开发封装了结果集映射,MyBatis需要自己去配置结果集映射ResultMap
- MyBatis需要去自己编写Sql.Hibernate封装了Sql的拼接
优劣:
当然要谈优劣的话,
MyBatis优点:
1、个人觉得MyBatis的封装在一定程度下,增加了SQL的灵活性。在一些精细化和复杂Sql优化的地方使用更好。
2、可以通过标签自定义动态Sql对于批量的数据的删除修改增加比较友好。Hibernate可以编写HQL来定制Sql但是这样一来就使得开发过程反而更复杂,违背初衷。
Hibernate优点
1、而Hibernate不用编写Sql一定程度上也简化了开发,让人们更加专注于Service层逻辑实现,提高了开发的效率,对于简单的CRUD比较友好。
2、Mybatis的框架相对于Hibernate也比较简陋。版本迭代Hibernate比较活跃
3、Hibernate可以通过变更配置来更换数据库,Hibernate的数据库移植性更好
总结:Hibernate简化了持久层的开发封装了结果集映射,将面向对象进行到底,而不需要太关注实现细节。MyBatis是一个灵活的工具拿来即用,需要关注更多实现的细节。
Hibernate的优化建议;
- .尽量使用many-to-one,避免使用单项one-to-many
- .灵活使用单向one-to-many
- .不用一对一,使用多对一代替一对一
- .配置对象缓存,不使用集合缓存
- .一对多使用Bag 多对一使用Set
- .继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象
- .消除大表,使用二级缓存