1. MyBatis Flex代码生成器初探
作为一名长期使用MyBatis生态的开发者,第一次接触MyBatis Flex的代码生成功能时,最直观的感受就是"快"。这个轻量级的ORM框架内置的代码生成器,能在几秒内完成从数据库表到完整Java实体类、Mapper接口和Service层的全套代码生成。不同于传统MyBatis Generator需要繁琐的XML配置,Flex的代码生成器通过简洁的API即可实现高度定制化输出。
在实际项目中,我习惯将代码生成器集成到单元测试中运行。以下是一个典型的初始化配置示例:
java复制public class CodeGenTest {
@Test
public void generate() {
// 创建配置实例
GlobalConfig globalConfig = new GlobalConfig();
// 配置数据源
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/your_db");
dataSourceConfig.setUsername("root");
dataSourceConfig.setPassword("123456");
// 配置生成选项
globalConfig.setAuthor("YourName");
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
globalConfig.setPackagePath("com.example");
// 执行生成
new Generator(globalConfig, dataSourceConfig).generate();
}
}
这段代码背后有几个值得注意的设计决策:
- 采用链式API而非XML配置,使生成逻辑更直观
- 输出目录自动识别项目结构,避免硬编码路径
- 包路径配置采用点分格式,符合Java开发者习惯
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心代码生成策略解析
2.1 实体类生成机制
MyBatis Flex的实体类生成采用了智能字段映射策略。对于常见的数据库命名规范(如user_name)能自动转换为Java驼峰命名(userName)。更难得的是,它能识别JSR-303注解并自动添加基础校验逻辑:
java复制@Table("t_user")
public class User {
@Id(keyType = KeyType.Auto)
private Long id;
@Column("user_name")
@NotNull(message = "用户名不能为空")
@Size(max = 50, message = "用户名长度不能超过50")
private String userName;
// 自动生成的getter/setter
}
在实际项目中,我总结了几个优化点:
- 对于枚举字段,可以扩展TypeHandler自动注册
- 大文本字段建议手动添加@Column(typeHandler = ClobTypeHandler.class)
- 敏感字段需手动移除toString()方法
2.2 Mapper接口的智能生成
生成的Mapper接口默认继承了FlexMapper
java复制public interface UserMapper extends FlexMapper<User> {
// 自动生成的基础CRUD方法
// 根据@TableId自动识别主键操作
}
特别实用的是条件构造能力,比如生成这样的查询:
java复制QueryWrapper query = QueryWrapper.create()
.select(USER.ALL_COLUMNS)
.from(USER)
.where(USER.AGE.ge(18))
.and(USER.STATUS.eq(1));
3. 高级定制化配置实战
3.1 模板引擎定制
Flex默认使用Velocity模板,但支持替换为Freemarker等其他引擎。我曾在金融项目中定制过审计字段模板:
java复制globalConfig.setEntityTemplate("/templates/entity.java");
globalConfig.setMapperTemplate("/templates/mapper.java");
模板文件中可以使用这些内置变量:
- ${table.name} 表名
- ${table.remark} 表注释
- ${columns} 字段列表
- ${package} 包路径
3.2 生成策略配置
通过StrategyConfig可以精细控制生成逻辑:
java复制StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setGenerateTable("t_user,t_role"); // 指定表
strategyConfig.setTablePrefix("t_"); // 去除前缀
strategyConfig.setVersionField("version"); // 乐观锁字段
strategyConfig.setLogicDeleteField("is_deleted"); // 逻辑删除
globalConfig.setStrategyConfig(strategyConfig);
4. 企业级应用实践
4.1 多数据源支持
在微服务架构下,我这样配置多数据源生成:
java复制// 主库生成
generateForDataSource(primaryConfig, "com.example.primary");
// 从库生成
generateForDataSource(replicaConfig, "com.example.replica");
private void generateForDataSource(DataSourceConfig dsConfig, String basePackage) {
GlobalConfig config = new GlobalConfig();
config.setPackagePath(basePackage);
new Generator(config, dsConfig).generate();
}
4.2 生成代码的二次开发
建议在生成的Service层添加缓存注解:
java复制@Cacheable(cacheNames = "users", key = "#id")
public User getById(Serializable id) {
return super.getById(id);
}
对于复杂查询,可以这样扩展:
java复制public Page<User> queryByCondition(int pageNum, QueryCondition cond) {
QueryWrapper query = QueryWrapper.create()
.where(cond.toCondition())
.orderBy(USER.CREATE_TIME.desc());
return mapper.paginate(pageNum, 10, query);
}
5. 性能优化与注意事项
5.1 生成速度优化
对于大型数据库(100+表),建议:
- 分批生成表
- 禁用实时预览
- 增加JVM内存
java复制globalConfig.setEnablePreview(false); // 关闭实时预览
5.2 常见问题排查
- 字段类型映射错误:通过TypeHandler自定义
- 表注释丢失:检查数据库连接权限
- 生成代码编译错误:检查JDK版本兼容性
一个实用的调试技巧是在生成前输出配置:
java复制System.out.println(globalConfig.toString());
System.out.println(dataSourceConfig.toString());
6. 与MyBatis Plus生成器对比
在同时使用过两个生成器后,我发现Flex有几个优势:
- 条件构造更符合SQL原生写法
- 对关联查询支持更好
- 生成的代码更简洁
但迁移时需要注意:
- 注解包路径不同(@Table等)
- 分页参数构造方式差异
- 乐观锁实现机制不同
实际项目中,我建议新项目直接使用Flex,老项目逐步迁移。对于简单的CRUD操作,两者生成的代码差异不大,但复杂查询时Flex的条件构造明显更直观。
