依赖包版本 🔗
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version> <!-- or latest version -->
</dependency>
Java代码生成 🔗
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import java.sql.Types;
import java.util.*;
public class CodeGeneratorTest {
public static void main(String[] args) {
// 数据库配置
String url = "jdbc:mysql://127.0.01:3306/test?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "123456";
// 表名配置
String[] tableName = {"sys_subject"};
String[] tablePreFix = {"sys_", "tpl_"};
// 项目配置
String projectName = "com-server-demo-provider";
String basePkg = "com.server.demo.provider";
String moduleName = "subject";
String author = "abner";
String rootPath = System.getProperty("user.dir");
String mainPath = rootPath + "/" + projectName + "/src/main";
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
builder.author(author)
.fileOverride()
.outputDir(mainPath + "/java");
})
.dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT || typeCode == Types.TINYINT) { // 添加 TINYINT 类型处理
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
}))
.packageConfig(builder -> {
builder.parent(basePkg)
.moduleName(moduleName)
.entity("model.entity") // 实体类放在model包下
.pathInfo(Collections.singletonMap(OutputFile.xml, mainPath + "/mapper/" + moduleName));
})
.strategyConfig(builder -> {
builder.addInclude(tableName)
.addTablePrefix(tablePreFix);
// 实体类配置
builder.entityBuilder()
//.superClass(BaseEntity.class)
.enableChainModel()
.enableLombok()
.disableSerialVersionUID()
.enableTableFieldAnnotation()
// 字段过滤配置(排除BaseEntity.class父类中已经继承的字段,防止重复生成覆盖)
//.addSuperEntityColumns("id", "create_by", "create_name",
"create_time", "modify_by", "modify_name",
"modify_time");
// 新增Controller配置
builder.controllerBuilder()
.enableRestStyle() // 使用@RestController注解
.enableHyphenStyle() // 启用驼峰转连字符
.formatFileName("%sController");
// Mapper配置
builder.mapperBuilder()
.superClass(BaseMapperX.class)
.enableBaseColumnList()
.enableMapperAnnotation();
// Service配置
builder.serviceBuilder()
.formatServiceFileName("%sService");
})
.injectionConfig(builder -> {
Map<String, Object> customMap = new HashMap<>();
// 添加父包路径变量
customMap.put("packageName", basePkg + "." + moduleName);
customMap.put("dtoPackage", "model.dto");
customMap.put("voPackage", "model.vo");
customMap.put("convertPackage", "model.convert");
builder.customMap(customMap)
// DTO模板
.customFile(new CustomFile.Builder()
.fileName("Dto.java")
.templatePath("/templates/dto.java.ftl")
.packageName("model.dto")
.build())
// VO模板
.customFile(new CustomFile.Builder()
.fileName("Vo.java")
.templatePath("/templates/vo.java.ftl")
.packageName("model.vo")
.build())
// Convert模板
.customFile(new CustomFile.Builder()
.fileName("Convert.java")
.templatePath("/templates/convert.java.ftl")
.packageName("model.convert")
.build());
})
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
Freemarker模板 🔗
convert.java.ftl
package ${packageName}.${convertPackage};
import ${package.Entity}.${entity};
import ${package.Entity?replace("entity","dto")}.${entity}Dto;
import ${package.Entity?replace("entity","vo")}.${entity}Vo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper(componentModel = "spring")
public interface ${entity}Convert {
${entity}Convert INSTANCE = Mappers.getMapper(${entity}Convert.class);
${entity}Dto entityToDto(${entity} entity);
${entity} dtoToEntity(${entity}Dto dto);
${entity} voToEntity(${entity}Vo vo);
List<${entity}Dto> entityListToDto(List<${entity}> entities);
}
dto.java.ftl
package ${packageName}.${dtoPackage};
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ${table.entityName}Dto {
}
vo.java.ftl
package ${packageName}.${voPackage};
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ${table.entityName}Vo {
}