Smart Mybatis:一个让 MyBatis 重回轻盈的框架
简单说明
Smart Mybatis 通过 Lambda DSL 将实体、Mapper 与 SQL 串起来,不做二次封装、不代理 MyBatis,本质是把已有特性用得更聪明。
官方文档: https://mybatis.icoding.ink/
Github: https://github.com/onlyGuo/smart-mybatis
阅读文档后, 基本有了一个概念:
概念
- 作者在长期 MyBatis 实战中发现,重复 CRUD 与脚手架生成会让项目迭代和维护成本居高不下,于是先有了实验性的 EasyMybatis(docs/guide/dev/preface.html)。
- 随着 Spring Boot 普及与 Provider 能力增强,回归轻量、聚焦底层控制的需求越发明显,Smart Mybatis 因此诞生:只增强、不重写。
- 框架源码极简,声称五分钟即可通读(docs/guide/quick/quick-start.html),强调学习曲线低。
特性
- 零定制, 零代理
- 多种命名匹配规则配置
- 表前缀配置
- 表明/字段名定制匹配
- 支持对象字段
- 支持枚举字段
- 多种住建策略配置, 支持分布式ID
- 统一的增删改查
- 一键开关配置
- 基于Lambda的DSL查询
- 全部基于Mybatis原生特性实现, 性能无损, 体积仅64k.
即刻体验
- 获取示例项目
git clone https://github.com/thisguo/spring-boot-starter-smart-mybatis-example.git cd spring-boot-starter-smart-mybatis-example - 准备数据库与连接信息(docs/guide/quick/quick-start.html):
项目启动后即可自动初始化表结构。spring: datasource: url: jdbc:mysql://localhost:3306/your_database username: your_username password: your_password - 运行
mvn spring-boot:run # 或 gradle bootRun
核心能力概览
极简实体映射
- 所有实体继承
PO,用@ID标识主键,@TableName、@TableField用于自定义表/列(docs/guide/dev/entity.html)。 - 全局命名策略可通过
spring.mybatis.smart.naming-convention切换驼峰转大小写或保持原样(docs/guide/dev/naming.html、docs/guide/quick/project-configuration.html)。 table-prefix允许一次性为所有表名加统一前缀(docs/guide/dev/table-prefix.html)。
自动同步与配置统一入口
- 以
spring.mybatis.smart.*为前缀的配置集中管理增强功能。 auto-sync-db:在开发环境自动根据实体更新表结构(docs/guide/dev/auto-sync-db.html),省掉手写 DDL 的重复劳动。enable、naming-convention、table-prefix等开关让你逐步引入 Smart Mybatis,必要时还能随时降级为原生行为(docs/guide/quick/project-configuration.html)。
主键与字段的自由度
@ID(generateType = PrimaryGenerateType.AUTO|UUID|SNOWFLAKE|SNOWFLAKE_HEX|INPUT)(docs/guide/dev/primary-generator.html)覆盖常见分布式 ID 方案。@TableField除了自定义名字、长度、类型、注释外,还能声明json = true把复杂对象序列化到单列中(docs/guide/dev/custom-field-mapping.html、docs/guide/dev/json-field.html)。
内置 CRUD 与 DSL 查询
- Mapper 只需继承
SmartMapper<T>即包含insert/insertBatch/updateById/deleteById/delete/ select等常用方法(docs/guide/dev/comm-adm.html、docs/guide/quick/project-dev.html)。 - 条件构造器
Where提供 TDD 式链式 DSL:Where.where().ifAnd(User::getUsername).like(keyword),既可动态拼条件也可写出 IDE 友好的单参语法(docs/guide/dev/dsl-query.html、docs/guide/dev/not-null-query.html)。 - DSL API 同时支持短名(
eq,gte)与长名(equalsFor,greaterThanOrEquals),可按团队代码风格混用。
建议的落地路径
-
引入依赖:确保项目先包含官方 MyBatis,再按 官方文档 添加
ink.icoding:spring-boot-starter-smart-mybatis。 -
配置基线:在
application.yml中统一好naming-convention、table-prefix、auto-sync-db(开发环境打开同步)。
就是创建或修改一个Java实体类, 数据库会自动建表或修改表结构, 这倒是很新颖. 之前见过很多通过数据库去生成实体类的方案, 第一次见通过实体类去生成数据库的. 不过也有好处, 以后的开发只需要提交代码就行了, 不会出现不同环境的数据库残缺或不一致的问题.
作者说生产环境中建议关闭, 但其实我认为不需要关闭因为按照框架源码分析, 如果有问题的话一定会在开发环境中先暴露出来, 不会出现生产独有的问题 -
建模实体与 Mapper:实体继承
PO,Mapper 继承SmartMapper<T>,优先使用注解描述字段特性而不是手写 XML。 -
拥抱 DSL:查询逻辑用
WhereDSL 表达条件,同时结合ifAnd/ifOr处理可选参数,避免 if-else 拼 SQL。
看着的确很舒服, 配合IDE自动提示的话效率会提高很多, 减少了if else:
// 动态条件查询
public List<User> searchUser(String nicker, Sex sex, Boolean isAdmin){
return mapper.select(Where
.ifWhere(User::getName).lite(nicker)
.ifAnd(User::getSex).equalseTo(sex)
.ifAnd(User::isAdmin).equalseTo(isAdmin)
);
}
- 善用增强但保留控制权:需要 JSON 字段、主键策略、批量 CRUD 时交给 Smart Mybatis;当要写极端 SQL 时仍可回到原生 Mapper,自由度不受限。
结语
Smart Mybatis 没有试图替你重写 MyBatis,而是提供了一套把实体、配置、查询语义联通的轻量增强。它适合那些既想拥有快速 CRUD、自动建模、可读 DSL,又想随时拿回底层控制权的团队。现在就把它接入你下一个 Spring Boot/MyBatis 项目,体验五分钟读完源码、十分钟落地的轻盈感吧。

浙公网安备 33010602011771号