当前位置: 首页 > news >正文

项目代码生成工具

代码生成工具

文章目录

  • 代码生成工具
    • 提取公共类
      • domain
        • bo
        • dto
        • entity
        • vo
        • Bean基类
    • 代码生成工厂
    • 连接配置
    • 模版
      • 1、基础类
        • 基类Entity
        • 添加DTO类
        • 分页查询DTO
        • 基础查询DTO
        • 修改DTO
        • 视图VO
      • 2、controller
      • 2、service接口
      • 3、service实现类
      • 4、Mapper接口
      • 5、Mapper的xml文件

提取公共类

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

在这里插入图片描述

domain

bo
package com.hy.core.domain.bo;import com.hy.core.domain.BaseBean;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础BO* </p>** @author cento* @date 2021/9/1 17:21* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseBO extends BaseBean {}
dto
package com.hy.core.domain.dto;import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础AddDTO* </p>** @author cento* @date 2021/9/1 17:25* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseAddDTO extends BaseDTO{}
package com.hy.core.domain.dto;import com.hy.core.domain.BaseBean;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础DTO* </p>** @author cento* @date 2021/9/1 17:22* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseDTO extends BaseBean {}
package com.hy.core.domain.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础Page* </p>** @author cento* @date 2021/9/1 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;}
package com.hy.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 cento* @date 2021/9/1 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;}
package com.hy.core.domain.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础UpdateDTO* </p>** @author cento* @date 2021/9/1 17:30* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseUpdateDTO extends BaseDTO{@ApiModelProperty(value = "主键id")private Long id;}
entity
package com.hy.core.domain.entity;import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础业务类* </p>** @author cento* @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> {}
package com.hy.core.domain.entity;import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础配置类* </p>** @author cento* @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;}
package com.hy.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 cento* @date 2021/9/1 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
package com.hy.core.domain.vo;import com.hy.core.domain.BaseBean;
import com.hy.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;@Datapublic 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;}
}
package com.hy.core.domain.vo;import com.hy.core.domain.BaseBean;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础VO* </p>** @author cento* @date 2021/9/1 18:18* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseVO extends BaseBean {@ApiModelProperty(value = "数据唯一标识")private Long id;}
package com.hy.core.domain.vo;import com.hy.core.enums.enumable.IEnumHolder;
import com.hy.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 cento* @date 2021/10/22 14:15* @since JDK 1.8*/@Data
public class EnumMapVO  {private Map<String, EnumVO> enumMapVO;@NoArgsConstructor@AllArgsConstructor@Datapublic 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@Datapublic 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;}}
package com.hy.core.domain.vo;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;
import java.util.List;/*** 枚举展示类** @Author: 刘昱* @E-mail: 517581971@qq.com* @Date: 2020年4月30日 下午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基类
package com.hy.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 {}

代码生成工厂

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 cento* @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() {@Overridepublic 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") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/entity/" + tableInfo.getEntityName() + ".java";}});// AddDTO文件输出配置focList.add(new FileOutConfig("/template/entityAddDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "AddDTO.java";}});// UpdateDTO文件输出配置focList.add(new FileOutConfig("/template/entityUpdateDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "UpdateDTO.java";}});// SearchDTO文件输出配置focList.add(new FileOutConfig("/template/entitySearchDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "SearchDTO.java";}});// PageSearchDTO文件输出配置focList.add(new FileOutConfig("/template/entityPageSearchDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "PageSearchDTO.java";}});// VO文件输出配置focList.add(new FileOutConfig("/template/entityVO.java.ftl") {@Overridepublic 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_");}}

连接配置

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
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>@Overrideprotected Serializable pkVal() {<#if keyPropertyName??>return this.${keyPropertyName};<#else>return null;</#if>}</#if>
<#if !entityLombokModel>@Overridepublic 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类
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
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
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
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
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

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接口

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 cento* @date ${date}* @param addDto 添加实体参数* @return ${entity}VO*/${entity}VO addOne(${entity}AddDTO addDto);/*** id删除单条${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Boolean*/Boolean deleteOne(Long id);/*** ids删除多条${cfg.bizDesc}** @author cento* @date ${date}* @param ids 主键id字符长串,逗号分隔* @return Boolean*/Boolean deleteBatch(String ids);/*** id修改单条${cfg.bizDesc}** @author cento* @date ${date}* @param updateDto 修改实体参数* @return ${entity}VO*/${entity}VO updateOne(${entity}UpdateDTO updateDto);/*** id查询单条${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return ${entity}VO*/${entity}VO getOne(Long id);/*** dto条件查询获取${cfg.bizDesc}List** @author cento* @date ${date}* @param searchDto 查询实体参数* @return List<${entity}VO>*/List<${entity}VO> getList(${entity}SearchDTO searchDto);/*** dto条件查询获取${cfg.bizDesc}Page** @author cento* @date ${date}* @param pageSearchDto 分页查询实体参数* @return Page<${entity}VO>*/Page<${entity}VO> getPage(${entity}PageSearchDTO pageSearchDto);<#if cfg.conf>/*** id禁用${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/${entity}VO disable(Long id);/*** id启用${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/${entity}VO enable(Long id);
</#if><#if cfg.biz>
</#if>}
</#if>

3、service实现类

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 cento* @date ${date}* @param addDto 添加实体参数* @return ${entity}VO*/@Overridepublic ${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 cento* @date ${date}* @param id 主键id* @return Boolean*/@Overridepublic Boolean deleteOne(Long id){return removeById(id);}/*** ids删除多条${cfg.bizDesc}** @author cento* @date ${date}* @param ids 主键id字符长串,逗号分隔* @return Boolean*/@Overridepublic 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 cento* @date ${date}* @param updateDto 修改实体参数* @return ${entity}VO*/@Overridepublic ${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 cento* @date ${date}* @param id 主键id* @return ${entity}VO*/@Overridepublic ${entity}VO getOne(Long id){return Mapper.map(getById(id), ${entity}VO.class);}/*** dto条件查询获取${cfg.bizDesc}List** @author cento* @date ${date}* @param searchDto 查询实体参数* @return List<${entity}VO>*/@Overridepublic List<${entity}VO> getList(${entity}SearchDTO searchDto){return Mapper.map(getLambdaWrapper(searchDto, ThreadLocalUtil.getArchiveCompanyId()).list(), ${entity}VO.class);}/*** dto条件查询获取${cfg.bizDesc}Page** @author cento* @date ${date}* @param pageSearchDto 分页查询实体参数* @return Page<${entity}VO>*/@Overridepublic 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 cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/@Overridepublic ${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 cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/@Overridepublic ${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接口

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文件

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

相关文章:

  • 【机器学习-线性回归-4】线性回归中的最优解:从数学原理到实践应用
  • [Lc_week] 447 | 155 | Q1 | hash | pair {}调用
  • 前端性能优化面试回答技巧
  • 解析 OpenHarmony、HarmonyOS 与 HarmonyOS Next:优雅草卓伊凡的观点
  • 三、UI自动化测试03--操作方法API
  • 快速上手 MetaGPT
  • 云计算赋能质检LIMS的价值 质检LIMS系统在云计算企业的创新应用
  • 【计算机网络】网络基础概念
  • 网络安全厂商F5荣登2025 CRN AI 100榜单,释放AI潜力
  • 云计算市场的重新分类研究
  • 衡量矩阵数值稳定性的关键指标:矩阵的条件数
  • 鸿蒙系统应用开发全栈指南
  • openstack迁移虚机rbd报错,删除异常rbd
  • 机器人快速启动
  • Greenbone(绿骨)开源GVM容器docker部署和汉化介绍
  • 【2025 最新前沿 MCP 教程 06】构建你的第一个 MCP 服务器:分步指南(源码讲解)
  • 今日头条安卓版新闻推荐精准度与广告影响测评
  • vue中将html2canvas转成的图片传递给后台 Python Flask 服务
  • qt.qpa.plugin: Could not find the Qt platform plugin “cocoa“ in “ “
  • adb push 报错:CreateProcess failure, error 123
  • 央行回应美债波动:单一市场、单一资产变动对我国外储影响总体有限
  • 上海市市管干部任职前公示:赵亮拟为地区区长人选
  • 天津外国语大学原校长修刚突发疾病去世,享年68岁
  • “梅花奖”快闪走入上海张园,朱洁静在石库门前起舞
  • 从“高阶智驾”到“辅助驾驶”,上海车展上的“智驾”宣发变调
  • 体育公益之约跨越山海,雪域高原果洛孕育足球梦