Skip to content

代码生成器

一、相关依赖

下面的依赖组合主要用于 MyBatis-Plus 代码生成器、数据源配置以及模板渲染。 如果只是单独使用代码生成器,可以按实际情况裁剪,不一定需要全部引入。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mysql的依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
        <!--springboot mybatis依赖包-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <!-- mybatis plus 代码生成器依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!-- 代码生成器模板 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
        <!-- swaggerUI2 主要依赖-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- swaggerUI2 原生可视化视图 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- swaggerUI2 可视化插件视图 -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>

二、代码生成器模板

这一节主要整理生成器使用到的模板文件。常见做法是按 entitymapperservicecontroller 等维度拆分模板,方便后续按项目规范定制输出结果。

三、entity模板

entity.java.ftl

package ${package.Entity};

<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
<#if entityLombokModel>
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
</#if>

/**
* @Description ${table.comment}
* @Author ${author}
* @Date ${date}
*/
@ApiModel(value ="${table.comment}")
<#if entityLombokModel>
@Data
@EqualsAndHashCode(callSuper = false)
@Builder(toBuilder = true)
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
</#if>
<#if table.convert>
@TableName("${table.name}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#else>
public class ${entity} implements Serializable {
</#if>

<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
    <#if field.keyFlag>
        <#assign keyPropertyName="${field.propertyName}"/>
    </#if>
    <#if field.keyFlag>
        <#assign keyPropertyName="${field.propertyName}"/>
    </#if>
    <#if field.comment != "">
        @ApiModelProperty(value = "${field.comment}")
    </#if>
<#-- ----------  主键  ---------->
    <#if field.keyFlag>
        <#if field.keyIdentityFlag>
            @TableId(value = "${field.name}", type = IdType.AUTO)
        <#elseif idType?? && idType!= "">
            @TableId(value = "${field.name}", type = IdType.${idType})
        <#elseif field.convert>
            @TableId("${field.name}")
        </#if>
    <#-- ----------  普通字段  ---------->
    <#elseif field.fill??>
    <#-- ----------  存在字段填充设置  ---------->
        <#if field.convert>
            @TableField(value = "${field.name}", fill = FieldFill.${field.fill})
        <#else>
            @TableField(fill = FieldFill.${field.fill})
        </#if>
    <#else>
        @TableField("${field.name}")
    </#if>
<#-- ----------  乐观锁注解  ---------->
    <#if versionFieldName?? && versionFieldName == field.name>
        @Version
    </#if>
<#-- ----------  逻辑删除注解  ---------->
    <#if logicDeleteFieldName?? && logicDeleteFieldName == field.name>
        @TableLogic
    </#if>
    private ${field.propertyType} ${field.propertyName};
</#list>
<#-- ----------  END 字段循环遍历  ---------->
<#if !entityLombokModel>
    <#list table.fields as field>
        <#if field.propertyType.equals("boolean")>
            <#assign getprefix="is"/>
        <#else>
            <#assign getprefix="get"/>
        </#if>

        public ${field.propertyType} ${getprefix}${field.capitalName}() {
        return ${field.propertyName};
        }

        <#if entityBuilderModel>
            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 entityBuilderModel>
            return this;
        </#if>
        }
    </#list>
</#if>

<#if activeRecord>
    @Override
    protected Serializable pkVal() {
    <#if keyPropertyName??>
        return this.${keyPropertyName};
    <#else>
        return null;
    </#if>
    }
</#if>
<#if !entityLombokModel>
    @Override
    public String toString() {
    return "${entity}{" +
    <#list table.fields as feild>
        <#if velocityCount ==1>
            "${field.propertyName}=" + ${field.propertyName} +
        <#else>
            ", ${field.propertyName}=" + ${field.propertyName} +
        </#if>
    </#list>
    "}";
    }
</#if>
}

四、Mapper 的 Java 模板

mapper.java.ftl

package ${package.Mapper};

import ${package.Entity}.${entity};
import ${superMapperClassPackage};

/**
 * @Description ${table.comment} Mapper接口
 * @Author ${author}
 * @Date ${date}
 */
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {

}

五、mapper的xml模板

mapper.xml.ftl ---默认不配置好

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${package.Mapper}.${table.mapperName}">

    <#if baseResultMap>
        <!-- 通用查询映射结果 -->
        <resultMap id="${entity}Map" type="${package.Entity}.${entity}">
            <#list table.fields as field>
                <#if field.keyFlag><#--生成主键排在第一位-->
                    <id column="${field.name}" property="${field.propertyName}"/>
                </#if>
            </#list>
            <#list table.commonFields as field><#--生成公共字段 -->
                <result column="${field.name}" property="${field.propertyName}"/>
            </#list>
            <#list table.fields as field>
                <#if !field.keyFlag><#--生成普通字段 -->
                    <result column="${field.name}" property="${field.propertyName}"/>
                </#if>
            </#list>
        </resultMap>
    </#if>
    <#if baseColumnList>
            <!-- 通用查询结果列 -->
        <sql id="Base_Column_List">
            <#list table.commonFields as field>
                <#if field.name == field.propertyName >
                    ${field.name}#else${field.name} AS ${field.propertyName}
                </#if>
            </#list >
            ${table.fieldNames}
        </sql>
        <!-- 通用条件列 -->
        <sql id="${entity}ByCondition">
            <#list table.commonFields as field><#--生成公共字段-->
                <if test="${field.propertyName}!=null and ${field.propertyName}!=''">
                    AND ${field.name} = ${r"#{"}${field.propertyName}${r"}"}
                </if>
            </#list>
            <#list table.fields as field>
                <#if !field.keyFlag><#--生成普通字段 -->
                    <if test="${field.propertyName}!=null and ${field.propertyName}!=''">
                        AND ${field.name} = ${r"#{"}${field.propertyName}${r"}"}
                    </if>
                </#if>
            </#list>
        </sql>

        <!-- 通用设置列 -->
        <sql id="${entity}SetColumns">
            <#list table.commonFields as field><#--生成公共字段-->
                <if test="${field.propertyName}!=null and ${field.propertyName}!=''">
                    ${field.name} = ${r"#{"}${field.propertyName}${r"}"},
                </if>
            </#list>
            <#list table.fields as field>
                <#if !field.keyFlag><#--生成普通字段 -->
                    <if test="${field.propertyName}!=null and ${field.propertyName}!=''">
                        ${field.name} = ${r"#{"}${field.propertyName}${r"}"},
                    </if>
                </#if>
            </#list>
        </sql>
    </#if>
</mapper>

六、service模板

service.java.ftl

package ${package.Service};

import ${package.Entity}.${entity};
import ${superServiceClassPackage};

/**
 * @Description ${table.comment} 服务类接口
 * @Author ${author}
 * @Date ${date}
 */
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {

}

七、serviceImpl模板

serviceImpl.java.ftl

package ${package.ServiceImpl};

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import org.springframework.stereotype.Service;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * @Description ${table.comment}服务类实现
 * @Author ${author}
 * @Date ${date}
 */
@Service
@AllArgsConstructor
@Slf4j
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName}{

 }

八、controller模板

controller.java.ftl

package ${package.Controller};

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.lcy.study.base.response.Result;
import com.lcy.study.base.util.ResultUtil;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${entity};
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
* @Description ${table.comment}Controller
* @Author ${author}
* @Date ${date}
*/
@RestController
@RequestMapping("/${table.entityPath}")
@Api(tags = {"${table.comment}服务入口"})
@AllArgsConstructor
@Slf4j
public class ${table.controllerName} {

private final ${table.serviceName} ${table.entityPath}Service;

/**
* 新增
* @param ${table.entityPath} 添加信息
* @return Result
* @Author ${author}
* @date ${date}
**/
@PostMapping("/add.do")
@ApiOperation(value = "新增")
public Result<Object> save(${entity} ${table.entityPath}){
${table.entityPath}Service.save(${table.entityPath});
return ResultUtil.success();
}

/**
* 修改
* @param ${table.entityPath} 修改信息
* @return Result
* @Author ${author}
* @date ${date}
**/
@PostMapping("/update.do")
@ApiOperation(value = "修改")
public Result<Object> update(${entity} ${table.entityPath}){
${table.entityPath}Service.updateById(${table.entityPath});
return ResultUtil.success();
}
}

九、代码生成类

直接启动配置。有两个类,一个是按照默认格式生成,如下第一个,第二个按照模板生成

package com.lcy.study.mybatis.generator;

import java.util.ArrayList;
import java.util.List;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * @Description 生成器main方法
 * @Author lcy
 * @Date 2021/04/13 09:00
 */
public class GeneratorApplication {

    public static void main(String[] args){
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        System.out.println(gc);
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        // TODO 设置用户名
        gc.setAuthor("lcy");
        gc.setOpen(true);
        // service 命名方式
        gc.setServiceName("%sService");
        // service impl 命名方式
        gc.setServiceImplName("%sServiceImpl");
        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setFileOverride(true);
        //开启swaggerUI
        gc.setSwagger2(true);
        gc.setActiveRecord(true);
        // XML 二级缓存
        gc.setEnableCache(false);
        // XML ResultMap
        gc.setBaseResultMap(true);
        // XML columList
        gc.setBaseColumnList(true);
        //设置日期格式
        gc.setDateType(DateType.TIME_PACK);
        //设置id自动生成方式
        gc.setIdType(IdType.ASSIGN_ID);
        mpg.setGlobalConfig(gc);

        // TODO 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://106.53.90.108:3306/permission?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("lichaoyu0517");
        mpg.setDataSource(dsc);

        // TODO 包配置
        PackageConfig pc = new PackageConfig();
        //pc.setModuleName(scanner("模块名"));
        pc.setParent("com.lcy.study.project");
        pc.setEntity("domain.redPackage");
        pc.setService("service.redPackage");
        pc.setServiceImpl("service.redPackage.impl");
        mpg.setPackageInfo(pc);

        // 自定义需要填充的字段
        List<TableFill> tableFillList = new ArrayList<>();
        //如 每张表都有一个创建时间、修改时间
        //而且这基本上就是通用的了,新增时,创建时间和修改时间同时修改
        //修改时,修改时间会修改,
        //虽然像Mysql数据库有自动更新几只,但像ORACLE的数据库就没有了,
        //使用公共字段填充功能,就可以实现,自动按场景更新了。
        //如下是配置
        TableFill createField = new TableFill("CREATE_TIME", FieldFill.INSERT);
        TableFill modifiedField = new TableFill("LAST_UPDATE_TIME", FieldFill.INSERT_UPDATE);
        tableFillList.add(createField);
        tableFillList.add(modifiedField);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {

            @Override
            public void initMap(){
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {

            @Override
            public String outputFile(TableInfo tableInfo){
                // 自定义输入文件名称
                return projectPath + "/src/main/resources/mapper/"
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setTableFillList(tableFillList);

        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        // 设置逻辑删除键
        strategy.setLogicDeleteFieldName("deleted");
        // 指定生成的bean的数据库表名
        strategy.setInclude("red_package_record","red_package_info");
        //strategy.setSuperEntityColumns("id");
        // 驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }

}

模板生成。模板的路径和文件命名按照格式,如controller的模板,放在resources下的/vm/controller.java.vm

package com;

import java.util.ArrayList;
import java.util.List;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

/**
 * @Description TODO
 * @Author lcy
 * @Date 2020/6/29 9:43
 */
public class TemplateApplication {

    public static void main(String[] args){
        AutoGenerator generator = new AutoGenerator();
        // 全局变量配置
        GlobalConfig gc = new GlobalConfig();
        //当前路径
        String projectPath = System.getProperty("user.dir");
        //设置是否继承Model
        gc.setActiveRecord(true);
        // 输出路径
        gc.setOutputDir(projectPath + "/src/main/java");
        // 默认 false ,是否覆盖已生成文件
        gc.setFileOverride(true);
        //默认true ,是否打开输出目录
        gc.setOpen(true);
        // 默认false,是否开启二级缓存
        gc.setEnableCache(false);
        // 作者
        gc.setAuthor("lcy");
        //swagger注解 默认false
        gc.setSwagger2(true);
        // 默认false
        gc.setBaseResultMap(true);
        // 时间策略 默认TIME_PACK
        gc.setDateType(DateType.TIME_PACK);
        //默认false  和basemodel相似
        gc.setBaseColumnList(true);
        gc.setEntityName("%s");
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        // 指定生成的主键类型
        gc.setIdType(IdType.AUTO);
        generator.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dc = new DataSourceConfig();
        // 数据库信息查询 //默认mysql
        dc.setDbQuery(new MySqlQuery());
        // 数据库类型
        dc.setDbType(DbType.MYSQL);
        //类型转换 默认mysql
        dc.setTypeConvert(new MySqlTypeConvert());
        //数据库配置
        dc.setUrl("jdbc:mysql:///blog?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false");
        dc.setDriverName("com.mysql.jdbc.Driver");
        dc.setUsername("root");
        dc.setPassword("root");
        generator.setDataSource(dc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //代码生成到哪个包下面
        pc.setParent("com.lcy.project");
        pc.setEntity("entity.permission");
        pc.setService("service.permission");
        pc.setServiceImpl("service.permission.impl");
        generator.setPackageInfo(pc);
        // 自定义配置
        /**
         * 将xml生成到resource下面
         */
        // Velocity模板
        //String templatePath = "/templates/mapper.xml.vm";
        // 自定义输出配置
        // 自定义配置会被优先输出
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath + "/src/main/resources/mapper/"
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        // 配置模板
        TemplateConfig tc = new TemplateConfig();
        // vm/entity.java 模板路径配置,默认在vm目录下,.vm 后缀不用加
        //使用自定义模板生成代码
        tc.setController("/vm/controller.java.vm");
        tc.setService("/vm/service.java.vm");
        tc.setServiceImpl("/vm/serviceImpl.java.vm");
        tc.setEntity("/vm/entity.java.vm");
        tc.setMapper("/vm/mapper.java.vm");
        tc.setXml(null);
        generator.setTemplate(tc);

        // 数据库表配置
        StrategyConfig sc = new StrategyConfig();
        //是否大写命名 默认false
        sc.setCapitalMode(false);
        //是否跳过试图 默认false
        sc.setSkipView(true);
        // 表映射 驼峰命名
        sc.setNaming(NamingStrategy.underline_to_camel);
        // 字段映射 驼峰
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
        //是否使用lombak 默认为false
        sc.setEntityLombokModel(true);
        // 默认false
        sc.setRestControllerStyle(true);
        //默认true
        sc.setEntitySerialVersionUID(true);
        //默认false 将mysql字段名生成静态变量
        sc.setEntityColumnConstant(false);
        //表名,用,隔开
        sc.setInclude("user_info","role_info");
        //     sc.setExclude(""); //                 不需要生成  二选一
        // 默认false 注释
        sc.setEntityTableFieldAnnotationEnable(true);
        //默认false
        sc.setControllerMappingHyphenStyle(false);
        // 逻辑删除字段名称
        sc.setLogicDeleteFieldName("status");
        sc.setEntityLombokModel(true);
        generator.setStrategy(sc);

        // 模板引擎
        generator.setTemplateEngine(new VelocityTemplateEngine());
        generator.execute();
    }

}

模板参数

{
    "date": "2018-10-30",
    "superServiceImplClassPackage": "com.baomidou.mybatisplus.extension.service.impl.ServiceImpl",
    "baseResultMap": true,
    "superMapperClass": "BaseMapper",
    "activeRecord": true,
    "superServiceClass": "IService",
    "superServiceImplClass": "ServiceImpl",
    "table": {
        "comment": "查询指定城市所有测点的空气质量实况每小时更新",
        "commonFields": [],
        "controllerName": "AirStatLiveDataController",
        "convert": false,
        "entityName": "AirStatLiveData",
        "entityPath": "airStatLiveData",
        "fieldNames": "table_id, citycode, cityname, createtime, time, info, devid, stationname, aqi, pm25, pm10, co, so2, no2, o3, prkey",
        "fields": [
            {
                "capitalName": "TableId",
                "columnType": "LONG",
                "comment": "表单id",
                "convert": false,
                "keyFlag": true,
                "keyIdentityFlag": true,
                "name": "table_id",
                "propertyName": "tableId",
                "propertyType": "Long",
                "type": "bigint(20)"
            }
        ],
        "importPackages": [
            "com.baomidou.mybatisplus.annotation.IdType",
            "com.baomidou.mybatisplus.extension.activerecord.Model",
            "com.baomidou.mybatisplus.annotation.TableId",
            "java.io.Serializable"
        ],
        "mapperName": "AirStatLiveDataMapper",
        "name": "air_stat_live_data",
        "serviceImplName": "AirStatLiveDataServiceImpl",
        "serviceName": "AirStatLiveDataService",
        "xmlName": "AirStatLiveDataMapper"
    },
    "package": {
        "Entity": "com.enso.entity",
        "Mapper": "com.enso.mapper",
        "Xml": "com.enso.mapper",
        "ServiceImpl": "com.enso.service.impl",
        "Service": "com.enso.service",
        "Controller": "com.enso.controller"
    },
    "author": "Mr.Wang",
    "swagger2": false,
    "baseColumnList": false,
    "kotlin": false,
    "entityLombokModel": false,
    "superMapperClassPackage": "com.baomidou.mybatisplus.core.mapper.BaseMapper",
    "restControllerStyle": false,
    "entityBuilderModel": true,
    "superServiceClassPackage": "com.baomidou.mybatisplus.extension.service.IService",
    "entityBooleanColumnRemoveIsPrefix": false,
    "entityColumnConstant": false,
    "config": {
        "globalConfig": {
            "activeRecord": true,
            "author": "Mr.Wang",
            "baseColumnList": false,
            "baseResultMap": true,
            "controllerName": "%sController",
            "dateType": "TIME_PACK",
            "enableCache": false,
            "fileOverride": false,
            "kotlin": false,
            "mapperName": "%sMapper",
            "open": false,
            "outputDir": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java",
            "serviceImplName": "%sServiceImpl",
            "serviceName": "%sService",
            "swagger2": false,
            "xmlName": "%sMapper"
        },
        "packageInfo": {
            "$ref": "$.package"
        },
        "pathInfo": {
            "entity_path": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java\\com\\enso\\entity",
            "controller_path": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java\\com\\enso\\controller",
            "xml_path": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java\\com\\enso\\mapper",
            "service_path": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java\\com\\enso\\service",
            "mapper_path": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java\\com\\enso\\mapper",
            "service_impl_path": "C:\\Users\\Administrator\\IdeaProjects\\nan-ning\\src\\main\\java\\com\\enso\\service\\impl"
        },
        "strategyConfig": {
            "capitalMode": false,
            "columnNaming": "underline_to_camel",
            "controllerMappingHyphenStyle": false,
            "entityBooleanColumnRemoveIsPrefix": false,
            "entityBuilderModel": true,
            "entityColumnConstant": false,
            "entityLombokModel": false,
            "entityTableFieldAnnotationEnable": false,
            "include": [
                "air_stat_live_data"
            ],
            "naming": "underline_to_camel",
            "restControllerStyle": false,
            "skipView": false,
            "superMapperClass": "com.baomidou.mybatisplus.core.mapper.BaseMapper",
            "superServiceClass": "com.baomidou.mybatisplus.extension.service.IService",
            "superServiceImplClass": "com.baomidou.mybatisplus.extension.service.impl.ServiceImpl"
        },
        "superMapperClass": "com.baomidou.mybatisplus.core.mapper.BaseMapper",
        "superServiceClass": "com.baomidou.mybatisplus.extension.service.IService",
        "superServiceImplClass": "com.baomidou.mybatisplus.extension.service.impl.ServiceImpl",
        "tableInfoList": [
            {
                "$ref": "$.table"
            }
        ],
        "template": {
            "controller": "/templates/controller.java",
            "mapper": "/templates/mapper.java",
            "service": "/templates/service.java",
            "serviceImpl": "/templates/serviceImpl.java",
            "xml": "/templates/mapper.xml"
        }
    },
    "enableCache": false,
    "entity": "AirStatLiveData"
}