Xbatis vs MyBatis-Plus 框架比较和选型
·
一、框架概述
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,迁移成本太高
- ✅ 你是保守派,「稳定压倒一切」
参考
更多推荐


所有评论(0)