文章目录
- 前言
- 一、安装
- 二、生成方式
- 1.DefaultQuery (元数据查询)
- 2.存在问题
- 三、快速生成
- 1. 生成代码
- 2. 目录结构
- 四、交互式
- 总结
前言
全新的 MyBatis-Plus 代码生成器,通过 builder 模式可以快速生成你想要的代码,快速且优雅,跟随下面的代码一睹为快。
一、安装
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.32</version>
</dependency>
由于代码生成器用到了模板引擎,请自行引入您喜好的模板引擎。MyBatis-Plus Generator 支持如下模板引擎:
- VelocityTemplateEngine(Default)
- FreemarkerTemplateEngine
- BeetlTemplateEngine
- EnjoyTemplateEngine
如果您还想使用或适配其他模板引擎,可自行继承 AbstractTemplateEngine 并参考其他模板引擎实现自定义。
二、生成方式
1.DefaultQuery (元数据查询)
优点: 根据通用接口读取数据库元数据相关信息,对数据库通用性较好。
缺点: 依赖数据库厂商驱动实现。
备注: 默认方式,部分类型处理可能不理想。
2.存在问题
元数据查询目前有如下问题:
- 不支持使用 NotLike 的方式反向生成表。
- 无法读取表注释,解决方法:
- MySQL链接增加属性 remarks=true&useInformationSchema=true
- Oracle链接增加属性 remarks=true 或者 remarksReporting=true(某些驱动版本)
- SqlServer:驱动不支持
- 部分 PostgreSQL 类型处理不佳(如 json、jsonb、uuid、xml、money 类型),解决方法:
- 转换成自定义的类型配合自定义 TypeHandler 来处理。
- 扩展 typeConvertHandler 来处理(3.5.3.3 后增加了 typeName 获取)。
- MySQL 下 tinyint 字段转换问题:
-
当字段长度为 1 时,无法转换成 Boolean 字段,建议在指定数据库连接时添加 &tinyInt1isBit=true。
-
当字段长度大于 1 时,默认转换成 Byte,如果想继续转换成 Integer,可使用如下代码:
FastAutoGenerator.create("url", "username", "password").dataSourceConfig(builder ->builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {// 兼容旧版本转换成Integerif (JdbcType.TINYINT == metaInfo.getJdbcType()) {return DbColumnType.INTEGER;}return typeRegistry.getColumnType(metaInfo);}));
三、快速生成
1. 生成代码
public static void main(String[] args) {FastAutoGenerator.create("url", "username", "password").globalConfig(builder -> {builder.author("baomidou") // 设置作者.enableSwagger() // 开启 swagger 模式.outputDir("D://"); // 指定输出目录}).dataSourceConfig(builder ->builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {int typeCode = metaInfo.getJdbcType().TYPE_CODE;if (typeCode == Types.SMALLINT) {// 自定义类型转换return DbColumnType.INTEGER;}return typeRegistry.getColumnType(metaInfo);})).packageConfig(builder ->builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名.moduleName("system") // 设置父包模块名.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")) // 设置mapperXml生成路径).strategyConfig(builder ->builder.addInclude("t_simple") // 设置需要生成的表名.addTablePrefix("t_", "c_") // 设置过滤表前缀).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();
}
2. 目录结构
四、交互式
public static void main(String[] args) {FastAutoGenerator.create("url", "username", "password")// 全局配置.globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称?")))// 包配置.packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?")))// 策略配置.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))).entityBuilder().enableLombok().addTableFills(new Column("create_time", FieldFill.INSERT)).build())// 使用Freemarker引擎模板,默认的是Velocity引擎模板.templateEngine(new FreemarkerTemplateEngine()).execute();
}// 处理 all 情况
protected static List<String> getTables(String tables) {return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
总结
回到顶部
更多案例:
H2CodeGeneratorTest
FastAutoGeneratorTest