基于mybatis-plus自动生成代码完善

mybatis-plus自动生成代码


基于mybatis-plus改造完善出来的代码生成工具

项目依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.wmang.generator</groupId>
        <artifactId>generator-parent</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>generator-gencode</artifactId>
    <version>1.1.0</version>

    <dependencies>

        <dependency>
            <groupId>com.wmang.gen</groupId>
            <artifactId>gen-common</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!-- 字符串操作工具类-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- mariadb驱动 -->
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!-- mybatis-plus代码生成 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!-- mybatis-plus代码生成模板 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.29</version>
        </dependency>

        <!-- 自动生成代码,减少代码量 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- 主要用于运行日志 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>

        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.1.7</version>
        </dependency>
        <!-- 主要用于运行日志 -->


    </dependencies>


    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

生成代码逻辑处理

package com.wmang.generator.code;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
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.wmang.generator.convert.CustMysqlTypeConvert;
import com.wmang.generator.dto.GenCodeGeneratorDto;
import com.wmang.gen.common.base.BaseEntity;
import org.apache.commons.lang3.StringUtils;

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

public class GenCodeGenerator {

    private static final String SRCJAVA_URL = File.separator + "src" + File.separator + "main" + File.separator + "java";
    private static final String RESOURCE_URL = File.separator + "src" + File.separator + "main" + File.separator + "resources";


    public void build(GenCodeGeneratorDto genCodeGeneratorDto) {

        // 代码生成器
        AutoGenerator autoGenerator = new AutoGenerator();

        // 包配置
        PackageConfig packageConfig = initPackageConfig(genCodeGeneratorDto);
        // 自定义配置
        InjectionConfig injectionConfig = initInjectionConfig(genCodeGeneratorDto);
        // 自定义模板配置
        List<FileOutConfig> focList = loadFileOutConfig(RESOURCE_URL, SRCJAVA_URL, genCodeGeneratorDto, packageConfig);
        injectionConfig.setFileOutConfigList(focList);
        // 全局配置
        GlobalConfig globalConfig = initGlobalConfig(genCodeGeneratorDto);
        // 策略配置
        StrategyConfig strategyConfig = initStrategyConfig(genCodeGeneratorDto);
        // 数据源配置
        DataSourceConfig dataSourceConfig = initDataSourceConfig(genCodeGeneratorDto);
        // 模板配置
        TemplateConfig templateConfig = initTemplateConfig(genCodeGeneratorDto);

        autoGenerator.setCfg(injectionConfig);
        autoGenerator.setGlobalConfig(globalConfig);    
        autoGenerator.setPackageInfo(packageConfig);
        autoGenerator.setDataSource(dataSourceConfig);
        autoGenerator.setStrategy(strategyConfig);
        autoGenerator.setTemplate(templateConfig);
        autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
        autoGenerator.execute();

    }

    /**
     * 初始化模板配置
     *
     * @param genCodeGeneratorDto
     */
    private TemplateConfig initTemplateConfig(GenCodeGeneratorDto genCodeGeneratorDto) {
        TemplateConfig templateConfig = new TemplateConfig();
        // 配置Controller模板
        templateConfig.setController("/tmpl/controller.java");
        templateConfig.setXml(null);
        return templateConfig;
    }

    /**
     * 初始化包配置
     *
     * @param genCodeGeneratorDto
     */
    private PackageConfig initPackageConfig(GenCodeGeneratorDto genCodeGeneratorDto) {
        PackageConfig packageConfig = new PackageConfig();
        // 包路径
        packageConfig.setParent(genCodeGeneratorDto.getBasePackage());
        // entity路径
        packageConfig.setEntity("domain.entity");
        return packageConfig;
    }

    /**
     * 初始化数据源配置
     *
     * @param genCodeGeneratorDto
     */
    private DataSourceConfig initDataSourceConfig(GenCodeGeneratorDto genCodeGeneratorDto) {
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(genCodeGeneratorDto.getJdbcUrl());
        dataSourceConfig.setDriverName(genCodeGeneratorDto.getJdbcDriverName());
        dataSourceConfig.setUsername(genCodeGeneratorDto.getJdbcUserName());
        dataSourceConfig.setPassword(genCodeGeneratorDto.getJdbcPassWord());
        dataSourceConfig.setTypeConvert(new CustMysqlTypeConvert());
        return dataSourceConfig;
    }

    /**
     * 初始化全局配置
     *
     * @param genCodeGeneratorDto
     */
    private GlobalConfig initGlobalConfig(GenCodeGeneratorDto genCodeGeneratorDto) {
        GlobalConfig globalConfig = new GlobalConfig();
        // 是否覆盖源文件
        globalConfig.setFileOverride(genCodeGeneratorDto.getFileOverride());
        // 文件输出路径
        globalConfig.setOutputDir(genCodeGeneratorDto.getBasePath() + SRCJAVA_URL);
        // 作者
        globalConfig.setAuthor(genCodeGeneratorDto.getAuthor());
        // xml生成columList
        globalConfig.setBaseColumnList(true);
        // xml生成baseResultMap
        globalConfig.setBaseResultMap(true);
        // xml是否启用缓存
        globalConfig.setEnableCache(false);

        globalConfig.setOpen(false);
        // 开启Swagger2
        globalConfig.setSwagger2(true);
        // 主键类型自增
        globalConfig.setIdType(IdType.AUTO);
        return globalConfig;
    }

    /**
     * 初始化策略配置
     *
     * @param genCodeGeneratorDto
     */
    private StrategyConfig initStrategyConfig(GenCodeGeneratorDto genCodeGeneratorDto) {
        StrategyConfig strategyConfig = new StrategyConfig();
        // 文件名-驼峰
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        // 字段名-驼峰
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否rest风格.默认rest
        strategyConfig.setRestControllerStyle(true);
        // 是否生成实体 常量 字段名
        strategyConfig.setEntityColumnConstant(true);
        // entity生成lombok模式
        strategyConfig.setEntityLombokModel(true);
        // entity生成注释
        strategyConfig.setEntityTableFieldAnnotationEnable(true);
        // entity继承父类 子类将不再生成id字段
        strategyConfig.setSuperEntityClass(BaseEntity.class);
        // 生成序列化id
        strategyConfig.setEntitySerialVersionUID(false);
        if (StringUtils.isNotBlank(genCodeGeneratorDto.getTablePrefix())) {
            // 过滤表前缀
            strategyConfig.setTablePrefix(genCodeGeneratorDto.getTablePrefix() + "_");
        }
        // 生成表
        strategyConfig.setInclude(genCodeGeneratorDto.getTables().split(","));
        // 不生成的公共字段,在父类已定义
        strategyConfig.setSuperEntityColumns("id", "delete_flag", "lock_version", "created_by", "created_at", "updated_by", "updated_at");
        return strategyConfig;
    }

    /**
     * 自定义配置
     *
     * @param genCodeGeneratorDto
     * @return
     */
    private InjectionConfig initInjectionConfig(GenCodeGeneratorDto genCodeGeneratorDto) {
        InjectionConfig injectionConfig = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
                Map<String, Object> map = new HashMap<>();
                map.put("superDtoClass", "BaseDto");
                map.put("superDtoClassPkg", "com.wmang.gen.common.base.BaseDto");
                map.put("dtoClassPkg", genCodeGeneratorDto.getBasePackage() + ".domain.dto");
                map.put("superParamClass", "BaseParam");
                map.put("superParamClassPkg", "com.wmang.gen.common.base.BaseParam");
                map.put("paramClassPkg", genCodeGeneratorDto.getBasePackage() + ".domain.param");
                super.setMap(map);
            }
        };
        return injectionConfig;
    }

    /**
     * 自定义魔板输出配置
     *
     * @param resourcePath
     * @param genCodeGeneratorDto
     * @return
     */
    private List<FileOutConfig> loadFileOutConfig(String resourcePath, String srcJavaPath, GenCodeGeneratorDto genCodeGeneratorDto, PackageConfig packageConfig) {

        /**
         *  自定义mapper xml文件模板生成
         */
        String mapperTemplatePath = "/templates/mapper.xml.ftl";
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(mapperTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return genCodeGeneratorDto.getBasePath() + File.separator + resourcePath + File.separator + "mapper" + File.separator + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        /**
         *  自定义entity文件模板生成
         */
        String entityTemplatePath = "/templates/entity.java.ftl";
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(entityTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                String fileName = tableInfo.getEntityName() + StringPool.DOT_JAVA;
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return genCodeGeneratorDto.getBasePath() + File.separator + srcJavaPath + File.separator + genCodeGeneratorDto.getBasePackagePath() + File.separator + "domain" + File.separator + "entity" + File.separator + fileName;
            }
        });


        /**
         *  dto模板生成
         */
        String dtoTemplatePath = "/tmpl/dto.java.ftl";
        focList.add(new FileOutConfig(dtoTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                String fileName = tableInfo.getEntityName() + "Dto" + StringPool.DOT_JAVA;
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 dto 的名称会跟着发生变化!!
                return genCodeGeneratorDto.getBasePath() + File.separator + srcJavaPath + File.separator + genCodeGeneratorDto.getBasePackagePath() + File.separator + "domain" + File.separator + "dto" + File.separator + fileName;
            }
        });


        /**
         *  param模板生成
         */
        String paramTemplatePath = "/tmpl/param.java.ftl";
        focList.add(new FileOutConfig(paramTemplatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                String fileName = tableInfo.getEntityName() + "Param" + StringPool.DOT_JAVA;
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 param 的名称会跟着发生变化!!
                return genCodeGeneratorDto.getBasePath() + File.separator + srcJavaPath + File.separator + genCodeGeneratorDto.getBasePackagePath() + File.separator + "domain" + File.separator + "param" + File.separator + fileName;
            }
        });
        return focList;
    }
}

类型转换器

package com.wmang.generator.convert;

import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.ITypeConvert;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
/**
 * @author: wmang
 * @date: 2019/12/27 16:59
 * @description:  int(11) unsigned
 */
public class CustMysqlTypeConvert implements ITypeConvert {
    public CustMysqlTypeConvert() {
    }

    @Override
    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
        String t = fieldType.toLowerCase();
        if (t.contains("char")) {
            return DbColumnType.STRING;
        } else if (t.contains("bigint")) {
            return DbColumnType.LONG;
        } else if (t.contains("tinyint(1)")) {
            return DbColumnType.BOOLEAN;
        } else if (t.contains("int")) {
            if(t.indexOf("int")==0 && (t.indexOf("unsigned")+"unsigned".length()) == t.length()){
                return DbColumnType.LONG;
            }else{
                return DbColumnType.INTEGER;
            }
        } else if (t.contains("text")) {
            return DbColumnType.STRING;
        } else if (t.contains("bit")) {
            return DbColumnType.BOOLEAN;
        } else if (t.contains("decimal")) {
            return DbColumnType.BIG_DECIMAL;
        } else if (t.contains("clob")) {
            return DbColumnType.CLOB;
        } else if (t.contains("blob")) {
            return DbColumnType.BLOB;
        } else if (t.contains("binary")) {
            return DbColumnType.BYTE_ARRAY;
        } else if (t.contains("float")) {
            return DbColumnType.FLOAT;
        } else if (t.contains("double")) {
            return DbColumnType.DOUBLE;
        } else if (!t.contains("json") && !t.contains("enum")) {
            if (t.contains("date") || t.contains("time") || t.contains("year")) {
                byte var5;
                switch(globalConfig.getDateType()) {
                    case ONLY_DATE:
                        return DbColumnType.DATE;
                    case SQL_PACK:
                        var5 = -1;
                        switch(t.hashCode()) {
                            case 3076014:
                                if (t.equals("date")) {
                                    var5 = 0;
                                }
                                break;
                            case 3560141:
                                if (t.equals("time")) {
                                    var5 = 1;
                                }
                                break;
                            case 3704893:
                                if (t.equals("year")) {
                                    var5 = 2;
                                }
                        }

                        switch(var5) {
                            case 0:
                                return DbColumnType.DATE_SQL;
                            case 1:
                                return DbColumnType.TIME;
                            case 2:
                                return DbColumnType.DATE_SQL;
                            default:
                                return DbColumnType.TIMESTAMP;
                        }
                    case TIME_PACK:
                        var5 = -1;
                        switch(t.hashCode()) {
                            case 3076014:
                                if (t.equals("date")) {
                                    var5 = 0;
                                }
                                break;
                            case 3560141:
                                if (t.equals("time")) {
                                    var5 = 1;
                                }
                                break;
                            case 3704893:
                                if (t.equals("year")) {
                                    var5 = 2;
                                }
                        }

                        switch(var5) {
                            case 0:
                                return DbColumnType.LOCAL_DATE;
                            case 1:
                                return DbColumnType.LOCAL_TIME;
                            case 2:
                                return DbColumnType.YEAR;
                            default:
                                return DbColumnType.LOCAL_DATE_TIME;
                        }
                }
            }

            return DbColumnType.STRING;
        } else {
            return DbColumnType.STRING;
        }
    }
}

pojo对象

package com.wmang.generator.dto;

import lombok.Data;

@Data
public class GenCodeGeneratorDto {

    /**
     * 覆盖原文件
     */
    private Boolean fileOverride = false;

    /**
     * 项目绝对路径
     */
    private String basePath;

    /**
     * 包路径
     */
    private String basePackage;

    /**
     * 包文件路径
     */
    private String basePackagePath;

    /**
     * 过滤表前缀
     */
    private String tablePrefix;

    /**
     * 需要生成的表,用英文符号,隔开
     */
    private String tables;

    /**
     * 作者
     */
    private String author;

    /**
     * jdbc url
     */
    private String jdbcUrl;

    /**
     * jdbc driver
     */
    private String jdbcDriverName;

    /**
     * jdbc username
     */
    private String jdbcUserName;

    /**
     * jdbc password
     */
    private String jdbcPassWord;
}

工具类

package com.wmang.generator.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Set;

/**
 * @author: wmang
 * @date: 2019/12/18 16:59
 * @description:
 */
public class PropertiesUtils {
    /**
     * 单独抽取的方法,用户检测能否正确操纵Properties
     *
     * @throws IOException 为了排版美观,直接抛出异常
     */
    public void printKeyValue() {
        Properties properties = loadProperties();
        Set<Object> keys = properties.keySet();
        for (Object key : keys) {
            System.out.println(key + " = " + properties.get(key));
        }
    }

    /**
     * 获取属性
     *
     * @param key
     * @return
     */
    public String getValue(String key) {
        Properties properties = loadProperties();
        return properties.getProperty(key);
    }

    public Properties loadProperties() {
        Properties properties = new Properties();
        try {
            InputStream inputStream = this.getPropertiesFromClassLoader();
            properties.load(inputStream);
        } catch (IOException e) {
            System.out.println("属性读取失败");
            e.printStackTrace();
        }
        return properties;
    }


    /***
     * 从当前的类加载器的getResourcesAsStream来获取.
     * 使用Class.class.getClassLoader().getResourcesAsStream()进行获取的时候,所填写的路径只能为项目的绝对路径
     * @throws IOException
     */
    public InputStream getPropertiesFromResourceAsStream() throws IOException {
        InputStream resourceAsStream = PropertiesUtils.class.getClassLoader().getResourceAsStream("generator.properties");
        return resourceAsStream;
    }

    /***
     * 从文件中获取,使用InputStream字节
     * 主要是需要加上src这个文件夹名。。。路径配置需要精确到绝对地址级别
     * 什么意思,就是如果这个mylog4j文件在com/dimple/getproperityfile/mylog4j.properties下,而这个com文件夹
     * 又在src目录下,那么写的时候需要加上这个src,这样的相对路径+项目地址能够构成一个完整的访问地址即可
     * @throws IOException
     */
    public InputStream getPropertiesFromFile() throws IOException {
        InputStream inputStream = new FileInputStream(new File("generator.properties"));
        return inputStream;
    }

    /**
     * 使用Class类的getSystemResourceAsStream方法
     * 和使用当前类的ClassLoader是一样的
     *
     * @throws IOException
     */
    public InputStream getPropertiesFromClassLoader() throws IOException {
        InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream("generator.properties");
        return systemResourceAsStream;
    }
}

yml生成工具类

package com.wmang.generator.util;

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.util.Properties;

public class YamlConfigurerUtils {

    public YamlConfigurerUtils(String ymlFile) {
        //1:加载配置文件
        Resource app = new ClassPathResource(ymlFile);
        YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
        // 2:将加载的配置文件交给 YamlPropertiesFactoryBean
        yamlPropertiesFactoryBean.setResources(app);
        // 3:将yml转换成 key:val
        Properties properties = yamlPropertiesFactoryBean.getObject();
        // 4: 将Properties 通过构造方法交给我们写的工具类
        this.setYmlProperties(properties);
    }

    private Properties ymlProperties = new Properties();

    private void setYmlProperties(Properties properties) {
        ymlProperties = properties;
    }

    public String getStrYmlVal(String key) {
        return ymlProperties.getProperty(key);
    }

    public Integer getIntegerYmlVal(String key) {
        return Integer.valueOf(ymlProperties.getProperty(key));
    }
}

自定义模板-controller

package ${package.Controller};

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;
import ${package.Entity}.${entity};
import ${cfg.dtoClassPkg}.${entity}Dto;
import ${cfg.paramClassPkg}.${entity}Param;
import ${package.Service}.${table.serviceName};
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;

<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>

/**
 * ${table.comment!} 前端控制器
 *
 * @author ${author}
 * @since ${date}
 */
<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@RequestMapping("/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}s</#if>")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if>

    @Autowired
    private ${table.serviceName} service;

    /**
     * 基础方法-分页方法,带请求对象
     *
     * @return 查询分页对象
     */
    @GetMapping("/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>/page")
    public Page<${entity}Dto> listByPages(@SpringQueryMap ${entity}Param param) {
        Page<${entity}> page = param.getPage();
        QueryWrapper<${entity}> wrapper = new QueryWrapper();
        /** TODO:此处填写条件查询拼接 wrapper对象 */

        Page<${entity}> pages = service.page(page, wrapper);
        Page<${entity}Dto> dtoPages = new Page<>();
        BeanUtils.copyProperties(pages, dtoPages);
        List<${entity}Dto> dtos = new ArrayList<>();
        pages.getRecords().forEach((item) -> {
            ${entity}Dto dto = new ${entity}Dto();
            BeanUtils.copyProperties(item, dto);
            dtos.add(dto);
        });
        dtoPages.setRecords(dtos);
        return dtoPages;
    }

    /**
     * 基础方法-不带分页方法,带请求对象
     *
     * @return 查询分页对象
     */
    @GetMapping
    public List<${entity}Dto> listDatas(@SpringQueryMap ${entity}Param query) {
        QueryWrapper<${entity}> wrapper = new QueryWrapper();
        /** TODO:此处填写条件查询拼接 wrapper对象 */

        List<${entity}> entityList = service.list(wrapper);
        List<${entity}Dto> dtos = new ArrayList<>();
        entityList.forEach((item) -> {
            ${entity}Dto dto = new ${entity}Dto();
            BeanUtils.copyProperties(item, dto);
            dtos.add(dto);
        });
        return dtos;
    }

    /**
     * 基础方法-根据主键id查询对象
     *
     * @param id
     * @return 查询对象
     */
    @GetMapping("/{id}")
    public ${entity}Dto selectById(@PathVariable("id") Long id) {
        ${entity}Dto dto = new ${entity}Dto();
        ${entity} entity = service.getById(id);
        BeanUtils.copyProperties(entity, dto);
        return dto;
    }

    /**
     * 基础方法-新增对象方法
     *
     * @param dto
     * @return 是否成功
     */
    @PostMapping
    public boolean save(@RequestBody ${entity}Dto dto) {
        ${entity} entity = new ${entity}();
        BeanUtils.copyProperties(dto, entity);
        return service.save(entity);
    }

    /**
     * 基础方法-修改对象方法,根据id覆盖更新
     *
     * @param dto
     * @return 是否成功
     */
    @PutMapping
    public boolean update(@RequestBody ${entity}Dto dto) {
        ${entity} entity = new ${entity}();
        BeanUtils.copyProperties(dto, entity);
        return service.updateById(entity);
    }

    /**
     * 基础方法-修改对象方法,根据id更新对象中非空字段
     *
     * @param dto
     * @return 是否成功
     */
    @PatchMapping
    public boolean updateByParam(@RequestBody ${entity}Dto dto) {
        ${entity} entity = new ${entity}();
        BeanUtils.copyProperties(dto, entity);
        return service.updateById(entity);
    }

    /**
     * 基础方法-根据id删除对象方法
     *
     * @param id 主键id
     * @return 是否成功
     */
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable("id") Long id) {
        return service.removeById(id);
    }
}
</#if>

自定义模板-dto

package ${cfg.dtoClassPkg};

<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
</#if>
<#if cfg.superDtoClass??>
import ${cfg.superDtoClassPkg};
</#if>

/**
 * ${table.comment!} DTO对象
 *
 * @author ${author}
 * @since ${date}
 */
<#if entityLombokModel>
@Data
    <#if cfg.superDtoClass??>
@EqualsAndHashCode(callSuper = true)
    <#else>
@EqualsAndHashCode(callSuper = false)
    </#if>
@Accessors(chain = true)
</#if>
<#if swagger2>
@ApiModel(value = "${entity}Dto对象", description = "${table.comment!}")
</#if>
@JsonIgnoreProperties(ignoreUnknown=true)
<#if cfg.superDtoClass??>
public class ${entity}Dto extends ${cfg.superDtoClass}  {
<#else>
public class ${entity}Dto implements Serializable {
</#if>
<#if entitySerialVersionUID>

    private static final long serialVersionUID = 1L;
</#if>
<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
    <#if field.comment!?length gt 0>
        <#if swagger2>

    @ApiModelProperty(value = "${field.comment}")
        <#else>
    /**
     * ${field.comment}
     */
        </#if>
    </#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 entityBuilderModel>
    public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
    <#else>
    public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
    </#if>
        this.${field.propertyName} = ${field.propertyName};
        <#if entityBuilderModel>
        return this;
        </#if>
    }
    </#list>
</#if>
<#if activeRecord>

    @Override
    protected Serializable pkVal() {
    <#if keyPropertyName??>
        return this.${keyPropertyName};
    <#else>
        return null;
    </#if>
    }
</#if>
<#if !entityLombokModel>

    @Override
    public String toString() {
        return "${entity}DTO{" +
    <#list table.fields as field>
        <#if field_index==0>
            "${field.propertyName}=" + ${field.propertyName} +
        <#else>
            ", ${field.propertyName}=" + ${field.propertyName} +
        </#if>
    </#list>
        "}";
    }
</#if>
}

自定义模板feign

package ${cfg.feignClassPkg};

import com.baomidou.mybatisplus.core.metadata.IPage;
<#if cfg.superFeignClass??>
import ${cfg.superFeignClassPkg};
</#if>
import ${cfg.dtoClassPkg}.${entity}Dto;
import ${cfg.requestParamClassPkg}.${entity}Param;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;
import ${cfg.superFeignConfigClassPkg};
import java.util.List;


/**
 * ${table.comment!} 对外提供api接口
 *
 * @author ${author}
 * @since ${date}
 */
@FeignClient(name = "${cfg.feignName}", path = "${cfg.feignPath}", configuration = GenFeignConfiguration.class)
@RequestMapping("/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}s</#if>")
<#if kotlin>
class I${entity}FeignApi <#if cfg.superFeignClass??> : ${cfg.superFeignClass}()</#if>
<#else>
<#if cfg.superFeignClass??>
public interface ${entity}FeignApi extends ${cfg.superFeignClass} {
<#else>
public interface ${entity}FeignApi {
</#if>

    /**
     * 基础方法-分页方法,带请求对象
     *
     * @return 查询分页对象
     */
    @GetMapping("/page")
    IPage<${entity}Dto> listByPages(@SpringQueryMap ${entity}Param param);

    /**
    * 基础方法-不带分页方法,带请求对象
    *
    * @return 列表对象
    */
    @GetMapping
    List<${entity}Dto> listDatas(@SpringQueryMap ${entity}Param param);

     /**
     * 基础方法-根据主键id查询对象
     *
     * @param id
     * @return 查询对象
     */
    @GetMapping("/{id}")
    ${entity}Dto selectById(@PathVariable Long id);

    /**
     * 基础方法-新增对象方法
     *
     * @param dto
     * @return 是否成功
     */
    @PostMapping
    boolean save(@RequestBody ${entity}Dto dto);

    /**
     * 基础方法-修改对象方法,根据id覆盖更新
     *
     * @param dto
     * @return 是否成功
     */
    @PutMapping
    boolean update(@RequestBody ${entity}Dto dto);

    /**
     * 基础方法-修改对象方法,根据id更新对象中非空字段
     *
     * @param dto
     * @return 是否成功
     */
    @PatchMapping
    boolean updateByParam(@RequestBody ${entity}Dto dto);

    /**
     * 基础方法-根据id删除对象方法
     *
     * @param id 主键id
     * @return 是否成功
     */
    @DeleteMapping("/{id}")
    boolean delete(@PathVariable Long id);
}
</#if>

自定义模板-参数对象

package ${cfg.paramClassPkg};

<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
</#if>
<#if cfg.superParamClass??>
import ${cfg.superParamClassPkg};
</#if>

/**
 * ${table.comment!} Param 请求传输对象
 *
 * @author ${author}
 * @since ${date}
 */
<#if entityLombokModel>
@Data
<#if cfg.superParamClass??>
@EqualsAndHashCode(callSuper = true)
<#else>
@EqualsAndHashCode(callSuper = false)
</#if>
@Accessors(chain = true)
</#if>
<#if swagger2>
@ApiModel(value = "${entity}Param对象", description = "${table.comment!}")
</#if>
@JsonIgnoreProperties(ignoreUnknown=true)
<#if cfg.superParamClass??>
public class ${entity}Param extends ${cfg.superParamClass}  {
<#else>
public class ${entity}Param implements Serializable {
</#if>
<#if entitySerialVersionUID>

    private static final long serialVersionUID = 1L;
</#if>
<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
<#if field.comment!?length gt 0>
    <#if swagger2>

    @ApiModelProperty(value = "${field.comment}")
    <#else>
    /**
     * ${field.comment}
     */
    </#if>
</#if>
    private ${field.propertyType} ${field.propertyName};
</#list>
<#------------  END 字段循环遍历  ---------->
<#if !entityLombokModel>

    @Override
    public String toString() {
    return "${entity}DTO{" +
    <#list table.fields as field>
        <#if field_index==0>
            "${field.propertyName}=" + ${field.propertyName} +
        <#else>
            ", ${field.propertyName}=" + ${field.propertyName} +
        </#if>
    </#list>
    "}";
    }
</#if>
}

Test生成样例

package gencoder;

import com.wmang.generator.code.GenCodeGenerator;
import com.wmang.generator.dto.GenCodeGeneratorDto;
import lombok.extern.slf4j.Slf4j;

import java.io.File;

/**
 * 代码生成
 */
@Slf4j
public class CarCodeGencoder {

    public static void main(String[] args) {
        // 项目路径
        String basePath = getBasePath();
        // 从local配置文件获取数据库配置
        GenCodeGeneratorDto dto = new GenCodeGeneratorDto();

        // 项目路径
        dto.setBasePath(basePath);
        // 包路径
        dto.setBasePackage("com.wmang.basic");
        // 包文件路径
        dto.setBasePackagePath("com" + File.separator + "wmang" + File.separator + "basic");
        // JDBC配置
        dto.setJdbcDriverName("org.mariadb.jdbc.Driver");
        dto.setJdbcUrl("jdbc:mariadb://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&failOverReadOnly=false");
        dto.setJdbcUserName("root");
        dto.setJdbcPassWord("123");
        // 过滤表前缀
        dto.setTablePrefix("car");
        // 要生成的表  多个表时用","隔开,例: test_table1, test_table2
        dto.setTables("test_table1, test_table2");
        // 作者
        dto.setAuthor("wmang");

        GenCodeGenerator genCodeGenerator = new GenCodeGenerator();
        genCodeGenerator.build(dto);
    }

    /**
     * 获取项目绝对路径
     *
     * @return
     */
    private static String getBasePath() {
        String basePath = System.getProperty("user.dir");
        if (basePath.endsWith("base-dir")) {
            basePath = basePath + File.separator + "base-dir2,";
        } else {
            basePath = basePath + File.separator + "base-dir" + File.separator + "base-dir2";
        }
        log.info("basePath:{}", basePath);
        return basePath;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值