一、框架概述

        Java 后端开发中,MyBatis-Plus 和 Xbatis 是最具代表性的两个增强框架。

MyBatis-Plus 深耕多年;Xbatis 设计激进。本文将从设计哲学、核心 API、多表查询、分页机制、功能覆盖、生态成熟度六个维度进行全面对比。

二、基本信息

Xbatis MyBatis-Plus
最新版本 1.10.6(2026-07-02) 3.5.16(2026)
Maven 坐标 cn.xbatis:xbatis com.baomidou:mybatis-plus
定位 重度 ORM,链式 DSL 增强工具,轻量封装
GitHub Stars 166+ 16,000+
最低 JDK JDK 8+ JDK 8+
Spring Boot 2 / 3 / 4 全支持 2 / 3 / 4 全支持
Solon 支持 ✅ 原生支持 ✅(v3.5.9 起)

三、核心 API 对比

MyBatis-Plus:Wrapper 条件参数

LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery()
        .like(User::getUserName, "李")
        .eq(User::getGender, 2)
        .gt(User::getAge, 34);
List<User> users = userMapper.selectList(wrapper);

Xbatis:QueryChain 条件参数

List<User> users = QueryChain.of(userMapper)
        .like(User::getUserName, "李")
        .eq(User::getGender, 2)
        .gt(User::getAge, 34)
        .list();

聚合函数对比

// MyBatis-Plus:字段名硬编码,拼错不会报错
QueryWrapper<User> wrapper = Wrappers.query()
    .select("id", "user_name", "max(birthday)", "avg(birthday) as sex_avg");

// Xbatis:Lambda 表达式,编译期检查
List<User> users = QueryChain.of(userMapper)
        .select(User::getId)
        .select(User::getUserName, c -> c.max())
        .select(User::getBirthday, c -> c.avg().as("sex_avg"))
        .list();

四、功能对比总表

功能 Xbatis (1.10.6) MyBatis-Plus (3.5.16)
基本 CRUD
分页查询
子查询分页
分页无 SQL 解析(更轻量) ❌(依赖 JsqlParser)
多表 LEFT/INNER/RIGHT JOIN ✅ 原生 ⚠️ 需 mybatis-plus-join 第三方
多表 UNION / UNION ALL
多表查询结果自动映射 ⚠️ 需第三方扩展
查询结果多层嵌套结构
逻辑删除
乐观锁
多租户
动态分表 ✅ 注解驱动 ⚠️ 需 ShardingSphere
@Fetch 轮询关联数据
单 Mapper 模式
一键忽略 null/空串条件(forSearch)
局部 SQL 模板
对象转条件
DDL 自动建表 ✅(v1.10.6) ✅ 基础支持
RETURNING 子句
多主键 / 复合主键
不同数据库不同 ID 策略
update/delete 原生 RETURNING
非实体类 TypeHandler 复用
Mapper 方法拦截器
重复新增策略(忽略/修改)
查询 timeout / fetchSize 配置
查询 SQL 优化开关
多列 IN / NOT IN
多数据源 ✅ 内置 ✅ 内置
代码生成器 ✅(基础) ✅(非常成熟)
IDEA 插件 ✅ MybatisX
跨数据库深度兼容 ✅(13+ 种,一套代码) ⚠️ 基础兼容
mapKey / cursor
部分字段精准更新 ✅ partialUpdate ⚠️ 需手动 setSql

@NestedResultEntity 注解,关联表字段可以自动嵌套到 VO 的子对象中

// 查用户时,自动 Fetch 角色和部门信息,避免 N+1
@Data
public class SysUserVo {
    private Integer id;
    private String userName;

    @Fetch(source = SysUser.class, property = "roleId", target = SysRole.class)
    private SysRole role;

    @Fetch(source = SysUser.class, property = "deptId", target = SysDept.class)
    private SysDept dept;
}

五、SQL分页对比

MyBatis-Plus:JsqlParser 解析

MP 的分页依赖 JsqlParser 解析原始 SQL,然后包裹 COUNT 和 LIMIT。优点是通用性强,缺点是:

  • 引入了 SQL 解析开销
  • 复杂 SQL(CTE、UNION)可能解析失败
  • 子查询分页不支持

Xbatis:无解析设计

Xbatis 因为自己生成 SQL,天然知道如何 COUNT 和分页,完全不需要 SQL 解析。这意味着:

  • 更轻量:没有 JsqlParser 依赖
  • 更高性能:省去解析步骤
  • 子查询也能分页:这是 MP 做不到的

六、字段更新

// 需求:更新 userName、age、birthday(含 null),其余字段不动

// ===== Xbatis =====
Account account = UpdateEntity.of(Account.class);
account.setId(100);
account.setUserName("michael");
account.setAge(18);
account.setBirthday(null);
accountMapper.update(account, Account::getBirthday); // 指定 birthday 允许 null

// ===== MyBatis-Plus =====
LambdaUpdateWrapper<Account> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(Account::getId, 100);
wrapper.set(Account::getUserName, "xxx");
wrapper.set(Account::getAge, 18);
wrapper.setSql("birthday=NULL"); // null 必须写原生 SQL!
accountMapper.update(null, wrapper);

七、社区与生态

Xbatis MyBatis-Plus
GitHub Stars 166+ 16,000+
文档质量 详细,中文为主 非常完善,中英文
IDEA 插件 ✅ MybatisX
第三方教程 较少 非常丰富
问题解决 群内响应 Stack Overflow + issue
企业级扩展 Mybatis-Mate(企业版)
周边生态 代码生成器、多数据源 代码生成器、多数据源、动态数据源、分布式锁、SSO 等
发展势头 🔥 高速迭代(月均 1-2 版) 稳健(季度级发布)

八、选型建议

选 Xbatis,如果:

  • ✅ 你的业务多表关联查询频繁,不想反复写 XML
  • ✅ 你追求极简 API,希望一套链式调用搞定一切
  • ✅ 项目需要跨数据库兼容,一套代码跑 MySQL + PostgreSQL + Oracle
  • ✅ 你需要子查询分页嵌套结果映射等高级特性
  • ✅ 你愿意尝鲜,接受新框架的成长过程

选 MyBatis-Plus,如果:

  • ✅ 你的项目以单表 CRUD 为主,复杂查询走 XML 完全够用
  • ✅ 你需要成熟的代码生成器快速搭建项目骨架
  • ✅ 团队更看重社区活跃度问题可搜索性
  • ✅ 你需要 MybatisX 插件在 IDEA 中的跳转和补全体验
  • ✅ 项目已经深度使用 MP,迁移成本太高
  • ✅ 你是保守派,「稳定压倒一切」

参考

xbatis - xbatis是一款非常好用的ORM框架!

简介 | MyBatis-Plus

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐