news 2026/4/28 0:39:02

【后端】【Java】一文详解为什么互联网公司更偏向 MyBatis,而不是 JPA?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【后端】【Java】一文详解为什么互联网公司更偏向 MyBatis,而不是 JPA?

为什么大多数互联网公司更偏向 MyBatis,而不是 JPA?

为什么互联网公司更偏向 MyBatis,而不是 JPA?

在很多互联网公司(阿里系、字节、腾讯、美团等)中,你会发现一个现象:

👉核心业务系统几乎清一色用 MyBatis(或 MyBatis Plus)
👉JPA 更多出现在中小项目、后台系统或内部工具

这并不是“JPA 不好”,而是互联网公司的技术诉求,天然更匹配 MyBatis

下面我们从多个维度拆解这个选择背后的原因。


一、互联网业务的本质:复杂 SQL + 极致性能

1️⃣ 互联网业务不是“CRUD 为主”

互联网系统常见特点:

  • 数据量大(千万 / 亿级)

  • SQL 复杂(多表 join / 子查询 / 聚合)

  • 报表、推荐、统计频繁

  • 性能要求极高(毫秒级)

📌而这些,正是 JPA 的“非舒适区”


2️⃣ MyBatis 是“SQL 驱动”的框架

MyBatis 的设计哲学:

SQL 是一等公民

<select> select u.id, u.name, count(o.id) orderCount from user u left join order o on u.id = o.user_id where u.status = 1 group by u.id </select>

👉 SQL 怎么写,数据库就怎么跑
👉执行计划可控、性能可预测


二、性能“可控性”是互联网公司的第一优先级

1️⃣ MyBatis 的性能是“显式”的

  • SQL 明确

  • 是否走索引清清楚楚

  • 一条方法 = 一条 SQL

📌 出问题时:

  • 看 SQL

  • 看执行计划

  • 看索引

定位路径非常短


2️⃣ JPA 的性能是“隐式”的

save(entity);

背后可能发生:

  • select

  • update

  • flush

  • cascade

  • dirty check

📌你没写 SQL,但 SQL 已经跑了

在高并发场景:

  • 问题难复现

  • 行为难预测

  • 调优成本极高


三、复杂 SQL 在 JPA 中是“灾难级体验”

1️⃣ JPQL / Criteria API 可读性差

CriteriaBuilder cb = em.getCriteriaBuilder();

📌 实话实说:

  • 可读性差

  • 学习成本高

  • 调试困难

对比 MyBatis:

select * from order where status = 1 limit 100

👉SQL 即文档


2️⃣ JPA 难以表达数据库特性

JPA 的目标是:

屏蔽数据库差异

但互联网公司恰恰要用:

  • MySQL 索引 Hint

  • 分库分表语法

  • 特定函数

  • 自定义优化 SQL

📌 MyBatis:直接写
📌 JPA:绕路 or 放弃


四、团队协作:MyBatis 更符合“大团队工程化”

1️⃣ 前后端 / DBA / 后端协作成本

在互联网公司:

  • DBA 会 review SQL

  • 架构师关注执行计划

  • 后端关注代码结构

📌 MyBatis:

  • SQL 明文

  • 所有人都能看懂

📌 JPA:

  • SQL 运行时生成

  • DBA 无法提前介入


2️⃣ MyBatis 更利于代码评审(CR)

<select id="listHotUsers">
  • SQL 是否合理,一眼可见

  • 是否有索引,一看就知道

JPA:

findByUserStatusAndCreateTimeBetween()

👉你得脑补 SQL


五、互联网公司更害怕“不可预期行为”

JPA 的几个高危点

风险说明
N+1 查询一不小心就炸
自动 flush查询前偷偷 update
脏检查CPU 消耗不可控
级联save 引发雪崩
懒加载线上常见事故

📌 这些问题:

  • 不是“写错”

  • 而是“没意识到”

👉互联网公司更倾向“显式控制”


六、历史原因:国内技术栈的演进路径

国内主流路径:

JDBC ↓ MyBatis ↓ MyBatis-Plus
  • 大量老系统

  • 大量 SQL 资产

  • 成熟的使用规范

  • 完整的最佳实践

📌 切换到 JPA 的收益不明显,但风险很大


七、JPA 真的不适合互联网吗?

❌ 不是

JPA 非常适合:

  • 后台管理系统

  • 内部工具

  • 小型项目

  • CRUD 密集型服务

  • 表结构稳定的系统

📌 只是不适合“核心高并发业务”


八、真实的一线最佳实践(非常重要)

MyBatis + JPA 混合使用

  • JPA:

    • 简单 CRUD

    • 快速开发

  • MyBatis:

    • 核心链路

    • 复杂 SQL

    • 性能敏感路径

这是很多中大型互联网公司的真实架构选择


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 2:06:30

深度学习之噬菌体特异性蛋白质预测:代码实现与解析

使用深度学习方法预测噬菌体特异性蛋白质完整代码实现&#xff0c;含数据集。 该方法对噬菌体特异性蛋白&#xff08;TerL、Portal和TerS&#xff09;具有良好的预测精度&#xff0c;也可用于从病毒组数据预测序列。 CNN可以自动学习蛋白质序列模式&#xff0c;同时根据学习到的…

作者头像 李华
网站建设 2026/4/24 10:34:30

Applite:颠覆传统的Homebrew图形化管理神器

Applite&#xff1a;颠覆传统的Homebrew图形化管理神器 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 在macOS生态中&#xff0c;Homebrew以其强大的软件管理能力著称&#x…

作者头像 李华
网站建设 2026/4/23 22:37:23

23、Linux网络工具与Samba客户端使用指南

Linux网络工具与Samba客户端使用指南 1. 非交互式下载工具 1.1 使用wget下载网站 在Linux系统中,wget是一个强大的非交互式下载工具。如果你有多个链接需要下载,可以将它们放在一个文件中,然后使用 -i 选项配合 wget 进行下载。例如,通过 dog 和 grep 创建了一个包含链接…

作者头像 李华
网站建设 2026/4/22 12:14:16

TypeScript开发基础(4)——数据类型高级特性

1. 联合类型在TypeScript中&#xff0c;联合类型&#xff08;Union Types&#xff09;允许你表示一个值可以是几种类型之一。这对于处理多种可能的数据类型非常有用&#xff0c;通过使用竖线符号&#xff08;|&#xff09;来定义一个联合类型。let arr:(number|string)[][1,a,2…

作者头像 李华
网站建设 2026/4/20 13:44:34

LobeChat多轮对话优化:如何减少重复提问?

LobeChat多轮对话优化&#xff1a;如何减少重复提问&#xff1f; 在构建智能对话系统时&#xff0c;一个常见的尴尬场景是&#xff1a;用户刚刚解释完自己的需求&#xff0c;稍作补充后却发现AI“忘了”之前的对话内容&#xff0c;不得不重新说明背景。这种体验不仅低效&#x…

作者头像 李华