使用freemarker生成代码

发布时间 2023-05-22 17:16:13作者: Kang_kin

使用freemarker完成生成代码

流程

启动类配置

package com.kang.studyProjectVue.template;

import com.kang.studyProjectVue.template.coreApproach.TableInfos;
import com.kang.studyProjectVue.template.templateEntity.TemplateData;

/**
 * @author Kang
 * @Describe 启动类
 * @date 2023/5/20 22:23
 */


public class TemplateRun {
    public static void main(String[] args) {
        TemplateData template = TemplateData.builder().name("stu_ab").author("kang").path("com/kang/study/moudles").module("bbc").build();
        TableInfos.typeParamConn(template);
    }

}

在启动方法中使用TemplateData输入类型,需要输入:

  1. 生成名称(根据数据库的表名)
  2. 数据库名
  3. 作者
  4. 模块(当未添加模块,会在指定路径下生成文件)
  5. 路径(输入的路径下生成代码)

生成过程

完整代码

完整代码

功能包

TableInfos(完成数据的拼接类)

package com.kang.studyProjectVue.template.coreApproach;

import com.kang.studyProjectVue.template.links.ProcessJdbc;
import com.kang.studyProjectVue.template.templateEntity.*;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

/**
 * @author Kang
 * @Describe
 * @date 2023/5/20 22:44
 */

public class TableInfos {
    /**
     * @param templateData: 传入对象
     * @param jdbcData:     传入的数据库配置
     * @Description: 当使用自己的数据库配置
     * @Author: Kang
     * @Date: 2023/5/21 12:29
     * @return: java.sql.Statement
     **/
    private void typeParamConn(TemplateData templateData, JdbcData jdbcData) {
        Statement statement = ProcessJdbc.statementSelect(jdbcData);
        Map<String, Object> execute = execute(statement, templateData);
        TemplateRender.rendering(execute, templateData);
    }

    /**
     * @param templateData: 传入对象
     * @param type:         自动寻找yml还是properties的文件
     * @Description:
     * @Author: Kang
     * @Date: 2023/5/21 12:29
     * @return: java.sql.Statement
     **/
    public void typeParamConn(TemplateData templateData, String type) {
        JdbcData jdbcData = null;
        if (Objects.isNull(templateData.getType()) || Objects.equals("yml", templateData.getType()) || Objects.equals("yaml", templateData.getType())) {
            jdbcData = ProcessJdbc.YmlDatabase();
        } else if (Objects.equals("properties", templateData.getType())) {
            jdbcData = ProcessJdbc.PropertiesDatabase();
        }
        Statement statement = ProcessJdbc.statementSelect(jdbcData);
        Map<String, Object> execute = execute(statement, templateData);
        TemplateRender.rendering(execute, templateData);
    }

    /**
     * @param templateData: 传入对象
     * @Description: 默认寻找yml的数据库配置
     * @Author: Kang
     * @Date: 2023/5/20 23:41
     **/
    public static void typeParamConn(TemplateData templateData) {
        JdbcData jdbcData = ProcessJdbc.YmlDatabase();
        Statement statement = ProcessJdbc.statementSelect(jdbcData);
        Map<String, Object> execute = execute(statement, templateData);
        TemplateRender.rendering(execute, templateData);
    }

    /**
     * @param statement:
     * @Description: 处理所有数据
     * @Author: Kang
     * @Date: 2023/5/22 00:43
     * @return: java.util.Map<java.lang.String, java.lang.Object>
     **/
    private static Map<String, Object> execute(Statement statement, TemplateData templateData) {
        TableInfo tableInfo = executeTableInfo(statement,templateData.getSchema());
        List<TableField> tableFields = executeTableField(statement,templateData.getName(),templateData.getSchema());
        Map<String, Object> cleanData = TemplateCleansing.cleanTable(tableInfo, tableFields, templateData);
        Map<String, Object> map = new HashMap<>();
        //表信息
        map.put("tableInfo", tableInfo);
        //字段信息
        map.put("tableFields", tableFields);
        //驼峰后名字
        map.put("humpName", cleanData.get("humpName"));
        map.put("date", cleanData.get("date"));
        map.put("author", "kang");
        //修改路径的/为.
        map.put("dotPath", cleanData.get("dotPath"));
        //模块名
        map.put("moduleName", cleanData.get("moduleName"));
        map.put("typePaths", cleanData.get("typePaths"));
        return map;
    }

    /**
     * @param statement:
     * @Description: 获取表中字段属性
     * @Author: Kang
     * @Date: 2023/5/21 10:36
     * @return: java.util.List<com.kang.studyProjectVue.template.template.TableField>
     **/
    private static List<TableField> executeTableField(Statement statement, String table,String schema) {
        try {
            String executeTableField = DatabaseQuery.executeTableField.replace("{{table}}",table).replace("{{schema}}",schema);
            // 执行查询
            ResultSet resultSet = statement.executeQuery(executeTableField);
            List<TableField> tableFieldsList = new ArrayList<>();
            // 遍历结果集
            while (resultSet.next()) {
                String COLUMN_NAME = resultSet.getString("COLUMN_NAME");
                String COLUMN_TYPE = resultSet.getString("COLUMN_TYPE");
                String COLUMN_COMMENT = resultSet.getString("COLUMN_COMMENT");
                String IS_NULLABLE = resultSet.getString("IS_NULLABLE");

                TableField tableField = new TableField();
                tableField.setCOLUMN_NAME(COLUMN_NAME);
                tableField.setCOLUMN_TYPE(COLUMN_TYPE);
                tableField.setCOLUMN_COMMENT(COLUMN_COMMENT);
                tableField.setIS_NULLABLE(IS_NULLABLE);

                tableFieldsList.add(tableField);
            }
            // 关闭资源
            resultSet.close();
            statement.close();
            return tableFieldsList;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param statement:
     * @Description: 获取表的属性
     * @Author: Kang
     * @Date: 2023/5/21 10:36
     * @return: com.kang.studyProjectVue.template.template.TableInfo
     **/
    private static TableInfo executeTableInfo(Statement statement,String schema) {
        try {
            String executeTableField = DatabaseQuery.executeTableInfo.replace("{{schema}}",schema);

            // 执行查询
            ResultSet resultSet = statement.executeQuery(executeTableField);
            // 遍历结果集
            TableInfo tableInfo = new TableInfo();
            if (resultSet.next()) {
                String TABLE_NAME = resultSet.getString("TABLE_NAME");
                String TABLE_COMMENT = resultSet.getString("TABLE_COMMENT");
                String ENGINE = resultSet.getString("ENGINE");
                Date UPDATE_TIME = resultSet.getDate("UPDATE_TIME");
                Date CREATE_TIME = resultSet.getDate("CREATE_TIME");
                tableInfo.setTABLE_NAME(TABLE_NAME);
                tableInfo.setTABLE_COMMENT(TABLE_COMMENT);
                tableInfo.setENGINE(ENGINE);
                tableInfo.setUPDATE_TIME(UPDATE_TIME);
                tableInfo.setCREATE_TIME(CREATE_TIME);
            }

            // 关闭资源
            resultSet.close();
            return tableInfo;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

}

TemplateCleansing(格式化一些数据)

package com.kang.studyProjectVue.template.coreApproach;

import com.kang.studyProjectVue.template.templateEntity.AttrsType;
import com.kang.studyProjectVue.template.templateEntity.TableField;
import com.kang.studyProjectVue.template.templateEntity.TableInfo;
import com.kang.studyProjectVue.template.templateEntity.TemplateData;
import org.springframework.util.CollectionUtils;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * @author Kang
 * @Describe 模板数据清理
 * @date 2023/5/21 12:37
 */

public class TemplateCleansing {


    public static Map<String, Object> cleanTable(TableInfo tableInfo, List<TableField> tableFields, TemplateData templateData) {
        Map<String, Object> map = new HashMap<>();
        //备份原字段名
        reservedFields(tableFields);
        //进行驼峰
        String humpName = cleanTableName(tableInfo.getTABLE_NAME(), tableFields);
        tableInfo.setHumpTABLENAME(humpName);
        //剔除()
        cleanFieldType(tableFields);
        //改变路径/为.
        String dotPath = changePathName(templateData);
        //格式化时间
        String date = cleanDate();
        //获取模块名
        String moduleName = moduleName(templateData);
        //所有路径
        Set<String> typePaths = typePaths(tableFields);
        map.put("humpName", humpName);
        map.put("date", date);
        map.put("dotPath", dotPath);
        map.put("moduleName",moduleName);
        map.put("typePaths",typePaths);
        return map;
    }

    /**
     * @param name: 表名
     * @Description: 数据名称进行驼峰
     * @Author: Kang
     * @Date: 2023/5/21 12:42
     * @return: java.lang.String
     **/
    public static String cleanTableName(String name, List<TableField> tableFields) {
        String hump = null;
        if (Objects.nonNull(name)) {
            hump = hump(name);

        }
        if (!CollectionUtils.isEmpty(tableFields)) {
            for (TableField tableField : tableFields) {
                String humpTableField = hump(tableField.getCOLUMN_NAME());
                tableField.setCOLUMN_NAME(humpTableField);
            }
        }
        return hump;

    }

    private static String hump(String name) {
        StringBuilder result = new StringBuilder();
        String[] words = name.split("_");
        // 当存在下划线的时候
        if (name.contains("_")) {
            for (int i = 0; i < words.length; i++) {
                //将第一个单词保留,其他进行操作
                if (words[i].length() > 0) {
                    if (i == 0) {
                        result.append(words[i]);
                    } else {
                        //将第一个字母变大,之后的截取变小
                        result.append(Character.toUpperCase(words[i].charAt(0)))
                                .append(words[i].substring(1).toLowerCase());
                    }
                }
            }
        } else {
            result.append(name);
        }
        return result.toString();
    }

    /**
     * @param tableFields: 类型
     * @Description: 清理数据库类型中带()
     * @Author: Kang
     * @Date: 2023/5/21 14:57
     * @return: void
     **/
    private static void cleanFieldType(List<TableField> tableFields) {
        if (!CollectionUtils.isEmpty(tableFields)) {
            //寻找是否有()并在枚举中寻找相应的java类型
            for (TableField tableField : tableFields) {
                Matcher matcher = Pattern.compile("(\\w+)(?=\\()").matcher(tableField.getCOLUMN_TYPE());
                if (matcher.find()) {
                    String javaType = AttrsType.findJavaType(matcher.group().toUpperCase());
                    String typePath = AttrsType.findTypePath(matcher.group().toUpperCase());
                    tableField.setCOLUMN_TYPE(javaType);
                    tableField.setTypePath(typePath);
                } else {
                    String javaType = AttrsType.findJavaType(tableField.getCOLUMN_TYPE().toUpperCase());
                    String typePath = AttrsType.findTypePath(tableField.getCOLUMN_TYPE().toUpperCase());
                    tableField.setCOLUMN_TYPE(javaType);
                    tableField.setTypePath(typePath);
                }
            }

        }
    }

    /**
     * @param tableFields:
     * @Description: 备份原数据
     * @Author: Kang
     * @Date: 2023/5/21 16:48
     * @return: void
     **/
    private static void reservedFields(List<TableField> tableFields) {
        if (!CollectionUtils.isEmpty(tableFields)) {
            for (TableField tableField : tableFields) {
                tableField.setReservedFields(tableField.getCOLUMN_NAME());
            }
        }
    }

    private static Set<String> typePaths(List<TableField> tableFields){
        return tableFields.stream().map(TableField::getTypePath).filter(typePath ->!Objects.equals(typePath,"")).collect(Collectors.toSet());
    }

    /**
     * @Description: 获取时间格式化
     * @Author: Kang
     * @Date: 2023/5/21 15:22
     * @return: java.lang.String
     **/
    private static String cleanDate() {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/M/dd HH:mm");
        return simpleDateFormat.format(date);
    }

    /**
     * @param templateData:
     * @Description: 将路径/转为.
     * @Author: Kang
     * @Date: 2023/5/22 00:51
     * @return: java.lang.String
     **/
    private static String changePathName(TemplateData templateData) {
        if (Objects.nonNull(templateData.getPath()) && Objects.nonNull(templateData.getModule())) {
            String convertedPath = templateData.getPath().replace('/', '.');
            return convertedPath + "." + templateData.getModule();
        }
        if (Objects.isNull(templateData.getModule())) {
            return templateData.getPath().replace('/', '.');
        }
        return null;
    }

    /**
     * @Description: 模块路径名
     * @Author: Kang
     * @Date: 2023/5/22 13:00
     * @return: java.lang.String
     **/
    private static String moduleName(TemplateData templateData) {
        if (Objects.nonNull(templateData)) {
            return templateData.getModule();
        }
        //截取最后一个/的索引截断
        int lastIndexOf = templateData.getPath().lastIndexOf("/");
        return templateData.getPath().substring(lastIndexOf);

    }
}

TemplateRender(渲染类)

package com.kang.studyProjectVue.template.coreApproach;

import com.kang.studyProjectVue.template.templateEntity.TableInfo;
import com.kang.studyProjectVue.template.templateEntity.TemplateData;
import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author Kang
 * @Describe 渲染方法
 * @date 2023/5/21 10:38
 */

public class TemplateRender {

    /**
     * @param map:          模板结构数据
     * @param templateData: 传入方法
     * @Description: 写入文件
     * @Author: Kang
     * @Date: 2023/5/21 19:29
     * @return: void
     **/
    public static void rendering(Map<String, Object> map, TemplateData templateData) {
        Configuration configuration = loading();
        Map<String, Object> templatesMap = templatesName(map, templateData);
        templatesMap.forEach((k, v) -> {
            String templatePath = templatesMap.get(k).toString();
            try {
                // 加载模板
                Template template = configuration.getTemplate(k);

                // 渲染模板
                StringWriter writer = new StringWriter();
                template.process(map, writer);
                // 写入文件
                String renderedContent = writer.toString();

                File file = new File(templatePath);
                file.getParentFile().mkdirs();
                FileWriter fileWriter = new FileWriter(templatePath);
                fileWriter.write(renderedContent);
                fileWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            } catch (TemplateException e) {
                throw new RuntimeException(e);
            }
        });
    }

    /**
     * @Description: 加载模板引擎
     * @Author: Kang
     * @Date: 2023/5/21 19:29
     * @return: freemarker.template.Configuration
     **/
    public static Configuration loading() {
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
        try {
            // 设置模板加载路径
            FileTemplateLoader templateLoader = new FileTemplateLoader(new File("src/main/resources/templates"));
            configuration.setTemplateLoader(templateLoader);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return configuration;
    }

    /**
     * @param mapInfo:
     * @param templateData:
     * @Description: 拼接生成路径
     * @Author: Kang
     * @Date: 2023/5/22 00:42
     * @return: java.util.Map<java.lang.String, java.lang.Object>
     **/
    private static Map<String, Object> templatesName(Map<String, Object> mapInfo, TemplateData templateData) {
        String controller = null;
        String dto = null;
        String entity = null;
        String mapper = null;
        String service = null;
        String serviceImpl = null;
        String vo = null;
        String mapperXml=null;
        //系统项目路径
        String projectRootPath = System.getProperty("user.dir") + "/src/main/java";
        // xml文件路径
        String xmlPath = System.getProperty("user.dir")+"/src/main/resources";
        TableInfo tableInfo = (TableInfo) mapInfo.get("tableInfo");
        Map<String, Object> map = new HashMap<>();
        if (Objects.nonNull(templateData.getPath()) && Objects.nonNull(templateData.getModule())) {
            controller = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "controller" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Controller.java";
            dto = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "dto" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Dto.java";
            entity = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "entity" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Entity.java";
            mapper = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "mapper" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Mapper.java";
            service = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "service" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Service.java";
            serviceImpl = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "serviceImpl" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "ServiceImpl.java";
            vo = projectRootPath + "/" + templateData.getPath() + "/" + templateData.getModule() + "/" + "vo" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Vo.java";
            mapperXml =xmlPath+"/mapper/"+templateData.getModule()+"/"+firstName(tableInfo.getHumpTABLENAME()) +"Mapper.xml";
        } else if (Objects.nonNull(templateData.getPath())) {
            controller = projectRootPath + "/" + templateData.getPath() + "/" + "controller" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Controller.java";
            dto = projectRootPath + "/" + templateData.getPath() + "/" + "dto" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Dto.java";
            entity = projectRootPath + "/" + templateData.getPath() + "/" + "entity" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Entity.java";
            mapper = projectRootPath + "/" + templateData.getPath() + "/" + "mapper" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Mapper.java";
            service = projectRootPath + "/" + templateData.getPath() + "/" + "service" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Service.java";
            serviceImpl = projectRootPath + "/" + templateData.getPath() + "/" + "serviceImpl" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "ServiceImpl.java";
            vo = projectRootPath + "/" + templateData.getPath() + "/" + "vo" + "/" + firstName(tableInfo.getHumpTABLENAME()) + "Vo.java";
            mapperXml =xmlPath+"/mapper/"+firstName(tableInfo.getHumpTABLENAME()) +"Mapper.xml";
        }
        map.put("templateController.ftl", controller);
        map.put("templateDto.ftl", dto);
        map.put("templateEntity.ftl", entity);
        map.put("templateMapper.ftl", mapper);
        map.put("templateService.ftl", service);
        map.put("templateServiceImpl.ftl", serviceImpl);
        map.put("templateVo.ftl", vo);
        map.put("templateMapper.xml.ftl",mapperXml);
        return map;
    }

    /**
     * @param s: 字符串
     * @Description: 首字母变大写
     * @Author: Kang
     * @Date: 2023/5/21 17:01
     * @return: java.lang.String
     **/
    private static String firstName(String s) {
        return s.substring(0, 1).toUpperCase() + s.substring(1);
    }

}

links(JDBC连接包)

package com.kang.studyProjectVue.template.links;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.kang.studyProjectVue.template.templateEntity.JdbcData;
import org.yaml.snakeyaml.Yaml;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
import java.util.Properties;

/**
 * @author Kang
 * @Describe 通过jdbc查询数据库等操作
 * @date 2023/5/21 12:21
 */

public class ProcessJdbc {

    /**
     * @param jdbcData:
     * @Description: 获取statement对象
     * @Author: Kang
     * @Date: 2023/5/21 15:20
     * @return: java.sql.Statement
     **/

    public static Statement statementSelect(JdbcData jdbcData){
        Connection connection = getConnection(jdbcData);
        return getStatement(connection);
    }


    /**
     * @param jdbcData:
     * @Description: 数据库链接
     * @Author: Kang
     * @Date: 2023/5/21 15:21
     * @return: java.sql.Connection
     **/
    private static Connection getConnection(JdbcData jdbcData) {

        try {
            return DriverManager.getConnection(jdbcData.getURL(), jdbcData.getUSERNAME(), jdbcData.getPASSWORD());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    private static Statement getStatement(Connection connection) {
        try {
            return connection.createStatement();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static JdbcData YmlDatabase() {
        // 读取application.yml文件内容
        try (FileInputStream inputStream = new FileInputStream("src/main/resources/application.yml")) {
            //创建YAML解析器
            Yaml yaml = new Yaml();

            //读取YAML
            Map<String, Object> yamlMap = yaml.load(inputStream);

            //yaml转为json获取指定的key
            ObjectMapper objectMapper = new ObjectMapper();
            String springJson = objectMapper.writeValueAsString(yamlMap);
            DocumentContext context = JsonPath.parse(springJson);
            Map<String, Object> map = (Map<String, Object>) context.read("$.spring.datasource");

            // 获取数据库配置
            String url = (String) map.get("url");
            String username = (String) map.get("username");
            String password = (String) map.get("password");
            return JdbcData.builder().URL(url).PASSWORD(password).USERNAME(username).build();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static JdbcData PropertiesDatabase() {
        // 创建 Properties 对象
        Properties properties = new Properties();

        // 加载 properties 文件
        try (FileInputStream fileInputStream = new FileInputStream("application.yml")) {
            properties.load(fileInputStream);
            fileInputStream.close();
            // 读取数据库连接信息
            String url = properties.getProperty("spring.datasource.url");
            String username = properties.getProperty("spring.datasource.username");
            String password = properties.getProperty("spring.datasource.password");
            return JdbcData.builder().URL(url).PASSWORD(password).USERNAME(username).build();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

templateEntity实体类包

AttrsType(数据库对应java类型)

package com.kang.studyProjectVue.template.templateEntity;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.util.Objects;

/**
 * @author Kang
 * @Describe 数据库类型枚举
 * @date 2023/5/21 10:10
 */

@AllArgsConstructor
@NoArgsConstructor
public enum AttrsType {
    VARCHAR("String",""),
    CHAR("String",""),
    TEXT("String",""),
    INT("Integer",""),
    BIGINT("Long",""),
    FLOAT("Float",""),
    DOUBLE("Double",""),
    DECIMAL("BigDecimal","java.math.BigDecimal"),
    DATE("Date","java.util.Date"),
    TIME("Date","java.util.Date"),
    DATETIME("Date","java.util.Date"),
    TIMESTAMP("Date","java.util.Date");

    private String FieldType;
    private String typePath;


    public static String findJavaType(String fieldType){
        for (AttrsType value : AttrsType.values()) {
            if (Objects.nonNull(fieldType)&&Objects.equals(fieldType,value.name())){
                return value.FieldType;
            }
        }
        return null;
    }

    public static String findTypePath(String fieldType){
        for (AttrsType value : AttrsType.values()) {
            if (Objects.nonNull(fieldType)&&Objects.equals(fieldType,value.name())){
                return value.typePath;
            }
        }
        return null;
    }
}

DatabaseQuery(查询数据库内容)

package com.kang.studyProjectVue.template.templateEntity;

/**
 * @author Kang
 * @Describe 查询数据库sql
 * @date 2023/5/20 23:47
 */

public interface DatabaseQuery {
    //查询表属性
     String executeTableInfo="SELECT TABLE_NAME, TABLE_COMMENT, ENGINE, UPDATE_TIME, CREATE_TIME\n" +
            "FROM INFORMATION_SCHEMA.TABLES\n" +
            "WHERE TABLE_SCHEMA = '{{schema}}';";

     String executeTableField="SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH\n" +
             "FROM INFORMATION_SCHEMA.COLUMNS\n" +
             "WHERE TABLE_SCHEMA = '{{schema}}' AND TABLE_NAME = '{{table}}';";
}

JdbcData(自己数据库,未填会自己根据项目去找yml文件中的账户密码)

package com.kang.studyProjectVue.template.templateEntity;

import lombok.Builder;
import lombok.Data;

/**
 * @author Kang
 * @Describe 数据库
 * @date 2023/5/20 23:01
 */

@Data
@Builder
public class JdbcData {
    private String URL;
    private String USERNAME;
    private String PASSWORD;
}

TableField(数据库字段)

package com.kang.studyProjectVue.template.templateEntity;

import lombok.Data;

/**
 * @author Kang
 * @Describe 字段类型
 * @date 2023/5/20 23:57
 */

@Data
public class TableField {
    /**
     *  字段名
     */
    private String COLUMN_NAME;

    /**
     *  类型路径
     */
    private String typePath;

    /**
     *  字段类型
     */
    private String  COLUMN_TYPE;

    /**
     *  字段注释
     */
    private String COLUMN_COMMENT;

    /**
     *  字段是否主键
     */
    private String IS_NULLABLE;

    /**
     *  原字段
     */
    private String reservedFields;
}

表类型

package com.kang.studyProjectVue.template.templateEntity;

import lombok.Data;

import java.sql.Date;

/**
 * @author Kang
 * @Describe 表类型
 * @date 2023/5/20 23:54
 */

@Data
public class TableInfo {
    /**
     *  原始表名
     */
    private String TABLE_NAME;

    /**
     *  表注释
     */
    private String TABLE_COMMENT;

    /**
     *  使用引擎
     */
    private String ENGINE;

    /**
     *  表更新时间
     */
    private Date UPDATE_TIME;

    /**
     *  表创建时间
     */
    private Date CREATE_TIME;


    /**
     *  驼峰后的表名
     */
    private String humpTABLENAME;
}

输入类型可以增加

package com.kang.studyProjectVue.template.templateEntity;

import lombok.Builder;
import lombok.Data;

/**
 * @author Kang
 * @Describe 选择传入的参数
 * @date 2023/5/20 22:28
 */

@Data
@Builder
public class TemplateData {
    /**
     * 作者
     */
    private String author;

    /**
     * 生成路径
     */
    private String path;

    /**
     * 模块名
     */
    private String module;

    /**
     * 时间
     */
    private String date;

    /**
     * 名字
     */
    private String name;

    /**
     *  文件类型
     */
    private String type;

    /**
     * 数据账号密码
     */
    private JdbcData jdbcData;

    private String schema;
}

模板(找resource下的Template)

controller

package ${dotPath}.controller;

import com.github.pagehelper.PageInfo;
import ${dotPath}.dto.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto;
import ${dotPath}.service.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Service;
import ${dotPath}.vo.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo;
import com.kang.studyProjectVue.untils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
* @author ${author}
* @Describe
* @date ${date}
*/

@RequestMapping("/${humpName}")
@RestController
public class ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Controller {

    @Autowired
    private ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Service ${humpName}Service;

    /**
    * @param ${humpName}Dto: 传入参数
    * @Description: 根据参数查询
    * @Author: ${author}
    * @Date: ${date}
    * @return:
    **/
    @PostMapping("${humpName}SelectList")
    public Result<List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo>> ${humpName}SelectList(@RequestBody ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        return ${humpName}Service.${humpName}SelectList(${humpName}Dto);
    }

    /**
    * @param id:
    * @Description: 根据id查询
    * @Author: ${author}
    * @Date: ${date}
    * @return:
    **/
    @GetMapping("${humpName}SelectById")
    public Result<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectById(String id) {
        return ${humpName}Service.${humpName}SelectById(id);
    }

    /**
    * @param ${humpName}Dto:
    * @Description: 分页查询
    * @Author: ${author}
    * @Date: ${date}
    * @return:
    **/
    @PostMapping("${humpName}SelectPageList")
    public PageInfo<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectPageList(@RequestBody ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        return ${humpName}Service.${humpName}SelectPageList(${humpName}Dto);
    }

    /**
    * @param ${humpName}Dto:
    * @Description: 修改
    * @Author: ${author}
    * @Date: ${date}
    * @return:
    **/
    @PostMapping("${humpName}Update")
    public Result<String> ${humpName}Update(@RequestBody ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        return ${humpName}Service.${humpName}Update(${humpName}Dto);
    }

    /**
    * @param ${humpName}Dto:
    * @Description: 新增
    * @Author: ${author}
    * @Date: ${date}
    * @return:
    **/
    @PostMapping(value = "/${humpName}Insert")
    public Result<String> ${humpName}Insert(@RequestBody ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        return ${humpName}Service.${humpName}Insert(${humpName}Dto);
    }

    /**
    * @param id:
    * @Description: 根据id删除
    * @Author: ${author}
    * @Date: ${date}
    * @return:
    **/
    @GetMapping("aDelete")
    public Result<String> ${humpName}Delete(String id) {
        return ${humpName}Service.${humpName}Delete(id);
    }

}

dto

package com.kang.studyProjectVue.moudles.${moduleName}.dto;

import com.kang.studyProjectVue.untils.PageUtils;
import lombok.Data;

import java.io.Serializable;
<#list typePaths as Fields>
import ${Fields};

</#list>

/**
* @author ${author}
* @Describe
* @date ${date}
*/

@Data
public class ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto extends PageUtils implements Serializable{
<#list tableFields as Fields>

    /**
    *  ${Fields.COLUMN_COMMENT?trim}
    */
    private ${Fields.COLUMN_TYPE} ${Fields.COLUMN_NAME};
</#list>

}

entity

package com.kang.studyProjectVue.moudles.${moduleName}.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.math.BigDecimal;
import java.sql.Date;

/**
* @author ${author}
* @Describe
* @date ${date}
*/

@Data
@TableName("${tableInfo.TABLE_NAME}")
public class ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity{
<#list tableFields as Fields>

    /**
     *  ${Fields.COLUMN_COMMENT?trim}
     */
    <#if Fields.IS_NULLABLE == "NO">
    @TableId(type = IdType.INPUT,value = "${Fields.reservedFields}")
    <#else>
    @TableField(value = "${Fields.reservedFields}")
    </#if>
    private ${Fields.COLUMN_TYPE} ${Fields.COLUMN_NAME};
</#list>

}

mapper

package ${dotPath}.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import ${dotPath}.entity.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity;
import org.apache.ibatis.annotations.Mapper;

/**
* @author Kang
* @Describe
* @date ${date}
*/
@Mapper
public interface ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Mapper extends BaseMapper<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity> {
}

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="${dotPath}.mapper.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Mapper">
    <resultMap id="baseMapper" type="${dotPath}.vo.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo">
        <#list tableFields as Fields>
        <result column="${Fields.reservedFields}" property="${Fields.COLUMN_NAME}"/>
        </#list>
    </resultMap>

</mapper>

service

package ${dotPath}.service;

import com.github.pagehelper.PageInfo;
import ${dotPath}.dto.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto;
import ${dotPath}.vo.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo;
import com.kang.studyProjectVue.untils.Result;

import java.util.List;

/**
* @author ${author}
* @Describe
* @date ${date}
*/
public interface ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Service {


    Result<List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo>> ${humpName}SelectList(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto);

    Result<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectById(String id);

    PageInfo<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectPageList(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto);

    Result<String> ${humpName}Update(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto);

    Result<String> ${humpName}Insert(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto);

    Result<String> ${humpName}Delete(String id);
}

serviceimpl

package ${dotPath}.serviceImpl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import ${dotPath}.dto.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto;
import ${dotPath}.entity.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity;
import ${dotPath}.mapper.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Mapper;
import ${dotPath}.service.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Service;
import ${dotPath}.vo.${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo;
import com.kang.studyProjectVue.untils.Result;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* @author ${author}
* @Describe
* @date ${date}
*/
@Service
public class ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}ServiceImpl implements ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Service {

    @Autowired
    private ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Mapper ${humpName}Mapper;

    /**
    * @param ${humpName}Dto:
    * @Description: 查询全部
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    @Override
    public Result<List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo>> ${humpName}SelectList(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        return Result.ok(${humpName}SelectCon(${humpName}Dto));
    }

    private List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectCon(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        QueryWrapper<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity> query = new QueryWrapper<>();
        List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity> ${humpName}Entities = ${humpName}Mapper.selectList(query);
        return conType(${humpName}Entities);
    }

    /**
    * @param id:
    * @Description: 根据id查询
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    @Override
    public Result<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectById(String id) {
        ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity ${humpName}Entity = ${humpName}Mapper.selectById(id);
        return Result.ok(conType(${humpName}Entity));
    }

    /**
    * @param ${humpName}Dto:
    * @Description: 分页查询
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    @Override
    public PageInfo<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> ${humpName}SelectPageList(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        PageHelper.startPage(${humpName}Dto.pageSize, ${humpName}Dto.pageNums);
        return new PageInfo<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo>(${humpName}SelectCon(${humpName}Dto));
    }

    /**
    * @param ${humpName}Dto:
    * @Description: 修改
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    @Override
    public Result<String> ${humpName}Update(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity ${humpName}Entity = conType(${humpName}Dto);
        QueryWrapper<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity> query = new QueryWrapper<>();
        ${humpName}Mapper.update(${humpName}Entity,query);
        return Result.ok("");
    }

    /**
    * @param ${humpName}Dto:
    * @Description: 新增
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    @Override
    public Result<String> ${humpName}Insert(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto) {
        ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity ${humpName}Entity = conType(${humpName}Dto);
        ${humpName}Mapper.insert(${humpName}Entity);
        return Result.ok("");
    }

    /**
    * @param id:
    * @Description: 根据id删除
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    @Override
    public Result<String> ${humpName}Delete(String id) {
       ${humpName}Mapper.deleteById(id);
        return Result.ok("");
    }

    /**
    * @param ${humpName}EntityList:
    * @Description: 转换类型
    * @Author: ${author}
    * @Date: ${date}
    * @return: 
    **/
    private List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo> conType(List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity> ${humpName}EntityList) {
        ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo ${humpName}vo = new ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo();
        return (List<${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo>) BeanUtil.copyToList(${humpName}EntityList, ${humpName}vo.getClass());
    }

    private ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo conType(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity ${humpName}EntityList) {
        ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo ${humpName}vo = new ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo();
        BeanUtils.copyProperties(${humpName}EntityList, ${humpName}vo);
        return ${humpName}vo;
    }

    private ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity conType(${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Dto ${humpName}Dto){
        ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity ${humpName}Entity = new ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Entity();
        BeanUtils.copyProperties(${humpName}Dto,${humpName}Entity);
        return ${humpName}Entity;
    }
}

vo

package com.kang.studyProjectVue.moudles.${moduleName}.vo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.math.BigDecimal;
import java.sql.Date;

/**
* @author ${author}
* @Describe
* @date ${date}
*/

@Data
public class ${humpName?substring(0, 1)?upper_case}${humpName?substring(1)}Vo{
<#list tableFields as Fields>

    /**
    *  ${Fields.COLUMN_COMMENT?trim}
    */
    private ${Fields.COLUMN_TYPE} ${Fields.COLUMN_NAME};
</#list>

}