官方网站:https://xbatis.cn * 文档:https://deepwiki.com/xbatis/xbatis * GitHub:https://github.com/xbatis/xbatis
你是否也有这些痛点?
- 项目有 50 个实体,就要写 50 个 Mapper 接口,重复代码让人崩溃
- 多表联查写一堆 XML,改个字段名全局搜索替换,还容易漏
- 多租户、逻辑删除、乐观锁……每个功能都要手写拦截器,费时费力
- 读写分离配置复杂,运行时切换数据源更是噩梦 如果你用过 MyBatis,这些问题一定不陌生。Xbatis 正是为解决这些痛点而生。
Xbatis 是什么?
Xbatis 是一个基于 MyBatis 的增强框架,定位是"少写 SQL、链式 DSL、跨数据库兼容"。 它的核心理念只有一句话:对 MyBatis 只做封装,不做侵入式改造。这意味着你原有的 MyBatis 代码、XML、插件全部可以继续使用,Xbatis 只是在上面加了一层优雅的壳。
核心特性一览
1. 链式 DSL:写查询像写英语
传统 MyBatis 写多表联查,你需要写 XML、手动拼接条件、手动处理结果映射。用 Xbatis,同样的查询变成这样:
SysUserRoleVo vo = QueryChain.of(sysUserMapper)
.select(SysUser.class, SysRole.class)
.from(SysUser.class)
.join(SysUser::getRoleId, SysRole::getId)
.eq(SysUser::getId, 1)
.like(SysUser::getUserName, "abc")
.groupBy(SysUser::getId)
.having(SysUser::getId, c -> c.count().gt(0))
.orderBy(SysUser::getId)
.returnType(SysUserRoleVo.class)
.get();
全程 Lambda 方法引用,字段名拼错了编译直接报错,IDE 自动补全,重构无忧。
2. 单 Mapper 模式:一个接口搞定所有实体
传统项目 100 个实体 = 100 个 Mapper 接口。Xbatis 的单 Mapper 模式让你只需定义一个:
// 定义一次
public interface MybatisBasicMapper extends BasicMapper {}
// 全局注册
XbatisGlobalConfig.setSingleMapperClass(MybatisBasicMapper.class);
之后所有实体的 CRUD 都通过这一个 Mapper 完成:
mybatisBasicMapper.save(new SysUser());
mybatisBasicMapper.deleteById(SysUser.class, 1);
QueryChain.of(mybatisBasicMapper, SysUser.class)
.eq(SysUser::getId, 1)
.list();
3. 企业级注解生态:开箱即用
多租户、逻辑删除、乐观锁…… 这些企业级需求,Xbatis 用注解一行搞定:
@Table
public class SysUser {
@TableId
private Integer id;
@TenantId // 多租户自动隔离
private Long tenantId;
@LogicDelete(beforeValue = "0", afterValue = "1")
@LogicDeleteTime // 逻辑删除 + 删除时间
private Integer deleted;
@Version // 乐观锁
private Integer version;
}
框架在 SQL 执行阶段自动注入租户条件、自动过滤已删除数据、自动处理版本号 —— 业务代码完全无感知。
需要临时访问已删除数据?一行代码搞定:
try (LogicDeleteSwitch ignored = LogicDeleteSwitch.with(false)) {
mapper.getById(1); // 此处可查到已删除记录
}
4. 动态数据源路由:读写分离从未如此简单
@DS("slave") // 查询走从库
List<SysUser> list = mapper.list(...);
@DS("master") // 写入走主库
void save(SysUser user);
通过 spring.ds.routing.* 统一配置多数据源、主从分组、连接池参数,还支持 JDBC 配置加密存储,敏感信息不再裸奔。
5. 智能分页优化
Xbatis 的分页不是简单套一层 COUNT(*),而是会自动优化分页 SQL:
- 剔除非必要的
LEFT JOIN
- 移除
ORDER BY(COUNT 查询不需要排序)
- 将
SELECT 替换为 COUNT(*)
大数据量场景下,这个优化能带来显著的性能提升。
6. 启动时 POJO 安全检查
@XbatisPojoCheckScan(basePackages = "com.example.project.pojo")
public class ApiApplication { ... }
开启后,应用启动时会自动验证所有 VO、Model、条件对象的结构完整性,字段映射错误、注解遗漏在启动阶段就能发现,而不是等到运行时才爆炸。
快速上手
第一步:添加依赖
<dependency>
<groupId>cn.xbatis groupId>
<artifactId>xbatis-spring-boot3-starter artifactId>
<version>1.9.9-M7 version>
dependency>
第二步:定义实体
@Data
@Table
public class SysUser {
@TableId
private Integer id;
private String userName;
private String password;
private Integer roleId;
private LocalDateTime createTime;
}
public interface SysUserMapper extends MybatisMapper<SysUser> {}
第四步:开始使用
@Service
public class UserService {
@Autowired
private SysUserMapper sysUserMapper;
public Pager<SysUser> search(String name, int page) {
return QueryChain.of(sysUserMapper)
.like(SysUser::getUserName, name)
.paging(Pager.of(page, 10));
}
}
就这么简单。
与同类框架对比
| 特性 |
MyBatis 原生 |
MyBatis-Plus |
Xbatis |
| 链式 DSL |
无 |
有(Lambda Wrapper) |
有(更接近 SQL 语义) |
| 单 Mapper 模式 |
无 |
无 |
有 |
| 多租户自动注入 |
手写 |
插件支持 |
注解驱动,透明 |
| 逻辑删除 |
手写 |
注解支持 |
注解支持 |
| 动态数据源 |
手写 |
需第三方 |
内置 |
| 启动时 POJO 检查 |
无 |
无 |
有 |
| 对 MyBatis 侵入性 |
— |
中 |
极低 |
适合哪些场景?
- 中大型 Spring Boot 项目:单 Mapper 模式大幅减少重复代码
- 多租户 SaaS 平台:租户隔离完全透明,无需业务代码介入
- 需要读写分离的系统:动态数据源路由开箱即用
- AI 辅助开发场景:方法引用 + 类型安全 + 启动检查,AI 生成的代码更可靠
结语
Xbatis 不是要替代 MyBatis,而是让 MyBatis 用起来更爽。它保留了 MyBatis 的所有灵活性,同时补齐了工程化开发中最常见的痛点。
如果你正在寻找一个轻量、高性能、功能完备的 MyBatis 增强方案,不妨给 Xbatis 一个机会。
GitHub:https://github.com/xbatis/xbatis 官方文档:https://xbatis.cn