-
简介
-
mybatis
- iBATIS 的着力点,则在于POJO 与SQL之间的映射关系
- 然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO
- 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现
-
Hibernate
- 对数据库结构提供了较为完整的封装
- Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行
- Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行
-
开发对比
-
mybatis
- Mybatis框架相对简单很容易上手,但也相对简陋些
- 针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap
-
Hibernate
- Hibernate的真正掌握要比Mybatis来得难些
- Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
-
调优方案
-
mybatis
- 可以进行详细的SQL优化设计
- 采用合理的Session管理机制;
-
Hibernate
- 制定合理的缓存策略;
- 尽量使用延迟加载特性;
- 采用合理的Session管理机制;
- 使用批量抓取,设定合理的批处理参数(batch_size);
- 进行合理的O/R映射设计
-
扩展性方面
-
mybatis
- MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好
-
Hibernate
- Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好
-
缓存机制
-
mybatis
- 默认情况下是没有开启缓存
- 要开启二级缓存,你需要在你的 SQL 映射文件中添加一行: <cache/>
- 映射语句文件中的所有 select 语句将会被缓存
- 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存
- 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回
- 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
- 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
- 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
-
Hibernate
- 一级缓存是Session缓存,利用好一级缓存就需要对Session的生命周期进行管理好
- 二级缓存是SessionFactory级的缓存,分为内置缓存和外置缓存
-
对比总结
-
mybatis
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
- MyBatis容易掌握,而Hibernate门槛较高。
-
Hibernate
- Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
- Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
- Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。