MyBatis(2)MyBatis 与 Hibernate 的区别

80 阅读3分钟

MyBatis 和 Hibernate 都是 Java 范畴内流行的持久层框架,但它们在理念和实现方式上存在显著的差异。

MyBatis:

  • 半自动 ORM 框架:MyBatis 需要你手动编写 SQL 语句,并将 SQL 映射至 Java 对象。
  • 灵活性:它允许你完全控制 SQL 语句的编写。
  • 轻量级:相对较轻,与直接使用 JDBC 相比,MyBatis 仅仅是对 JDBC 的轻量封装。

Hibernate:

  • 全自动 ORM 框架:Hibernate 是一个全自动的对象关系映射框架,可以不必编写 SQL 语句。
  • 高度封装:它封装了很多数据库操作的细节,通过 HQL(Hibernate Query Language)或 JPQL(Java Persistence Query Language)来执行查询,也支持原生 SQL。
  • 重量级:相对较重,提供了更多的特性,如:一级缓存、二级缓存、延迟加载、热更新等。

源码解析与代码演示:

MyBatis 源码关键点:

  • SqlSessionFactory:创建 SqlSession 的工厂类,由 SqlSessionFactoryBuilder 通过读取配置文件构建。

    String resource = "org/mybatis/example/mybatis-config.xml";
    Reader reader = Resources.getResourceAsReader(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    
  • SqlSession:用于执行 SQL 操作的对象,它包含了对数据库执行操作所需要的所有方法。

    try (SqlSession session = sqlSessionFactory.openSession()) {
      Blog blog = session.selectOne("com.myapp.mapper.BlogMapper.selectBlog", 101);
    }
    
  • Mapper Interface:SQL 映射的 Java 接口,MyBatis 会为这些接口生成代理对象来执行实际的数据库操作。

    try (SqlSession session = sqlSessionFactory.openSession()) {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      Blog blog = mapper.selectBlog(101);
    }
    

Hibernate 源码关键点:

  • SessionFactory:创建 Session 的工厂类,由 Configuration 类通过读取配置文件构建。

    Configuration configuration = new Configuration().configure();
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    
  • Session:用于执行持久化操作的对象,类似于 JDBC 中的 Connection,它封装了 JDBC 连接,并提供了 CRUD 功能。

    try (Session session = sessionFactory.openSession()) {
      Transaction tx = session.beginTransaction();
      Blog blog = session.get(Blog.class, 1);
      tx.commit();
    }
    
  • Entity:标记为 @Entity 的 Java 类,其属性映射至数据库表的列,默认情况下类名对应数据库表名,属性名对应列名。

    @Entity
    public class Blog {
      @Id
      private Integer id;
      private String title;
      // ...
    }
    

MyBatis 与 Hibernate 的比较:

控制:

  • MyBatis:允许你完全控制 SQL,适合需要精细优化 SQL 或拥有复杂查询的场景。
  • Hibernate:自动管理 SQL,减少了手动编写和优化 SQL 的需要,但在一些复杂场景下可能无法做到最优。

性能:

  • MyBatis:因为允许手动优化 SQL,所以在性能上可以通过优化 SQL 语句来获得更好的性能。
  • Hibernate:内置缓存和延迟加载等特性可以提升性能,但在生成的 SQL 不够优化时可能会出现性能问题。

复杂性:

  • MyBatis:配置相对简单,学习曲线较为平缓。
  • Hibernate:功能强大,但配置和理解其内部工作原理相对复杂。

适用场景:

  • MyBatis:适合对 SQL 优化要求高、数据库设计复杂或者希望更直接地控制 SQL 的项目。
  • Hibernate:适合数据库设计相对规范、希望快速开发且不需要深入控制 SQL 的项目。

总结来说,MyBatis 和 Hibernate 都有各自的优势和缺点。选择哪一个框架主要取决于项目的需求、团队的熟悉度以及对性能和控制层面的考虑。