mybatis-plus (新) 代码生成器 封装

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>
}

 

posted @ 2022-03-18 15:06  java架构师1  阅读(318)  评论(0)    收藏  举报