com.baomidou
mybatis-plus-generator
3.5.1
org.freemarker
freemarker
2.3.30
生成器代码详解
@Data
public class MyBatisGenerate {
private String dbName;
private String module;
private String[] prefix;
private String parentPackage;
private String dbHostAndPort;
private String dbUserName;
private String dbPsw;
private String[] tables;
private MyBatisGenerate(String dbName, String module, String[] prefix, String parentPackage, String dbHostAndPort, String dbUserName, String dbPsw, String[] tables) {
this.dbName = dbName;
this.module = module;
this.prefix = prefix;
this.parentPackage = parentPackage;
this.dbHostAndPort = dbHostAndPort;
this.dbUserName = dbUserName;
this.dbPsw = dbPsw;
this.tables = tables;
}
public void generate() {
// 数据源配置
String url = "jdbc:mysql://" + dbHostAndPort + "/" + dbName + "?characterEncoding=utf8&useSSL=true&serverTimezone=Hongkong&strictUpdates=false&autoReconnect=true";
DataSourceConfig dsb = new DataSourceConfig.Builder(url, dbUserName, dbPsw)
.dbQuery(new MySqlQuery())
// 库名
.schema(dbName)
.typeConvert(new MySqlTypeConvert())
.keyWordsHandler(new MySqlKeyWordsHandler()).build();
// 获取当前项目路径
String projectPath = System.getProperty("user.dir");
// 全局配置
GlobalConfig gc = new GlobalConfig.Builder()
// 输出目录
.outputDir(projectPath + "/src/main/java")
// 覆盖已生成文件
.fileOverride()
// 作者
.author("bufei")
// 启用swagger
.enableSwagger()
.dateType(DateType.TIME_PACK)
.commentDate("yyyy-MM-dd HH:mm:ss")
.build();
// 包配置
PackageConfig pc = new PackageConfig.Builder()
.parent("edu.xupt.framework." + parentPackage)
// 设置父包模块名
.moduleName(module)
// 设置实体包
.entity("infrastructure.domain.model")
// 服务类
.service("infrastructure.repository")
// 服务类实现
.serviceImpl("infrastructure.repository.impl")
.mapper("infrastructure.mapper")
.xml("mapper.xml")
.controller("controller")
.other("other")
// 路径信息
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mybatis/mapper/"))
.build();
// 模板配置 不配无法生成
TemplateConfig tc = new TemplateConfig.Builder()
.disable(TemplateType.ENTITY)
.entity("/templates/entity.java")
.service("/templates/service.java")
.serviceImpl("/templates/serviceImpl.java")
.mapper("/templates/mapper.java")
.mapperXml("/templates/mapper.xml")
.controller("/templates/controller.java")
.build();
// 注入配置
InjectionConfig ic = new InjectionConfig.Builder()
.beforeOutputFile((tableInfo, objectMap) -> {
System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
})
// 没有自定义配置map对象
// 没有模板文件
.build();
// 策略配置
StrategyConfig sc = new StrategyConfig.Builder()
// 策略 开启大写命名
.enableCapitalMode()
.enableSkipView()
// 禁用SQL过滤
.disableSqlFilter()
// 表名
.addInclude(tables)
// 要移除的表前缀
.addTablePrefix(prefix)
// 配置实体策略
.entityBuilder()
// 父类
.superClass(Model.class)
// 禁用序列化
.disableSerialVersionUID()
// 启用链式编程
.enableChainModel()
//启用Lombok
.enableLombok()
// 启用表字段注解
.enableTableFieldAnnotation()
// 乐观锁
.versionColumnName("version")
.versionPropertyName("version")
// 逻辑删除
.logicDeleteColumnName("del_flag")
.logicDeletePropertyName("delFlag")
// 表名驼峰
.naming(NamingStrategy.underline_to_camel)
// 列名驼峰命名
.columnNaming(NamingStrategy.underline_to_camel)
.idType(IdType.AUTO)
// 格式化文件名称
.formatFileName("%sModel")
// 配置controller 策略
.controllerBuilder()
// 设置父类,没有,不配
// .superClass(baseController.class)
// RestController
.enableRestStyle()
.formatFileName("%sController")
// 配置serveice 策略
.serviceBuilder()
// baseRepository impl
.superServiceClass(baseRepository.class)
.superServiceImplClass(baseRepositoryImpl.class)
.formatServiceFileName("%sRepository")
.formatServiceImplFileName("%sRepositoryImpl")
// 配置mapper策略
.mapperBuilder()
// 父类
.superClass(SuperMapper.class)
// 启用mapper注解
.enableMapperAnnotation()
// 启用 baseResultMap
.enablebaseResultMap()
.enablebaseColumnList()
.formatMapperFileName("%sMapper")
.formatXmlFileName("%sMapper")
.build();
// 执行生成
new AutoGenerator(dsb)
// 全局配置
.global(gc)
.packageInfo(pc)
.injection(ic)
.strategy(sc)
.template(tc)
// 默认VelocityTemplateEngine引擎,改为freemark引擎
.execute(new FreemarkerTemplateEngine());
}
public static class Builder {
public Builder() {
}
private String dbName;
private String module;
private String[] prefix;
private String parentPackage;
private String dbHostAndPort;
private String dbUserName;
private String dbPsw;
private String[] tables;
public Builder setDbName(String dbName) {
this.dbName = dbName;
return this;
}
public Builder setModule(String module) {
this.module = module;
return this;
}
public Builder setPrefix(String[] prefix) {
this.prefix = prefix;
return this;
}
public Builder setParentPackage(String parentPackage) {
this.parentPackage = parentPackage;
return this;
}
public Builder setDbHostAndPort(String dbHostAndPort) {
this.dbHostAndPort = dbHostAndPort;
return this;
}
public Builder setDbUserName(String dbUserName) {
this.dbUserName = dbUserName;
return this;
}
public Builder setDbPsw(String dbPsw) {
this.dbPsw = dbPsw;
return this;
}
public Builder setTables(String[] tables) {
this.tables = tables;
return this;
}
public MyBatisGenerate build() {
return new MyBatisGenerate(dbName, module, prefix, parentPackage, dbHostAndPort, dbUserName, dbPsw, tables);
}
}
}
使用演示
public static void main(String[] args) {
new MyBatisGenerate.Builder()
.setDbName("test")
.setModule("")//没有分模块
.setPrefix(new String[]{""})//没有需要移除的前缀
.setParentPackage("generate")//当前项目的包名
.setDbHostAndPort("localhost:3306")
.setDbUserName("root")
.setDbPsw("123456")
.setTables(new String[]{"notice"})
.build()
.generate();
// SpringApplication.run(LearnMybatisPlusGenerateApplication.class, args);
}
问题 1
生成的model 会没有泛型的标记
例如
@Getter
@Setter
@Accessors(chain = true)
@TableName("user")
@ApiModel(value = "UserModel对象", description = "用户表")
public class UserModel extends Model {
// 这里还需要手动改为 Model
}
问题 2
没有理解 InjectionConfig ic = new InjectionConfig.Builder();
注入配置的用法。



