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