1.引入依赖
<dependency>
<groupId>com.ehaomiao</groupId>
<artifactId>ehm-common-generation</artifactId>
</dependency>
2.在需要生成代码包下随便创建一个java文件 配置表名 作者名 表前缀名
public static void main(String[] args) {
new GenerationFactory()
.table("mv_behavior_alarm_log",
"mv_motor_commodity_alarm_log",
"mv_absence_alarm_log")
.author("xzj")
.tablePrefix("mv_")
.build();
}
3.运行程序后会在同级目录下生成 controller、mapper.java、mapper.xml、service、serviceImpl、entity文件
原理解析:
1.获取调用方所在项目路径
//获取项目所在路径
String jarWholePath = Thread.currentThread()
.getContextClassLoader()
.getResource("./")
.getPath();
String jarPath = new File(jarWholePath)
.getParentFile()
.getParentFile()
.getAbsolutePath();
2.获取调用方所在包名
//获取包名
String packageName = null;
try {
packageName = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName()).getPackage().getName();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//父包名称
StringBuilder parentName = new StringBuilder();
//模块名称
String moduleName = "";
//包名不为null
if (packageName != null) {
String[] split = packageName.split("\\.");
//父包名称
for (int i = 0; i < split.length - 1; i++) {
parentName.append(split[i]).append(".");
}
if (parentName.length() > 0) {
parentName.deleteCharAt(parentName.length() - 1);
}
moduleName = split[split.length - 1];
}
3.获取调用方资源文件下application.yml 配置数据库资源
spring:
datasource:
dynamic:
datasource:
master:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.165:4406/ehm_cloud_data_center?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
//从yml文件中读取连接数据库地址 用户名 密码
Yaml yaml = new Yaml();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.yml");
Map<String, Object> map = yaml.loadAs(in, Map.class);
Map<String, Object> master =
(Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>)
map.get("spring")).get("datasource")).get("dynamic")).get("datasource")).get("master");
String url = master.get("url").toString();
String username = master.get("username").toString();
String password = master.get("password").toString();
4.调用mybatis plus 方法 生成代码,模块resources下自定义entity.java.ftl、 controller.java.ftl 模板
//mybatis plus 方法
String finalModuleName = moduleName;
FastAutoGenerator.create(url,
username,
password)
.globalConfig(builder -> {
builder.author(author) // 设置作者
.fileOverride() // 覆盖已生成文件
.outputDir(jarPath + "/src/main/java"); // 指定输出目录
})
//包名配置,这个配置指/src/main/java下开始的包路径
.packageConfig(builder -> {
builder.parent(parentName.toString()) // 设置父包名
.moduleName(finalModuleName) // 设置父包模块名
.xml("mapper.mapping");
})
//策略配置
.strategyConfig(builder -> {
builder.addInclude(table) // 设置需要生成的表名
.addTablePrefix(tablePrefix)
//自定义配置继承父包 HmBaseMapper 此类为我们公司扩展类
.mapperBuilder()
.superClass(HmBaseMapper.class)
.build()
//实体类配置
.entityBuilder()
.enableLombok()
.enableChainModel()
.enableTableFieldAnnotation()
//继承父类,忽略父类公共字段
.superClass(BaseEntity.class)
.addIgnoreColumns("create_time", "create_by", "update_time", "update_by")
.build()
//service配置
.serviceBuilder()
.superServiceClass(IHmService.class)
.superServiceImplClass(HmServiceImpl.class)
.build();
})
// 使用Freemarker引擎模板,默认的是Velocity引擎模板
.templateEngine(new FreemarkerTemplateEngine())
//自定义模板
.templateConfig(builder -> {
builder.entity("/templates/entity.java")
.controller("/templates/controller.java")
.build();
})
.execute();
}




controller.java.ftl 和 entity.java.ftl
package ${package.Controller};
import org.springframework.web.bind.annotation.*;
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
import com.ehaomiao.common.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${table.entityName};
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>
/**
* <p>
* ${table.comment!} 前端控制器
* </p>
*
* @author ${author}
* @since ${date}
*/
@Slf4j
@RestController
@RequestMapping("/${table.entityName?uncap_first}")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if>
@Autowired
private ${table.serviceName} ${table.entityName?uncap_first}Service;
/**
*
* 获得 ${table.entityName} 列表
*
* @author ${author}
* @since ${date}
*/
@GetMapping("/")
public Result<List<${table.entityName}>> list() {
List<${table.entityName}> ${table.entityName?uncap_first}List = ${table.entityName?uncap_first}Service.list();
log.debug("${table.entityName}.list方法调用:{}",${table.entityName?uncap_first}List);
return Result.successByData(${table.entityName?uncap_first}List);
}
/**
*
* 修改 ${table.entityName}
*
* @author ${author}
* @since ${date}
*/
@PutMapping("/")
public Result<Boolean> update(@RequestBody ${table.entityName} ${table.entityName?uncap_first}) {
boolean flag = ${table.entityName?uncap_first}Service.updateById(${table.entityName?uncap_first});
log.debug("${table.entityName}.update方法调用,请求参数${table.entityName}:{},result:{}",${table.entityName?uncap_first},flag);
return Result.successOrFail(flag);
}
/**
*
* 根据id删除 ${table.entityName}
*
* @author ${author}
* @since ${date}
*/
@DeleteMapping("/{id}")
public Result<Boolean> delete(@PathVariable <#list table.fields as field><#if field.keyFlag == true>${field.columnType?lower_case?cap_first}</#if></#list> id) {
boolean flag = ${table.entityName?uncap_first}Service.removeById(id);
log.debug("${table.entityName}.delete方法调用,请求参数${table.entityName}:{},result:{}",id,flag);
return Result.successOrFail(flag);
}
/**
*
* 添加 ${table.entityName}
*
* @author ${author}
* @since ${date}
*/
@PostMapping("")
public Result<Boolean> insert(@RequestBody ${table.entityName} ${table.entityName?uncap_first}) {
boolean flag = ${table.entityName?uncap_first}Service.save(${table.entityName?uncap_first});
log.debug("${table.entityName}.insert方法调用,请求参数${table.entityName}:{},result:{}",${table.entityName?uncap_first},flag);
return Result.successOrFail(flag);
}
}
</#if>
package ${package.Entity};
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if entityLombokModel>
import lombok.Data;
<#if chainModel>
import lombok.experimental.Accessors;
</#if>
</#if>
/**
* <p>
* ${table.comment!}
* </p>
*
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
<#if chainModel>
@Accessors(chain = true)
</#if>
</#if>
<#if table.convert>
@TableName("${schemaName}${table.name}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#elseif entitySerialVersionUID>
public class ${entity} implements Serializable {
<#else>
public class ${entity} {
</#if>
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
<#if field.keyFlag>
<#assign keyPropertyName="${field.propertyName}"/>
</#if>
/**
* ${field.comment}
*/
<#if field.keyFlag>
<#-- 主键 -->
<#if field.keyIdentityFlag>
@TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
<#elseif idType??>
@TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
<#elseif field.convert>
@TableId("${field.annotationColumnName}")
</#if>
<#-- 普通字段 -->
<#elseif field.fill??>
<#-- ----- 存在字段填充设置 ----->
<#if field.convert>
@TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
<#else>
@TableField(fill = FieldFill.${field.fill})
</#if>
<#elseif field.convert>
@TableField("${field.annotationColumnName}")
</#if>
<#-- 乐观锁注解 -->
<#if field.versionField>
@Version
</#if>
<#-- 逻辑删除注解 -->
<#if field.logicDeleteField>
@TableLogic
</#if>
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
<#if !entityLombokModel>
<#list table.fields as field>
<#if field.propertyType == "boolean">
<#assign getprefix="is"/>
<#else>
<#assign getprefix="get"/>
</#if>
public ${field.propertyType} ${getprefix}${field.capitalName}() {
return ${field.propertyName};
}
<#if chainModel>
public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
<#else>
public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
</#if>
this.${field.propertyName} = ${field.propertyName};
<#if chainModel>
return this;
</#if>
}
</#list>
</#if>
<#if entityColumnConstant>
<#list table.fields as field>
public static final String ${field.name?upper_case} = "${field.name}";
</#list>
</#if>
<#if activeRecord>
@Override
public Serializable pkVal() {
<#if keyPropertyName??>
return this.${keyPropertyName};
<#else>
return null;
</#if>
}
</#if>
<#if !entityLombokModel>
@Override
public String toString() {
return "${entity}{" +
<#list table.fields as field>
<#if field_index==0>
"${field.propertyName}=" + ${field.propertyName} +
<#else>
", ${field.propertyName}=" + ${field.propertyName} +
</#if>
</#list>
"}";
}
</#if>
}