使用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输入类型,需要输入:
- 生成名称(根据数据库的表名)
- 数据库名
- 作者
- 模块(当未添加模块,会在指定路径下生成文件)
- 路径(输入的路径下生成代码)
完整代码
功能包
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>
}
本文作者:Kang_kin
本文链接:https://www.cnblogs.com/kangkin/p/17421157.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步