代码生成工具
文章目录
提取公共类
比方说每个表中都有,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>