1. MyBatis Flex代码生成器实战指南
作为一名长期使用MyBatis生态的开发者,我最近发现了一个比MyBatis Plus更轻量灵活的ORM框架——MyBatis Flex。它最吸引我的特性就是内置的高效代码生成器,今天就来详细分享如何利用这个工具快速生成标准化的项目代码。
MyBatis Flex与MyBatis Plus的主要区别在于注解风格和代码生成方式。Flex使用@Table注解标记实体类,而Plus使用@TableName。虽然看似小差异,但Flex的代码生成器在配置灵活性和生成策略上更有优势。下面通过一个完整的聊天记录表代码生成案例,带你掌握这个提效利器。
1.1 环境准备与基础配置
首先确保项目中已引入MyBatis Flex核心依赖(以Maven为例):
xml复制<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-core</artifactId>
<version>1.2.3</version>
</dependency>
代码生成器需要读取数据库元信息,推荐使用HikariCP作为数据源。以下是典型的application.yml配置:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/chat_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
注意:生成代码前请确保数据库连接配置正确,且账号有足够的元数据查询权限
1.2 核心代码生成实现
创建MyBatisCodeGenerator类作为代码生成入口,核心逻辑分为三个部分:
1.2.1 数据源初始化
java复制// 使用Hutool工具类读取YAML配置
Dict dict = YamlUtil.loadByPath("application.yml");
Map<String, Object> dsConfig = dict.getByPath("spring.datasource");
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(String.valueOf(dsConfig.get("url")));
dataSource.setUsername(String.valueOf(dsConfig.get("username")));
dataSource.setPassword(String.valueOf(dsConfig.get("password")));
这里选择HikariCP是因为它作为Spring Boot默认连接池,在性能和稳定性上表现优异。通过Hutool的YamlUtil可以优雅地读取配置文件,避免硬编码敏感信息。
1.2.2 全局配置构建
java复制GlobalConfig globalConfig = new GlobalConfig();
// 包路径配置
globalConfig.getPackageConfig()
.setBasePackage("com.example.chatmodule");
// 生成策略配置
globalConfig.getStrategyConfig()
.setGenerateTable(new String[]{"chat_history"})
.setLogicDeleteColumn("is_deleted");
// 实体类配置
globalConfig.enableEntity()
.setWithLombok(true)
.setJdkVersion(17);
// 生成Mapper及XML
globalConfig.enableMapper();
globalConfig.enableMapperXml();
// 生成Service层
globalConfig.enableService();
globalConfig.enableServiceImpl();
// 生成Controller
globalConfig.enableController();
// 文档注释配置
globalConfig.getJavadocConfig()
.setAuthor("YourName")
.setSince("1.0");
关键配置说明:
- 逻辑删除字段
is_deleted需要与实际数据库字段名一致 - JDK版本建议与项目实际版本保持一致
- 包路径最好按功能模块划分,便于后期维护
1.2.3 执行代码生成
java复制Generator generator = new Generator(dataSource, globalConfig);
generator.generate();
执行main方法后,会在项目目录下生成完整的四层架构代码:
code复制src/main/java/com/example/chatmodule/
├── controller
├── entity
├── mapper
├── service
└── impl
1.3 高级配置技巧
1.3.1 自定义类型映射
当数据库字段类型需要特殊处理时,可以添加类型转换器:
java复制globalConfig.getStrategyConfig()
.registerColumnType("tinyint", "Boolean")
.registerColumnType("json", "com.fasterxml.jackson.databind.JsonNode");
1.3.2 字段覆盖策略
避免重复生成时覆盖已有业务逻辑:
java复制globalConfig.getStrategyConfig()
.setEntityOverwriteEnable(false)
.setMapperOverwriteEnable(true);
1.3.3 模板自定义
支持Freemarker模板引擎自定义输出格式:
java复制globalConfig.setTemplateConfig(new TemplateConfig()
.setEntity("/templates/entity.java")
.setMapperXml("/templates/mapper.xml"));
1.4 常见问题排查
-
表字段无法识别
- 检查数据库连接权限
- 确认表名大小写是否匹配
- MySQL需设置useInformationSchema=true
-
Lombok注解不生效
- 确保项目已引入Lombok依赖
- IDE需要安装Lombok插件
- 检查JDK版本兼容性
-
生成代码格式混乱
- 配置代码格式化模板
- 建议生成到临时目录后再手动迁移
- 使用prettier等工具后处理
-
性能优化建议
- 批量生成时限制并发线程数
- 禁用不需要的层级生成
- 合理设置生成间隔避免数据库压力
1.5 实际应用建议
经过多个项目的实践验证,我总结出以下最佳实践:
-
分层生成策略:先生成Entity和Mapper进行数据层验证,再生成Service和Controller
-
版本控制:将生成的代码视为编译产物,建议.gitignore中排除生成目录
-
增量生成:对于已有业务逻辑的类,采用Annotation策略只生成新增字段
-
自定义扩展:继承Generator类重写生成逻辑,添加审计字段等通用功能
-
文档生成:结合Swagger注解生成API文档,形成完整的工作流
相比MyBatis Plus的代码生成器,Flex版本在以下场景表现更优:
- 需要高度定制化生成的复杂项目
- 多数据源配置的环境
- 微服务架构中的模块化开发
- 需要与现有代码深度集成的场景
最后分享一个实用技巧:可以通过Hook接口在生成前后插入自定义逻辑,比如自动注册到Spring容器或生成单元测试骨架。这种灵活的设计让MyBatis Flex在复杂项目中也能游刃有余。