告别繁琐SQL:用 Xbatis 重新定义 Java 数据库开发体验
官方网站: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; } 第三步:定义 Mapper 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