如果你觉得 MyBatis 不够方便,又嫌 MyBatis-Plus 封装过度,那么 xbatis 就是你一直在寻找的答案。
🎯 核心定位:MyBatis 的“终极增强体”
xbatis 并非另一个重新造轮子的 ORM,而是基于 MyBatis 核心进行轻量级、增强型封装的框架。它保留了 MyBatis 所有的灵活性与控制力,同时补全了其在开发效率和高级特性上的所有短板。
|
特性维度
|
MyBatis
|
MyBatis-Plus
|
xbatis
|
|
架构理念
|
SQL 映射框架
|
通用 CRUD 封装
|
MyBatis 增强框架
|
|
学习成本
|
高
|
低
|
极低(MP用户无缝迁移)
|
|
功能丰富度
|
需自行实现
|
较丰富
|
全面(企业级开箱即用)
|
|
数据库兼容
|
需适配
|
需适配
|
✅ 一套代码,多库运行
|
|
代码控制力
|
完全控制
|
部分黑盒
|
完全透明,增强可控
|
✨ 五大硬核亮点,解决真实痛点
1. 一套代码,征服所有数据库
这是 xbatis 最革命性的特性。你编写的 DAO 和 Mapper 代码,无需任何修改,即可在 MySQL、PostgreSQL、Oracle 等数据库上运行。这对于需要支持多数据库交付或未来考虑迁移的项目,价值连城。
价值:彻底消除因数据库差异带来的昂贵重构成本。
2. 注解驱动,声明式解决复杂映射
告别 MyBatis 中繁琐的 <resultMap>配置。xbatis 提供一套完整的注解体系,用声明式语法优雅地处理复杂对象关联。
// 传统MyBatis:需要编写复杂的XML <resultMap> 和 JOIN SQL
// 在xbatis中,只需一个注解:
@Data
@ResultEntity(SysUser.class)
public class UserDetailVO {
private Integer id;
private String userName;
// 声明式关联查询:根据 user.roleId 关联查询 role 表
@Fetch(source = SysUser.class, property = "roleId",
target = SysRole.class, targetProperty = "id")
private SysRole role; // 一对一关联
private List<SysPermission> permissions; // 一对多关联
}
// 使用链式API查询,自动完成结果映射
List<UserDetailVO> list = QueryChain.of(userMapper)
.eq(SysUser::getStatus, 1)
.returnType(UserDetailVO.class)
.list();
3. 流式 API,书写如自然语言般流畅
xbatis 的 API 设计极致优雅,让查询构建成为一种享受。
// 链式调用,逻辑清晰
List<SysUser> users = QueryChain.of(userMapper)
.eq(SysUser::getTenantId, "T001")
.like(SysUser::getUserName, "张")
.between(SysUser::getCreateTime, startDate, endDate)
.orderByDesc(SysUser::getCreateTime)
.paging(Pager.of(1, 20)) // 内置分页
.list();
4. 企业级特性,注解即配置
逻辑删除、多租户、乐观锁、字段自动填充……这些通用业务功能,只需一个注解。
@Data
@Table("sys_user")
public class SysUser {
@TableId
private Long id;
@LogicDelete // 逻辑删除
private Integer isDeleted;
@Version // 乐观锁
private Integer version;
@TenantId // 多租户隔离
private String tenantId;
@OnInsert // 插入时自动填充
private LocalDateTime createTime;
@OnUpdate // 更新时自动填充
private LocalDateTime updateTime;
}
// 配置后,所有查询自动附带 tenant_id=? 条件,删除自动转为更新 is_deleted 字段
5. 原生能力全保留,进退自如
当你需要进行极其复杂的 SQL 操作时,xbatis 允许你随时“退回”到最原生的 MyBatis 模式,享受 100% 的 SQL 控制权。
// 方式1:使用xbatis的链式API(适用于95%场景)
List<SysUser> list = QueryChain.of(userMapper).eq(...).list();
// 方式2:直接执行原生SQL(应对5%的极端复杂场景)
List<SysUser> list = userMapper.selectList(
"SELECT * FROM sys_user WHERE ... /* 任意复杂SQL */",
params
);
🚀 极致简单的上手指南
添加依赖(Maven):
<dependency>
<groupId>cn.xbatis</groupId>
<artifactId>xbatis-spring-boot-starter</artifactId>
<version>1.9.9</version>
</dependency>
创建实体与Mapper:
@Data
@Table("sys_user") // 注解声明表名
public class User {
@TableId // 注解声明主键
private Long id;
private String name;
private Integer age;
}
// Mapper接口只需简单继承
public interface UserMapper extends MybatisMapper<User> {
// 无需任何方法,已拥有完整CRUD能力
}
即刻使用:
@Autowired
private UserMapper userMapper;
public void demo() {
// 1. 插入
User user = new User(null, "张三", 25);
userMapper.insert(user);
// 2. 查询 (条件自动过滤null)
List<User> list = QueryChain.of(userMapper)
.eq(User::getName, "张三")
.gt(User::getAge, 20)
.list();
// 3. 更新
UpdateChain.of(userMapper)
.eq(User::getId, 1L)
.set(User::getAge, 26)
.execute();
}
📊 谁最适合使用 xbatis?
-
✅ MyBatis 资深用户:觉得原生 MyBatis 写 CRUD 太繁琐,但不愿放弃其灵活性的你。
-
✅ MyBatis-Plus 用户:遇到复杂场景 MP 支持不足,或想更深度控制框架行为的你。
-
✅ 新项目选型:追求极高开发效率,又要求长期维护性和架构干净的你。
-
✅ 多数据库项目:需要一套代码兼容 MySQL、PostgreSQL 等多种数据库的你。
-
✅ 微服务架构:需要清晰、可维护的数据层,避免“黑盒魔法”带来调试噩梦的你。
🎁 立即开始
xbatis 的核心哲学是 “增强而非颠覆”。它让你在拥有现代化 ORM 开发体验的同时,脚下依然是 MyBatis 这座坚实、可靠的大山。
如果你已经受够了在灵活性与效率之间做妥协,那么 xbatis 就是你的最佳选择。现在就去 Star 项目,开始体验下一代 Java 数据持久层框架的优雅与强大!