项目代码生成工具

代码生成工具

文章目录

提取公共类

比方说每个表中都有,ID,创建人,创建时间,修改人,等字段,我们可以将其提取出来,放到一个公共的core模块或者目录下面,我们的主体代码依赖中可以引入这个依赖,或者将core目录集成到我们业务代码中。我一般都是放到公共模块中,业务代码引入。

domain

bo
java 复制代码
package com.js.core.domain.bo;

import com.js.core.domain.BaseBean;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础BO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:21
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseBO extends BaseBean {

}
dto
java 复制代码
package com.js.core.domain.dto;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础AddDTO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:25
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseAddDTO extends BaseDTO{

}
java 复制代码
package com.js.core.domain.dto;

import com.js.core.domain.BaseBean;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础DTO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:22
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseDTO extends BaseBean {

}
java 复制代码
package com.js.core.domain.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础Page
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:33
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BasePageSearchDTO extends BaseSearchDTO{

    @ApiModelProperty(value = "每页条数")
    private Long size;
    @ApiModelProperty(value = "当前页")
    private Long current;

}
java 复制代码
package com.js.core.domain.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * <p>
 * 基础SearchDTO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:30
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseSearchDTO extends BaseDTO{

    @ApiModelProperty(value = "查询开始时间")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "查询结束时间")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "查询开始日期")
    private LocalDate startDate;
    @ApiModelProperty(value = "查询结束日期")
    private LocalDate endDate;
    @ApiModelProperty(value = "是否拼租户")
    private Boolean tenant;

}
java 复制代码
package com.js.core.domain.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础UpdateDTO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:30
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseUpdateDTO extends BaseDTO{

    @ApiModelProperty(value = "主键id")
    private Long id;

}
entity
java 复制代码
package com.js.core.domain.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础业务类
 * </p>
 *
 * @author Jshuai
 * @date 2021/5/26 19:40
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseBiz<T extends BaseBiz<T>> extends BaseEntity<T> {

}
java 复制代码
package com.js.core.domain.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础配置类
 * </p>
 *
 * @author Jshuai
 * @date 2021/5/26 19:40
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseConfig<T extends BaseConfig<T>> extends BaseEntity<T> {

    /**
     * 配置类通用名称
     */
    private String name;
    /**
     * 是否启用 默认0否/1是
     */
    private Boolean enabled;

}
java 复制代码
package com.js.core.domain.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * <p>
 * 基础Entity
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 18:04
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseEntity<T extends BaseEntity<T>> extends Model<T> {

    /**
     * 数据唯一标识
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 创建人
     */
    @TableField(fill = FieldFill.INSERT)
    private String createUser;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * 修改人
     */
    @TableField(fill = FieldFill.UPDATE)
    private String updateUser;
    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    /**
     * 是否逻辑删除,true:删除 false:未删除
     */
    @TableLogic(value = "false", delval = "true")
    private Boolean del;
    /**
     * 全宗单位id
     */
    private Long archiveCompanyId;

}
vo
java 复制代码
package com.js.core.domain.vo;

import com.js.core.domain.BaseBean;
import com.js.core.toolkit.util.CollectionUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

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

/**
 * <p>
 * 档案列表查询基础VO
 * </p>
 *
 * @author chenhang
 * @date 2022/3/28 11:30
 * @since JDK 1.8
 */
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseScheduleVO<T> extends BaseBean {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "表头集合")
    private List<TableHeader> tableHeaderList;
    @ApiModelProperty(value = "行元素集合")
    private List<T> valueList;

    @Data
    public static class TableHeader{
        @ApiModelProperty(value = "表头名")
        private String label;
        @ApiModelProperty(value = "对应属性")
        private String prop;
    }

    public static List<TableHeader> getHeaders(String[] props, List<String> names) {
        List<TableHeader> headers = new ArrayList<>();
        if (CollectionUtil.isEmpty(names)) {
            return headers;
        }
        for (int i = 0; i < Math.min(names.size(), props.length); i++) {
            TableHeader header = new TableHeader();
            header.setLabel(names.get(i));
            header.setProp(props[i]);
            headers.add(header);
        }
        return headers;
    }
}
java 复制代码
package com.js.core.domain.vo;

import com.js.core.domain.BaseBean;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 基础VO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 18:18
 * @since JDK 1.8
 */

@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseVO extends BaseBean {

    @ApiModelProperty(value = "数据唯一标识")
    private Long id;

}
java 复制代码
package com.js.core.domain.vo;

import com.js.core.enums.enumable.IEnumHolder;
import com.js.core.toolkit.util.CollectionUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 枚举对应 mapVO
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/22 14:15
 * @since JDK 1.8
 */

@Data
public class EnumMapVO  {

    private Map<String, EnumVO> enumMapVO;

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class EnumVO{

        @ApiModelProperty("枚举类名简称")
        private String cls;
        @ApiModelProperty("枚举类说明")
        private String name;
        @ApiModelProperty("枚举值集合")
        private List<EnumData> dataList;

        public static EnumVO newInstance(IEnumHolder<?> iEnumHolder, String enumDesc){
            EnumVO enumVO = new EnumVO();
            enumVO.setCls(iEnumHolder.getClass().getSimpleName());
            enumVO.setName(enumDesc);
            List<EnumData> dataList = new ArrayList<>();
            iEnumHolder.valueList().forEach(value -> dataList.add(EnumData.newInstance(value)));
            enumVO.setDataList(dataList);
            return enumVO;
        }

    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    public static class EnumData{

        @ApiModelProperty("枚举名称")
        private String enumName;
        @ApiModelProperty("枚举值code")
        private Integer code;
        @ApiModelProperty("枚举值名称")
        private String name;

        public static EnumData newInstance(IEnumHolder<?> iEnumHolder){
            return new EnumData(iEnumHolder.name(), iEnumHolder.getCode(), iEnumHolder.getName());
        }

    }

    public EnumMapVO map(IEnumHolder<?> iEnumHolder, String enumDesc){
        if (CollectionUtil.isEmpty(this.enumMapVO)){
            enumMapVO = new HashMap<>(48);
        }
        enumMapVO.put(iEnumHolder.getClass().getSimpleName(), EnumVO.newInstance(iEnumHolder, enumDesc));
        return this;
    }

    public EnumMapVO map(IEnumHolder<?> iEnumHolder, String enumDesc, String cardCode){
        if (CollectionUtil.isEmpty(this.enumMapVO)){
            enumMapVO = new HashMap<>(48);
        }
        enumMapVO.put(cardCode, EnumVO.newInstance(iEnumHolder, enumDesc));
        return this;
    }

}
java 复制代码
package com.js.core.domain.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 枚举展示类
 *
 * @Author: 
 * @E-mail: 
 * @Date: 2025年4月26日 下午5:25:18
 */

@SuppressWarnings("unused")
@Data
public class EnumVO implements Serializable {

    private static final long serialVersionUID = 1L;
    @ApiModelProperty("枚举类名")
    private String cls;
    @ApiModelProperty("枚举类注释")
    private String name;
    @ApiModelProperty("子类型")
    private List<EnumChildren> children;

    public EnumVO() {
        super();
    }

    public EnumVO(String cls, List<EnumChildren> children, String name) {
        this.cls = cls;
        this.name = name;
        this.children = children;
    }

    public String getCls() {
        return cls;
    }

    public void setCls(String cls) {
        this.cls = cls;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<EnumChildren> getChildren() {
        return children;
    }

    public void setChildren(List<EnumChildren> children) {
        this.children = children;
    }

    public static class EnumChildren implements Serializable {

        private static final long serialVersionUID = 1L;

        @ApiModelProperty("类型")
        private String type;
        @ApiModelProperty("类型名称")
        private String name;
        @ApiModelProperty("子集")
        private List<EnumChildren> children;

        public static class EnumChildrenAndParent extends EnumChildren {

            private static final long serialVersionUID = 1L;
            @ApiModelProperty("父级")
            private String parent;

            public EnumChildrenAndParent() {
                super();
            }

            public EnumChildrenAndParent(String type, String name, String parent) {
                setType(type);
                setName(name);
                this.parent = parent;
            }

            public String getParent() {
                return parent;
            }

            public void setParent(String parent) {
                this.parent = parent;
            }


        }

        public EnumChildren() {
            super();
        }

        public EnumChildren(String type, String name) {
            this.type = type;
            this.name = name;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setChildren(List<EnumChildren> children) {
            this.children = children;
        }

        public List<EnumChildren> getChildren() {
            return children;
        }
    }

}
Bean基类
java 复制代码
package com.js.core.domain;

import java.io.Serializable;

/**
 * <p>
 * 除entity外的bean基类
 * </p>
 *
 * @author Jshuai
 * @date 2025/04/27 17:15
 * @since JDK 1.8
 */

public abstract class BaseBean implements Serializable {

}

代码生成工厂

java 复制代码
package com.js.generator;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableField;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.js.core.domain.entity.BaseEntity;
import com.js.core.mapper.IBaseMapper;
import com.js.core.service.BaseService;
import com.js.core.service.impl.BaseServiceImpl;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 代码生成工厂
 * </p>
 *
 * @author Jshuai
 * @date 2021/5/7 16:13
 * @since JDK 1.8
 */
public class CodeFactory {

    /**
     * 代码生成器对象
     */
    private AutoGenerator generator = new AutoGenerator();

    /**
     * 全局配置对象
     */
    private GlobalConfig globalConfig = new GlobalConfig();
    /**
     * 数据源配置对象
     */
    private DataSourceConfig dataSourceConfig = new DataSourceConfig();
    /**
     * 包配置对象
     */
    private PackageConfig packageConfig = new PackageConfig();
    /**
     * 模板配置对象
     */
    private TemplateConfig templateConfig = new TemplateConfig();
    /**
     * 策略配置对象
     */
    private StrategyConfig strategyConfig = new StrategyConfig();
    /**
     * 自定义输出配置对象
     */
    private List<FileOutConfig> focList = new ArrayList<>();

    /**
     * 自定义配置对象
     */
    private static InjectionConfig cfg;

    /**
     * 代码输出尾目录
     */
    public static final String OUTPUT_DIR = "/src/main/java";
    /**
     * controller名
     */
    private static final String CONTROLLER_NAME = "%sController";
    /**
     * service名
     */
    private static final String SERVICE_NAME = "%sService";
    /**
     * serviceImpl名
     */
    private static final String SERVICE_IMPL_NAME = "%sServiceImpl";
    /**
     * serviceImpl名
     */
    private static final String MAPPER_NAME = "%sMapper";

    public CodeFactory(){

    }

    public CodeFactory(String author, String projectName, String dataSourceUrl, String driverName, String schemeName, String userName, String password,
                       String packageName, String bizDesc, String bizUrl, Boolean biz, Boolean conf, String tableName){
        initGlobalConfig(author, projectName);
        initDataSourceConfig(dataSourceUrl, driverName, schemeName, userName, password);
        initPackageConfig(packageName);
        initCfg(bizDesc, bizUrl, biz, conf);
        generatorConfiguration();
        initFileOutConfig();
        initTemplateConfig();
        initStrategyConfig(tableName);
        generator.execute();
    }

    /**
     * 构造代码生成器
     */
    private void generatorConfiguration() {
        cfg.setFileOutConfigList(focList);
        generator.setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setPackageInfo(packageConfig)
                .setCfg(cfg)
                .setTemplate(templateConfig)
                .setStrategy(strategyConfig)
                .setTemplateEngine(new FreemarkerTemplateEngine());
    }

    /**
     * 初始化全局配置
     */
    private void initGlobalConfig(String author, String projectName) {
        String projectPath = System.getProperty("user.dir") + "/" + projectName;
        globalConfig.setFileOverride(true)
                .setOutputDir(projectPath + OUTPUT_DIR)
                .setAuthor(author)
                .setOpen(false)
                .setControllerName(CONTROLLER_NAME)
                .setServiceName(SERVICE_NAME)
                .setServiceImplName(SERVICE_IMPL_NAME)
                .setMapperName(MAPPER_NAME);
    }

    /**
     * 初始化数据源配置
     */
    private void initDataSourceConfig(String dataSourceUrl, String driverName, String schemeName, String userName, String password) {
        dataSourceConfig.setDriverName(driverName)
                .setSchemaName(schemeName)
                .setUrl(dataSourceUrl)
                .setUsername(userName)
                .setPassword(password);
    }

    /**
     * 初始化包配置
     */
    private void initPackageConfig(String packageName) {
        packageConfig.setParent(packageName)
                .setEntity("domain.entity");
    }

    /**
     * 初始化自定义配置
     */
    private void initCfg(String bizDesc, String bizUrl, Boolean biz, Boolean conf) {
        cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> configMap = new HashMap<>(16);
                configMap.put("voPkg", packageConfig.getParent() + ".domain.vo");
                configMap.put("dtoPkg", packageConfig.getParent() + ".domain.dto");
                // 实体描述性信息
                configMap.put("bizDesc", bizDesc);
                // controller第二段路由
                configMap.put("bizUrl", bizUrl);
                // 是否业务类
                configMap.put("biz", biz == null ? Boolean.FALSE : biz);
                // 是否配置类
                configMap.put("conf", conf == null ? Boolean.FALSE : conf);
                setMap(configMap);
            }
        };
    }

    /**
     * 初始化自定义文件输出配置
     */
    private void initFileOutConfig() {
        // 文件输出根目录
        String outputParentDir = globalConfig.getOutputDir() + "/" + packageConfig.getParent().replace(".", "/");
        // entity文件输出配置
        focList.add(new FileOutConfig("/template/entity.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                handleTableInfo(tableInfo);
                return outputParentDir + "/domain/entity/" + tableInfo.getEntityName() + ".java";
            }
        });
        // AddDTO文件输出配置
        focList.add(new FileOutConfig("/template/entityAddDTO.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                handleTableInfo(tableInfo);
                return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "AddDTO.java";
            }
        });
        // UpdateDTO文件输出配置
        focList.add(new FileOutConfig("/template/entityUpdateDTO.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                handleTableInfo(tableInfo);
                return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "UpdateDTO.java";
            }
        });
        // SearchDTO文件输出配置
        focList.add(new FileOutConfig("/template/entitySearchDTO.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                handleTableInfo(tableInfo);
                return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "SearchDTO.java";
            }
        });
        // PageSearchDTO文件输出配置
        focList.add(new FileOutConfig("/template/entityPageSearchDTO.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                handleTableInfo(tableInfo);
                return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "PageSearchDTO.java";
            }
        });
        // VO文件输出配置
        focList.add(new FileOutConfig("/template/entityVO.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                handleTableInfo(tableInfo);
                return outputParentDir + "/domain/vo/" + tableInfo.getEntityName() + "VO.java";
            }
        });
    }

    private void handleTableInfo(TableInfo tableInfo) {
        List<String> excludeFields = Arrays.asList("enabled", "del", "createUser", "createTime", "updateUser", "updateTime", "archiveCompanyId" );
        List<TableField> fields = tableInfo.getFields().stream().filter(field -> !excludeFields.contains(field.getPropertyName())).collect(Collectors.toList());
        tableInfo.setFields(fields);
        tableInfo.getImportPackages().clear();
        tableInfo.getFields().forEach(field -> {
            if (field.getColumnType().getPkg() != null) {
                tableInfo.getImportPackages().add(field.getColumnType().getPkg());
            }
        });
    }

    /**
     * 初始化模板配置
     */
    private void initTemplateConfig() {
        templateConfig.setController("template/controller.java")
                .setService("template/service.java")
                .setServiceImpl("template/serviceImpl.java")
                .setEntity("template/entity.java")
                .setMapper("template/mapper.java")
                .setXml(null)
                .setEntity(null);
    }

    /**
     * 初始化策略配置
     */
    private void initStrategyConfig(String tableName) {
        /* strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); */
        strategyConfig.setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true)
                .setRestControllerStyle(true)
                .setSuperEntityClass(BaseEntity.class)
                .setSuperServiceClass(BaseService.class)
                .setSuperServiceImplClass(BaseServiceImpl.class)
                .setSuperMapperClass(IBaseMapper.class.getName())
                .setSuperEntityColumns("id", "del", "createUser", "createTime", "updateUser", "updateTime", "archiveCompanyId")
                .setInclude(tableName)
                .setTablePrefix("conf_", "common_", "record_", "ref_");
    }

}

连接配置

java 复制代码
package com.js.generator;

/**
 * asd
 *
 * @author by
 */
public class GeneratorApp {

    private final static  String AUTHOR = "JiangShuai";
    private final static String PROJECT_NAME = "数据库名称";

    private final static String DATA_SOURCE_URL = "jdbc:mysql://171.130.80.81:107/数据库名称";
    private final static String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
    private final static String SCHEMA_NAME = "数据库名称";
    private final static String USERNAME = "数据库账号";
    private final static String PASSWORD = "数据库密码";

    private final static String PACKAGE_NAME = "代码生成后存放在那个包路径下";

    private final static String BIZ_DESC = "表中文名";
    private final static String BIZ_URL = "";
    private final static Boolean BIZ = true;
    private final static Boolean CONF = false;

    private final static String TABLE_NAME = "表名称";

    public static void main(String[] args) {
        new CodeFactory(AUTHOR, PROJECT_NAME,
                DATA_SOURCE_URL, DRIVER_NAME, SCHEMA_NAME, USERNAME, PASSWORD,
                PACKAGE_NAME,
                BIZ_DESC, BIZ_URL, BIZ, CONF,
                TABLE_NAME);
    }

}

模版

在resource目录下面创建下面如图所示.java.ftl结尾的文件

1、基础类

基类Entity
java 复制代码
package ${package.Entity};

<#list table.importPackages as pkg>
<#--import ${pkg};-->
</#list>
import com.baomidou.mybatisplus.annotation.TableName;
<#if cfg.biz>
import com.js.core.domain.entity.BaseBiz;
<#elseif cfg.conf>
import com.js.core.domain.entity.BaseConfig;
<#else>
import com.js.core.domain.entity.BaseEntity;
</#if>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
    <#if chainModel>
import lombok.experimental.Accessors;
    </#if>
</#if>

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * <p>
 * ${table.comment!}
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */

<#if swagger2>
    @ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if entityLombokModel>
    <#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)
    <#else>
@EqualsAndHashCode(callSuper = false)
    </#if>
@Data
    <#if chainModel>
@Accessors(chain = true)
    </#if>
</#if>
@TableName("${table.name}")
<#if superEntityClass??>
	<#if cfg.biz>
public class ${entity} extends BaseBiz<${entity}> {
	<#elseif cfg.conf>
public class ${entity} extends BaseConfig<${entity}> {
    <#else>
public class ${entity} extends BaseEntity<${entity}> {
	</#if>
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#else>
public class ${entity} implements Serializable {
</#if>

<#if entitySerialVersionUID>
    private static final long serialVersionUID = 1L;
</#if>
<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
    <#if field.keyFlag>
        <#assign keyPropertyName="${field.propertyName}"/>
    </#if>

    <#if field.comment!?length gt 0>
        <#if swagger2>
    @ApiModelProperty(value = "${field.comment}")
        <#else>
    /**
     * ${field.comment}
     */
        </#if>
    </#if>
    <#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 (versionFieldName!"") == field.name>
    @Version
    </#if>
    <#-- 逻辑删除注解 -->
    <#if (logicDeleteFieldName!"") == field.name>
    @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
    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 field>
        <#if field_index==0>
            "${field.propertyName}=" + ${field.propertyName} +
        <#else>
            ", ${field.propertyName}=" + ${field.propertyName} +
        </#if>
    </#list>
        "}";
    }
</#if>
}
添加DTO类
JAVA 复制代码
package ${cfg.dtoPkg};

import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BaseAddDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * ${table.comment!} addDTO
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */
 
@ApiModel(value="${entity}新增对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}AddDTO extends BaseAddDTO {

    private static final long serialVersionUID = 1L;

<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>
    @ApiModelProperty(value = "${field.comment!}")
    private ${field.propertyType} ${field.propertyName};
</#list>

}
分页查询DTO
java 复制代码
package ${cfg.dtoPkg};

import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BasePageSearchDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * ${table.comment!} pageSearchDTO
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */
 
@ApiModel(value="${entity}分页查询对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}PageSearchDTO extends BasePageSearchDTO {

    private static final long serialVersionUID = 1L;

<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>
    @ApiModelProperty(value = "${field.comment!}")
    private ${field.propertyType} ${field.propertyName};
</#list>

}
基础查询DTO
JAVA 复制代码
package ${cfg.dtoPkg};

import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BaseSearchDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * ${table.comment!} searchDTO
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */

@ApiModel(value="${entity}查询对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}SearchDTO extends BaseSearchDTO {

    private static final long serialVersionUID = 1L;

<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>
    @ApiModelProperty(value = "${field.comment!}")
    private ${field.propertyType} ${field.propertyName};
</#list>

}
修改DTO
JAVA 复制代码
package ${cfg.dtoPkg};

import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BaseUpdateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * ${table.comment!} updateDTO
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */
 
@ApiModel(value="${entity}修改对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}UpdateDTO extends BaseUpdateDTO {

    private static final long serialVersionUID = 1L;

<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>
    @ApiModelProperty(value = "${field.comment!}")
    private ${field.propertyType} ${field.propertyName};
</#list>

}
视图VO
JAVA 复制代码
package ${cfg.voPkg};

<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.vo.BaseVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * ${table.comment!} VO
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */

@ApiModel(value="${entity}视图对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}VO extends BaseVO {

    private static final long serialVersionUID = 1L;

<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>
    @ApiModelProperty(value = "${field.comment!}")
    private ${field.propertyType} ${field.propertyName};
</#list>

}

2、controller

java 复制代码
package ${package.Controller};


import ${cfg.voPkg}.${entity}VO;
import ${cfg.dtoPkg}.${entity}AddDTO;
import ${cfg.dtoPkg}.${entity}UpdateDTO;
import ${cfg.dtoPkg}.${entity}SearchDTO;
import ${cfg.dtoPkg}.${entity}PageSearchDTO;
import ${package.Service}.${table.serviceName};
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloud.cloud.common.core.util.R;
import com.cloud.cloud.common.log.annotation.SysLog;
<#if cfg.biz>

</#if>
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;
import lombok.AllArgsConstructor;

<#if cfg.biz>
import javax.servlet.http.HttpServletResponse;
</#if>
import javax.validation.constraints.NotNull;
<#if cfg.biz>
import java.io.IOException;
</#if>
import java.util.List;

/**
 * <p>
 * TODO
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */

@AllArgsConstructor
@Api(value = "${table.comment!}", tags = "${cfg.bizDesc}管理")
@RestController
@RequestMapping("/${table.entityPath}")
public class ${table.controllerName} {

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

<#if cfg.biz>
</#if>
    @SysLog("新增单条${cfg.bizDesc}")
    @ApiOperation("新增单条${cfg.bizDesc}")
    @PostMapping("/${cfg.bizUrl}/one")
    public R<${entity}VO> add(@RequestBody ${entity}AddDTO addDto){
        return R.ok(${table.entityPath}Service.addOne(addDto));
    }

    @SysLog("删除单条${cfg.bizDesc}")
    @ApiOperation("id删除单条${cfg.bizDesc}")
    @DeleteMapping("/${cfg.bizUrl}/one/{id}")
    public R<Boolean> delete${table.entityName}(@NotNull @PathVariable("id") Long id){
        return R.ok(${table.entityPath}Service.deleteOne(id));
    }

    @ApiOperation("ids批量删除多条${cfg.bizDesc}")
    @DeleteMapping("/${cfg.bizUrl}/list/{ids}")
    public R<Boolean> delete${table.entityName}Batch(@NotNull @PathVariable("ids") String ids){
        return R.ok(${table.entityPath}Service.deleteBatch(ids));
    }

    @ApiOperation("id修改单条${cfg.bizDesc}")
	@PostMapping("/${cfg.bizUrl}/update")
    public R<${entity}VO> update(@RequestBody ${entity}UpdateDTO updateDto) {
        return R.ok(${table.entityPath}Service.updateOne(updateDto));
    }

	@ApiOperation("id获取单条${cfg.bizDesc}")
	@GetMapping("/${cfg.bizUrl}/one/{id}")
    public R<${entity}VO> get${table.entityName}(@NotNull @PathVariable("id") Long id ) {
        return R.ok(${table.entityPath}Service.getOne(id));
    }

	@ApiOperation("dto条件查询获取${cfg.bizDesc}List")
	@GetMapping("/${cfg.bizUrl}/list")
    public R<List<${entity}VO>> get(${entity}SearchDTO searchDto) {
        return R.ok(${table.entityPath}Service.getList(searchDto));
    }

	@ApiOperation("dto条件查询获取${cfg.bizDesc}Page")
	@GetMapping("/${cfg.bizUrl}/page")
    public R<Page<${entity}VO>> get(${entity}PageSearchDTO pageSearchDto) {
        return R.ok(${table.entityPath}Service.getPage(pageSearchDto));
    }
<#if cfg.conf>
    @PutMapping("/${cfg.bizUrl}/disable/{id}")
    @ApiOperation("id禁用${cfg.bizDesc}")
    public R<${entity}VO> disable(@NotNull @PathVariable("id") Long id) {
        return R.ok(${table.entityPath}Service.disable(id));
    }

    @PutMapping("/${cfg.bizUrl}/enable/{id}")
    @ApiOperation("id启用${cfg.bizDesc}")
    public R<${entity}VO> enable(@NotNull @PathVariable("id") Long id) {
        return R.ok(${table.entityPath}Service.enable(id));
    }
</#if>
<#if cfg.biz>
</#if>

}

2、service接口

java 复制代码
package ${package.Service};

import com.js.core.service.BaseService;
import ${package.Entity}.${entity};
import ${cfg.voPkg}.${entity}VO;
import ${cfg.dtoPkg}.${entity}AddDTO;
import ${cfg.dtoPkg}.${entity}UpdateDTO;
import ${cfg.dtoPkg}.${entity}SearchDTO;
import ${cfg.dtoPkg}.${entity}PageSearchDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;

/**
 * <p>
 * ${table.comment!} 服务类
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */
 
<#if kotlin>
interface ${table.serviceName} : ${superServiceClass}<${entity}>
<#else>
public interface ${table.serviceName} extends BaseService<${entity}> {

	/**
    * 添加单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param addDto 添加实体参数
    * @return ${entity}VO
    */
	${entity}VO addOne(${entity}AddDTO addDto);
	
	/**
    * id删除单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return Boolean
    */
	Boolean deleteOne(Long id);

    /**
    * ids删除多条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param ids 主键id字符长串,逗号分隔
    * @return Boolean
    */
    Boolean deleteBatch(String ids);
	
	/**
    * id修改单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param updateDto 修改实体参数
    * @return ${entity}VO
    */
	${entity}VO updateOne(${entity}UpdateDTO updateDto);
	
	/**
    * id查询单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return ${entity}VO
    */
	${entity}VO getOne(Long id);
	
	/**
    * dto条件查询获取${cfg.bizDesc}List
    *
    * @author Jshuai
    * @date ${date}
    * @param searchDto 查询实体参数
    * @return List<${entity}VO>
    */
	List<${entity}VO> getList(${entity}SearchDTO searchDto);
	
	/**
    * dto条件查询获取${cfg.bizDesc}Page
    *
    * @author Jshuai
    * @date ${date}
    * @param pageSearchDto 分页查询实体参数
    * @return Page<${entity}VO>
    */
	Page<${entity}VO> getPage(${entity}PageSearchDTO pageSearchDto);

<#if cfg.conf>
    /**
    * id禁用${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return Page<${entity}VO>
        */
    ${entity}VO disable(Long id);

    /**
    * id启用${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return Page<${entity}VO>
        */
    ${entity}VO enable(Long id);
</#if>

<#if cfg.biz>
</#if>
	
}
</#if>

3、service实现类

java 复制代码
package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${cfg.voPkg}.${entity}VO;
import ${cfg.dtoPkg}.${entity}AddDTO;
import ${cfg.dtoPkg}.${entity}UpdateDTO;
import ${cfg.dtoPkg}.${entity}SearchDTO;
import ${cfg.dtoPkg}.${entity}PageSearchDTO;
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.js.core.domain.entity.BaseEntity;
import com.js.core.domain.entity.BaseBiz;
import com.js.core.service.impl.BaseServiceImpl;
import com.js.core.toolkit.StringTools;
import com.js.core.toolkit.StringPool;
import com.js.core.toolkit.Assert;
import com.js.core.toolkit.Mapper;
import com.js.archive.util.ThreadLocalUtil;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * ${table.comment!} 服务实现类
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */

@Service
<#if kotlin>
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} {

}
<#else>
public class ${table.serviceImplName} extends BaseServiceImpl<${table.mapperName}, ${entity}> implements ${table.serviceName} {

	/**
    * 添加单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param addDto 添加实体参数
    * @return ${entity}VO
    */
	@Override
	public ${entity}VO addOne(${entity}AddDTO addDto){
		${entity} entity = Mapper.map(addDto, ${entity}.class);
		entity.setArchiveCompanyId(ThreadLocalUtil.getArchiveCompanyId());
		save(entity);
		return Mapper.map(entity, ${entity}VO.class);
	}

	/**
    * id删除单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return Boolean
    */
	@Override
	public Boolean deleteOne(Long id){
		return removeById(id);
	}

    /**
    * ids删除多条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param ids 主键id字符长串,逗号分隔
    * @return Boolean
    */
    @Override
    public Boolean deleteBatch(String ids){
        Assert.notEmpty(ids, "ids参数不能为空!");
        List<Long> idList = Arrays.stream(ids.split(StringPool.COMMA))
                .mapToLong(Long::parseLong)
                .boxed()
                .collect(Collectors.toList());
        return removeByIds(idList);
    }

	/**
    * id修改单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param updateDto 修改实体参数
    * @return ${entity}VO
    */
	@Override
	public ${entity}VO updateOne(${entity}UpdateDTO updateDto){
		${entity} entity = Mapper.map(updateDto, ${entity}.class);
		updateById(entity);
		return Mapper.map(entity, ${entity}VO.class);
	}

	/**
    * id查询单条${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return ${entity}VO
    */
	@Override
	public ${entity}VO getOne(Long id){
		return Mapper.map(getById(id), ${entity}VO.class);
	}

	/**
    * dto条件查询获取${cfg.bizDesc}List
    *
    * @author Jshuai
    * @date ${date}
    * @param searchDto 查询实体参数
    * @return List<${entity}VO>
    */
	@Override
	public List<${entity}VO> getList(${entity}SearchDTO searchDto){
        return Mapper.map(getLambdaWrapper(searchDto, ThreadLocalUtil.getArchiveCompanyId())
                .list(), ${entity}VO.class);
	}

	/**
    * dto条件查询获取${cfg.bizDesc}Page
    *
    * @author Jshuai
    * @date ${date}
    * @param pageSearchDto 分页查询实体参数
    * @return Page<${entity}VO>
    */
	@Override
	public Page<${entity}VO> getPage(${entity}PageSearchDTO pageSearchDto){
        return Mapper.map(getLambdaWrapper(pageSearchDto, ThreadLocalUtil.getArchiveCompanyId())
                .page(new Page<>(pageSearchDto.getCurrent(), pageSearchDto.getSize())), ${entity}VO.class);
	}
<#if cfg.conf>
    /**
    * id禁用${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return Page<${entity}VO>
        */
    @Override
    public ${entity}VO disable(Long id){
        lambdaUpdate().eq(BaseEntity::getId, id)
                    .set(BaseConfig::getEnabled, false)
                    .update();
        return Mapper.map(getById(id), ${entity}VO.class);
    }

    /**
    * id启用${cfg.bizDesc}
    *
    * @author Jshuai
    * @date ${date}
    * @param id 主键id
    * @return Page<${entity}VO>
        */
    @Override
    public ${entity}VO enable(Long id){
        lambdaUpdate().eq(BaseEntity::getId, id)
                    .set(BaseConfig::getEnabled, true)
                    .update();
        return Mapper.map(getById(id), ${entity}VO.class);
    }
</#if>

<#if cfg.biz>
</#if>
}
</#if>

4、Mapper接口

java 复制代码
package ${package.Mapper};

import com.js.core.mapper.IBaseMapper;
import ${package.Entity}.${entity};
import org.apache.ibatis.annotations.Mapper;

/**
 * <p>
 * ${table.comment!} Mapper 接口
 * </p>
 *
 * @author ${author}
 * @date ${date}
 * @since JDK 1.8
 */

<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
@Mapper
public interface ${table.mapperName} extends IBaseMapper<${entity}> {

}
</#if>

5、Mapper的xml文件

java 复制代码
<?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 enableCache>
    <!-- 开启二级缓存 -->
    <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>

</#if>
<#if baseResultMap>
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" 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>
        ${field.columnName},
</#list>
        ${table.fieldNames}
    </sql>

</#if>
</mapper>
相关推荐
一只程序烽.14 分钟前
err: Error: Request failed with status code 400
java·axios·web
27669582921 小时前
海关 瑞数 后缀分析 rs
java·python·rs·瑞数·海关·瑞数后缀·后缀生成
小臭希1 小时前
Java——琐碎知识点一
java·开发语言
淋一遍下雨天2 小时前
Spark Streaming核心编程总结(四)
java·开发语言·数据库
琢磨先生David2 小时前
重构数字信任基石:Java 24 网络安全特性的全维度革新与未来防御体系构建
java·web安全·密码学
程序修理员3 小时前
技能点总结
java
Jennifer33K3 小时前
报错_NoSuchMethodException: cn.mvc.entity.User.<init>()
java
爱吃烤鸡翅的酸菜鱼3 小时前
【SpringMVC】概念引入与连接
java·开发语言·mysql