目录

前言

一、基础扫盲:JDBC、ORM、JPA都是什么?

1.1 JDBC:一切的起点

1.2 ORM:对象关系映射的救赎

1.3 JPA:只是规范而已

二、主流框架全景图

三、主流框架大乱斗

3.1 Hibernate:全自动ORM的代表

3.2 MyBatis:半自动SQL映射器

3.3 MyBatis-Plus:MyBatis的增强工具

3.4 MyBatis-Flex:新一代的挑战者

3.5 MyBatis-Plus vs MyBatis-Flex:详细对比

3.6 JPA规范下的其他选手

3.7 新生代框架:jOOQ

3.8 对比总览(2026版)

四、灵魂拷问:Hibernate还有存在的必要吗?

4.1 唱衰Hibernate的声音从哪来?

4.2 但是,Hibernate的进化从未停止

4.3 官方理念的回归

4.4 现实场景的考量

4.5 2026年的答案:需要,但不是全部

六、总结:拥抱多范式持久层


前言

从事Java开发的同学,一定被各种持久层框架弄得眼花缭乱过。从最早的JDBC,到如日中天的Hibernate,再到后来MyBatis的异军突起,以及JPA规范的统一江湖。而最近几年,MyBatis-Plus和MyBatis-Flex的崛起,又让这个战场变得热闹起来。

很多新手经常混淆这些概念:Hibernate和JPA是什么关系?MyBatis和MyBatis-Plus有什么区别?MyBatis-Flex又是什么来头?我到底该选哪个?

更要命的是,经常听到有人说:“Hibernate太重了,我们不用”、“Hibernate过时了”、“现在都用MyBatis-Plus”。事实果真如此吗?今天,我们就来一场Java持久层框架的“终极对决”,并深入探讨:在2026年的今天,Hibernate是否还有存在的必要?

一、基础扫盲:JDBC、ORM、JPA都是什么?

1.1 JDBC:一切的起点

JDBC(Java Database Connectivity)是Java连接数据库的最底层API。它就像汽车的发动机,动力直接,但什么都要自己动手。

使用JDBC的日常:

// 1. 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接
Connection conn = DriverManager.getConnection(url);
// 3. 定义SQL
String sql = "SELECT * FROM user WHERE id = ?";
// 4. 预编译
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 1);
// 5. 执行查询
ResultSet rs = ps.executeQuery();
// 6. 手动封装结果
User user = new User();
while(rs.next()) {
    user.setId(rs.getInt("id"));
    user.setName(rs.getString("name"));
}
// 7. 关闭资源
rs.close(); ps.close(); conn.close();

痛点很明显:代码冗余、对象关系映射要手动写、没有缓存、SQL耦合在Java代码中。

1.2 ORM:对象关系映射的救赎

ORM(Object Relational Mapping)就是为了解决上述痛点。它的核心思想很简单:建立Java对象和数据库表之间的映射关系,操作对象就相当于操作数据库

1.3 JPA:只是规范而已

JPA(Java Persistence API)是一套标准接口,不是实现。这就好比“插座”的规格说明书,规定了插孔的形状、电压,但谁来做插座?那是厂商的事。

JPA的主要贡献:

  • 实体注解(@Entity@Table@Id等)

  • 持久化API(EntityManager

  • 查询语言(JPQL)

二、主流框架全景图

在2026年的Java生态中,持久层框架主要分为三个流派:

流派 代表框架 核心理念 适用场景
全自动ORM Hibernate, EclipseLink 你只管操作对象,SQL我来生成 复杂对象模型、领域驱动设计
半自动SQL映射 MyBatis, MyBatis-Plus SQL你写(或生成),映射我来做 灵活控制SQL、快速CRUD
新一代ORM MyBatis-Flex, jOOQ 类型安全、高性能、现代化API 追求性能与开发效率平衡

三、主流框架大乱斗

3.1 Hibernate:全自动ORM的代表

Hibernate是JPA规范的实现,也是目前最流行的ORM框架。它的理念是:你只管操作对象,SQL我来生成

Hibernate的亮点:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String email;
    
    @OneToMany(mappedBy = "user")
    private List<Order> orders;
}

// 使用示例:完全面向对象
User user = session.get(User.class, 1L);
List<Order> orders = user.getOrders(); // 懒加载,需要时才查

核心优势:

  • 解决对象-关系阻抗不匹配:自动处理继承、多态等复杂关系

  • HQL查询语言:面向对象的查询方式

  • 缓存机制:一级缓存(Session级)、二级缓存(SessionFactory级)

  • 数据库无关性:切换数据库只需改方言配置

  • 自动版本管理:通过@Version注解实现乐观锁

3.2 MyBatis:半自动SQL映射器

MyBatis经常被称为“ORM框架”,其实它更准确的定位是SQL映射框架。它的理念是:SQL你写,映射我来

MyBatis的特点:

<!-- 写SQL?没问题,完全控制 -->
<select id="findComplexReport" resultType="ReportVO">
    SELECT 
        u.name,
        COUNT(o.id) as order_count,
        SUM(o.amount) as total_amount
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.created_at BETWEEN #{start} AND #{end}
    GROUP BY u.id
    HAVING total_amount > #{minAmount}
</select>

核心优势:

  • 完全SQL控制:对DBA友好,SQL优化空间大

  • 学习曲线平缓:会SQL就会MyBatis

  • 动态SQL强大<if><choose>等标签非常灵活

  • 性能可控:没有“意外”的查询

3.3 MyBatis-Plus:MyBatis的增强工具

MyBatis-Plus(简称MP)是MyBatis的增强工具只做增强不做改变,为简化开发、提高效率而生。它并不是要取代MyBatis,而是让你在享受MyBatis灵活性的同时,不用再写那些枯燥的CRUD SQL。

核心特性:

1. 通用CRUD:继承BaseMapper即可获得增删改查方法,无需手写SQL

public interface UserMapper extends BaseMapper<User> {
    // 无需任何方法定义,就有insert、selectById、updateById等
}

// 使用
User user = userMapper.selectById(1L); // 就这么简单
List<User> users = userMapper.selectList(null); // 查询全部

2. 强大的条件构造器:通过QueryWrapperLambdaQueryWrapper动态构建查询条件

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 18)
       .like(User::getName, "张")
       .between(User::getCreateTime, start, end)
       .orderByDesc(User::getCreateTime);
List<User> users = userMapper.selectList(wrapper);

Lambda形式的优势是类型安全,字段名写错会在编译期报错,避免运行时才发现。

3. 分页插件:一行代码实现物理分页

Page<User> page = new Page<>(1, 10); // 第1页,每页10条
Page<User> userPage = userMapper.selectPage(page, null);

4. 代码生成器:根据数据库表自动生成Entity、Mapper、Service、Controller代码

5. 实用特性:逻辑删除、乐观锁、自动填充、性能分析插件等开箱即用

适用场景

  • 中小型项目,需要快速搭建CRUD功能

  • 管理后台、CMS系统等内部系统

  • 微服务中的持久层解决方案

慎用场景

  • 超大型项目,需要精细控制每条SQL

  • 复杂报表、多表关联查询频繁的系统

  • 对SQL性能要求极致的场景

3.4 MyBatis-Flex:新一代的挑战者

MyBatis-Flex是一个轻量级但功能强大的ORM框架,完全兼容MyBatis生态,但在性能和功能上做了大量创新。如果说MyBatis-Plus是站在MyBatis肩膀上的增强,MyBatis-Flex则更像是一个重新设计的现代化ORM

核心特性:

1. APT编译时生成:基于注解处理器(APT)在编译期生成代码,无运行时反射损耗,性能更高

2. 原生多表关联支持:不像MyBatis-Plus需要手写SQL,Flex提供了链式API直接构建关联查询

List<User> users = userMapper.selectListByQuery(
    QueryWrapper.create()
        .select(USER.ALL_COLUMNS, ADDRESS.ADDRESS)
        .from(USER)
        .leftJoin(ADDRESS).on(USER.ID.eq(ADDRESS.USER_ID))
        .where(USER.AGE.ge(18))
);

其中USERADDRESS是编译时自动生成的表定义对象,提供类型安全的字段引用。

3. 轻量高效:核心包仅700KB,启动快,内存占用低。查询单条数据性能比MyBatis-Plus快5-10倍

4. 企业级特性:内置数据脱敏、字段加密、多租户、逻辑删除(支持多种删除策略)等

5. 活跃的更新:MyBatis-Flex更新非常积极,最新版v1.11.6(2026年2月3日发布)已支持Spring Boot 4,并引入JSpecify空值注解

性能对比(查询10000条记录)

操作 MyBatis-Plus (ms) MyBatis-Flex (ms)
单表查询 120 85
多表关联查询 350 220
批量插入(1000条) 450 320
条件更新 180 130

适用场景

  • 需要频繁进行多表关联查询的项目

  • 对ORM性能有更高要求的系统

  • 新项目技术选型,愿意尝试现代化框架

  • 需要动态表名/字段的灵活应用

3.5 MyBatis-Plus vs MyBatis-Flex:详细对比

维度 MyBatis-Plus MyBatis-Flex
定位 MyBatis增强工具,完全兼容MyBatis 独立ORM框架,兼容MyBatis生态
架构设计 基于拦截器、SQL解析器实现 基于SqlProvider和APT,无额外性能损耗
代码生成 运行时模板生成(Velocity) 编译时APT生成,无反射
多表关联 有限支持,复杂查询需手写SQL 原生支持,链式API构建
分页 自动分页插件 更强大的分页API,支持内存分页
社区生态 成熟稳定,文档丰富,GitHub 15k+ ⭐ 较新,但增长迅速,更新活跃
学习曲线 平缓(会MyBatis就会MP) 中等(需理解APT和表对象概念)
性能 中等 更高(编译期优化)

3.6 JPA规范下的其他选手

EclipseLink:JPA参考实现,在某些场景下性能优于Hibernate,但社区较小。

Spring Data JPA:不是新的实现,而是对JPA的再次封装,让你甚至不用写接口实现。

public interface UserRepository extends JpaRepository<User, Long> {
    // 根据方法名自动生成查询
    List<User> findByNameAndEmailStartingWith(String name, String emailPrefix);
}

3.7 新生代框架:jOOQ

jOOQ:类型安全的SQL构建器,介于JPA和MyBatis之间。

// 类型安全,编译期检查
Result<Record3<String, String, String>> result =
dslContext.select(USER.FIRST_NAME, USER.LAST_NAME, USER.EMAIL)
          .from(USER)
          .where(USER.ID.eq(1))
          .fetch();

jOOQ的优势:既能享受SQL的灵活性,又有类型安全的保障。

3.8 对比总览(2026版)

维度 Hibernate MyBatis MyBatis-Plus MyBatis-Flex jOOQ JDBC
设计理念 全自动ORM 半自动SQL映射 MyBatis增强 新一代ORM 类型安全SQL 最底层
开发效率 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
SQL控制力 ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
学习曲线 陡峭 平缓 平缓 中等 中等 平缓
性能调优 较复杂 灵活 一般 灵活高效 灵活 最灵活
缓存机制 一级+二级 一级+二级(需配置) 同MyBatis 多级缓存体系
社区生态 极成熟 成熟 极成熟 快速增长 成熟 -
适用场景 复杂对象模型、DDD 复杂SQL、遗留系统 快速CRUD、中小项目 高性能、复杂关联查询 类型安全要求高 极致性能、简单场景

四、灵魂拷问:Hibernate还有存在的必要吗?

4.1 唱衰Hibernate的声音从哪来?

1. “复杂查询性能差”:确实,如果不注意,Hibernate的N+1查询问题能把数据库打爆

2. “学习成本高”:Session状态(Transient、Persistent、Detached)、缓存策略、懒加载……概念确实多

3. “SQL不可控”:生成的SQL有时出人意料,优化困难

4. “被MyBatis-Plus抢了风头”:MyBatis-Plus的简单易用吸引了大量开发者

4.2 但是,Hibernate的进化从未停止

Hibernate 6/7的重大革新

  1. 更智能的SQL生成:Hibernate 6重写了查询引擎,生成的SQL更简洁高效

  2. JPA 3.2完全支持:紧跟标准

  3. Hibernate Data Repositories:内置的仓库抽象,对标Spring Data JPA

  4. 类型安全增强:更多的编译时检查

4.3 官方理念的回归

Hibernate官方文档说得很透彻:“ORM的目标不是隐藏SQL,也不是隐藏关系模型。实际上,Hibernate的查询语言不过是ANSI SQL的一种面向对象方言。”

更关键的是这句话:“应该同时使用ORM和手写SQL。对于某些特别棘手的逻辑,用更合适的工具才是明智之举。”

4.4 现实场景的考量

场景 Hibernate表现 MyBatis-Plus表现 MyBatis-Flex表现 结论
标准CRUD后台管理 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ Hibernate/MP首选
复杂报表系统 ⭐⭐ ⭐⭐ ⭐⭐⭐⭐ Flex/jOOQ更优
互联网高并发 ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐ Flex性能优势
遗留数据库适配 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ MP适配更灵活
微服务领域模型 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ Hibernate契合DDD

4.5 2026年的答案:需要,但不是全部

Hibernate不仅有必要存在,而且在Java生态中依然占据核心地位。但它不再是“唯一解”,而是解决方案集的一部分

与此同时,MyBatis-Plus和MyBatis-Flex也在各自的领域发光发热:

  • MyBatis-Plus解决了“不想写重复SQL”的痛点,成为中小项目的首选

  • MyBatis-Flex则用更现代的设计,在性能和灵活性之间找到了新的平衡

六、总结:拥抱多范式持久层

回到标题的问题:Hibernate还有存在的必要吗?

有,而且非常有必要。

Hibernate不仅活着,而且在不断进化。Hibernate 7的发布证明了它依然是Java持久层的基石。但2026年的正确姿势不是“只用Hibernate”,而是根据场景选择合适的工具

与此同时,我们也看到:

  • MyBatis-Plus用“只做增强不做改变”的理念,成为了无数项目的入门首选

  • MyBatis-Flex用“编译期优化+现代化API”的设计,在性能和灵活性之间找到了最佳平衡

就像Hibernate官方说的,ORM的目标是消除脆弱和非类型安全的代码,而不是取代SQL。当你需要处理复杂的对象图,当你的领域模型充满业务逻辑,Hibernate依然是你的好帮手。当你有复杂的报表查询,MyBatis-Flex或jOOQ可以完美补充。当你想快速搭建一个原型,MyBatis-Plus能让你事半功倍。

没有银弹,只有最合适的工具组合。

最后送给大家一句话:框架只是工具,思想才是核心。理解对象关系映射的本质,理解SQL的执行逻辑,无论选哪个框架,你都能游刃有余。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐