2026-01-28 10:41:30
| 维度 | MyBatis-Plus | JPA(Java Persistence API) |
|---|---|---|
| 定位 | MyBatis 的增强工具,聚焦简化单表 CRUD 操作,保留原生 SQL 能力 | Java EE 标准 ORM 规范,强调面向对象映射,支持复杂查询和事务管理 |
| 设计理念 | “约定优于配置”,通过通用方法减少重复代码,适合快速开发 | “标准化与抽象化”,通过注解和接口实现对象-关系映射,适合复杂业务模型 |
| 灵活性 | 高,支持自定义 SQL 和插件扩展 | 中等,依赖框架生成 SQL,复杂查询需结合 Criteria API 或原生 JPQL |
| 学习曲线 | 平缓,熟悉 MyBatis 后易上手 | 陡峭,需掌握实体状态、级联、懒加载等概念 |
MyBatis-Plus
继承 BaseMapper 即可自动获得全量 CRUD 方法,无需编写 SQL:
public interface UserMapper extends BaseMapper<User> {}
// 直接调用内置方法
userMapper.insert(user);JPA
通过继承 JpaRepository 实现基础操作,方法名解析生成 SQL:
public interface UserRepository extends JpaRepository<User, Long> {}
// 方法名自动生成查询(如 findByName)
userRepository.findByName("John");MyBatis-Plus
使用 QueryWrapper 或 LambdaQueryWrapper 链式构建条件:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20).like("name", "张");
userMapper.selectList(wrapper);JPA
依赖 @Query 注解或 Specification 动态拼接:
@Query("SELECT u FROM User u WHERE u.age > :age AND u.name LIKE %:name%")
List<User> findByAgeAndName(@Param("age") int age, @Param("name") String name);MyBatis-Plus
内置分页插件,配置简单且性能透明:
Page<User> page = new Page<>(1, 10);
IPage<User> result = userMapper.selectPage(page, null);JPA
需结合 Pageable 接口,分页逻辑由框架处理:
Pageable pageable = PageRequest.of(0, 10);
Page<User> result = userRepository.findAll(pageable);MyBatis-Plus
适合简单联表查询,复杂场景需手动编写 XML 或注解 SQL:
<!-- MyBatis-Plus XML -->
<select id="selectWithOrders" resultType="User">
SELECT * FROM user u LEFT JOIN order o ON u.id = o.user_id
</select>JPA
支持 JPQL 和 Criteria API,适合多表关联与动态查询:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
Join<User, Order> orders = root.join("orders", JoinType.LEFT);
query.select(root).where(cb.gt(root.get("age"), 20));| 场景 | MyBatis-Plus | JPA |
|---|---|---|
| 单表 CRUD | 极快,无额外抽象层 | 较慢,需处理 ORM 映射与缓存 |
| 复杂查询 | 需手动优化 SQL,灵活性高 | 自动生成 SQL 可能低效,需手动调优(如 @Query 指定原生语句) |
| 批量操作 | 支持批量插入,但性能弱于原生 MyBatis | saveAll() 默认逐条插入,需配置批量模式 |
| 缓存机制 | 一级缓存(Session 级别),无二级缓存 | 一级缓存(持久化上下文)+ 二级缓存(需配置 Ehcache 等) |
JpaRepository 快速实现 80% 的 CRUD。| 维度 | MyBatis-Plus | JPA |
|---|---|---|
| 优势 | 灵活、高效、学习成本低 | 标准化、功能丰富、适合复杂模型 |
| 劣势 | 复杂查询支持弱、批量性能一般 | 自动生成 SQL 效率低、学习曲线陡峭 |
| 典型用户 | 互联网项目、快速迭代团队 | 企业级系统、传统金融/ERP 项目 |
| 未来趋势 | 在微服务与云原生中持续优化 | 作为 Java 持久化标准长期存在 |
实际建议:
- 新项目:优先 JPA 快速启动,复杂场景引入 MyBatis-Plus 补充。
- 老项目迁移:逐步替换部分模块,保留核心业务逻辑的稳定性。