自定义代码生成器(下)

4.2 编码4.2.1 常量类package freemarker.constant; public class TemplateConstant { //实体类模板 public static final String entityTemplate = “templates/Entity.ftl”; //Mapper模板 public static final String mapperTemplate = “templates/Mapper.ftl”; //Mapper映射文件模版 public static final String mapperXmlTemplate = “templates/MapperXml.ftl”; //service模版 public static final String serviceTemplate = “templates/Service.ftl”; //service实现类模版 public static final String serviceImplTemplate = “templates/ServiceImpl.ftl”; //controller模版 public static final String controllerTemplate = “templates/Controller.ftl”; //vo模版 public static final String entityVoTemplate = “templates/EntityVo.ftl”; //dto模版 public static final String entityDtoTemplate = “templates/EntityDto.ftl”; //pom模版 public static final String pomTemplate = “templates/pom.ftl”; //application.yml模版 public static final String applicationTemplate = “templates/application.ftl”; }4.2.2 工具类

(1)DbUtil数据库工具类

package freemarker.util; import freemarker.param.ColumnClass; import freemarker.param.TableClass; import lombok.Getter; import lombok.Setter; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; / * 数据库工具类 */ @Setter @Getter public class DbUtil { //数据库连接地址 private String url = “jdbc:mysql://localhost:3306/heima_leadnews_wemedia?useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=UTC”; //数据库用户名 private String username = “root”; //数据库密码 private String password = “123456”; //数据库驱动 private String driver = “com.mysql.jdbc.Driver”; //数据库名称 private String dbName = null; private Connection connection =null; / * 获取jdbc链接 * @return * @throws Exception */ public Connection getConnection() throws Exception{ Properties pro = new Properties(); pro.setProperty(“user”, username); pro.setProperty(“password”, password); pro.put(“useInformationSchema”, “true”);//获取mysql表注释 //pro.setProperty(“remarksReporting”,”true”);//获取oracle表注释 Class.forName(driver); connection = DriverManager.getConnection(url, pro); return connection; } / * 获取当前数据库下的所有表名称及注释 * @return * @throws Exception */ public List<TableClass> getAllTables() throws Exception { List<TableClass> list = new ArrayList<>(); //获取链接 Connection conn = getConnection(); //获取元数据 DatabaseMetaData metaData = conn.getMetaData(); //获取所有的数据库表信息 ResultSet rs = metaData.getTables(dbName!=null?dbName:conn.getCatalog(), “%”, “%”, new String[]{“TABLE”}); while (rs.next()) { TableClass tableClass = new TableClass(); tableClass.setTableName(rs.getString(3)); tableClass.setTableComment(rs.getString(5)); list.add(tableClass); } return list; } / * 获取某张表的所有列 * @param tableName * @return * @throws Exception */ public List<ColumnClass> getAllColumns(String tableName) throws Exception { List<ColumnClass> list = new ArrayList<>(); //获取链接 Connection conn = getConnection(); //获取元数据 DatabaseMetaData metaData = conn.getMetaData(); //获取所有的数据库某张表所有列信息 ResultSet rs = metaData.getColumns(dbName!=null?dbName:conn.getCatalog(), “%”, tableName,“%”); while(rs.next()) { ColumnClass columnClass = new ColumnClass(); columnClass.setColumnName(rs.getString(“COLUMN_NAME”)); columnClass.setColumnType(rs.getString(“TYPE_NAME”)); columnClass.setColumnComment(rs.getString(“REMARKS”)); columnClass.setChangeColumnName(StrUtil.changeColumnStr(rs.getString(“COLUMN_NAME”))); list.add(columnClass); } return list; } / * 关闭链接 */ public void closeConnection(){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } }; }

(2)字符串处理工具类

package freemarker.util; / * 字符串处理工具类 */ public class StrUtil { / * 去掉下划线转驼峰 user_name -> userName * @param str * @return */ public static String changeColumnStr(String str) { String name = str; if (name.indexOf(“_”) > 0 && name.length() != name.indexOf(“_”) + 1) { int lengthPlace = name.indexOf(“_”); name = name.replaceFirst(“_”, “”); String s = name.substring(lengthPlace, lengthPlace + 1); s = s.toUpperCase(); str = name.substring(0, lengthPlace) + s + name.substring(lengthPlace + 1); } else { return str; } return changeColumnStr(str); } / * 去掉下划线转驼峰 tb_user -> TbUser * @param str * @return */ public static String changeTableStr(String str) { String s = changeColumnStr(str); return s.substring(0,1).toUpperCase()+s.substring(1); } }

(3)FreeMarker模版工具类

package freemarker.util; import freemarker.cache.FileTemplateLoader; import freemarker.cache.NullCacheStorage; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateExceptionHandler; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; / * FreeMarker模版工具类 */ public class FreeMarkerTemplateUtils { private FreeMarkerTemplateUtils(){} private static final Configuration CONFIGURATION = new Configuration(Configuration.VERSION_2_3_22); static{ //ClassTemplateLoader方式:需要将模版放在FreeMarkerTemplateUtils类所在的包,加载模版时会从该包下加载 //CONFIGURATION.setTemplateLoader(new ClassTemplateLoader(FreeMarkerTemplateUtils.class,””)); try { String path = java.net.URLDecoder.decode(FreeMarkerTemplateUtils.class.getClassLoader().getResource(“”).getPath(),“utf-8”); //FileTemplateLoader方式:需要将模版放置在classpath目录下 目录有中文也可以 CONFIGURATION.setTemplateLoader(new FileTemplateLoader(new File(path))); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } CONFIGURATION.setDefaultEncoding(“UTF-8”); CONFIGURATION.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); CONFIGURATION.setCacheStorage(NullCacheStorage.INSTANCE); } public static Template getTemplate(String templateName) throws IOException { try { return CONFIGURATION.getTemplate(templateName); } catch (IOException e) { throw e; } } public static void clearCache() { CONFIGURATION.clearTemplateCache(); } }4.2.3 实体类

(1)表实体类

package freemarker.param; import lombok.Data; @Data public class TableClass { / * 表名 tb_user / private String tableName; / * 表注释 / private String tableComment; }

(2)列实体类

package freemarker.param; import lombok.Data; @Data public class ColumnClass { / * 数据库字段名称 user_name / private String columnName; / * 数据库字段类型 / private String columnType; / * 数据库字段首字母小写且去掉下划线字符串 userName / private String changeColumnName; / * 数据库字段注释 / private String columnComment; }

(3)模版相关参数类

package freemarker.param; import lombok.Data; import org.apache.commons.lang3.StringUtils; import java.text.SimpleDateFormat; import java.util.Date; @Data public class TemplatePathParam { private String currentDate = new SimpleDateFormat(“yyyy/MM/dd”).format(new Date()); //包名 com.itheima.user private String packageName; //代码生成路径 D:\path private String basePath; //项目名称 英文 比如itheima-user private String projectName; //作者 private String author ; //实体类生成的绝对路径 private String entityPath; //vo实体类生成的绝对路径 private String entityVoPath; //Dto实体类生成的绝对路径 private String entityDtoPath; //mapper生成绝对路径 private String mapperPath; //mapper映射文件生成的绝对路径 private String mapperXmlPath; //service接口生成的绝对路径 private String servicePath; //service实现类生成的绝对路径 private String serviceImplPath; //controller生成的绝对路径 private String controllerPath; //pom文件生成的绝对路径 private String pomPath; //application.yml文件生成的绝对路径 private String applicationYmlPath; public TemplatePathParam(String packageName, String basePath, String projectName, String author) { if(StringUtils.isBlank(packageName) || StringUtils.isBlank(basePath) || StringUtils.isBlank(author) || StringUtils.isBlank(projectName)){ throw new RuntimeException(“参数不能为空”); } this.packageName = packageName; this.basePath = basePath; this.author = author; this.projectName = projectName; String[] split = packageName.split(“\.”); // D:\path\itheima-user\src\main\java\com\itheima\user String javaModelPath = basePath+“\”+projectName+“\src\main\java\”+split[0]+“\”+split[1]+“\”+split[2]; String xmlModelPath = basePath+“\”+projectName+“\src\main\resources\”+split[0]+“\”+split[1]+“\”+split[2]; this.setEntityPath(javaModelPath+“\entity”); this.setMapperPath(javaModelPath+“\mapper”); this.setMapperXmlPath(xmlModelPath+“\mapper”); this.setServicePath(javaModelPath+“\service”); this.setServiceImplPath(javaModelPath+“\service\impl”); this.setControllerPath(javaModelPath+“\http\controller”); this.setEntityVoPath(javaModelPath+“\http\vo”); this.setEntityDtoPath(javaModelPath+“\http\dto”); this.setEntityDtoPath(javaModelPath+“\http\dto”); this.setPomPath(basePath+“\”+projectName); this.setApplicationYmlPath(basePath+“\”+projectName+“\src\main\resources”); } } 4.2.4 代码生成器入口类package freemarker; import freemarker.constant.TemplateConstant; import freemarker.param.ColumnClass; import freemarker.param.TableClass; import freemarker.param.TemplatePathParam; import freemarker.template.Template; import freemarker.util.DbUtil; import freemarker.util.FreeMarkerTemplateUtils; import freemarker.util.StrUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; / * 代码生成器入口 */ public class CodeGenerateUtils { private TemplatePathParam templatePathParam = null; public static void main(String[] args) throws Exception{ CodeGenerateUtils codeGenerateUtils = new CodeGenerateUtils(); codeGenerateUtils.generate(); System.out.println(“============ 全部生成完成! =============”); } public void generate() throws Exception{ / * 参数1:报名 * 参数2:生成代码的基础路径 * 参数3:项目名称 * 参数4:作者 */ templatePathParam = new TemplatePathParam(“com.itheima.wemedia”, “D:\heima\技术文章\代码”, “itheima-wemedia”, “kdm”); //数据库相关 DbUtil dbUtil = new DbUtil(); //获取所有表 List<TableClass> allTable = dbUtil.getAllTables(); for (TableClass tableClass : allTable) { //表名 String table = tableClass.getTableName(); //获取所有列 List<ColumnClass> allColumns = dbUtil.getAllColumns(table); System.out.println(“——– 正在生成 “ + table+” 表相关文件——“); //生成实体类 System.out.println(“生成实体类”); generateEntityFile(tableClass, allColumns); //生成Mapper System.out.println(“生成Mapper”); generateMapperFile(tableClass, allColumns); //生成Mapper.xml System.out.println(“生成Mapper映射文件”); generateMapperXmlFile(tableClass, allColumns); //生成service接口 System.out.println(“生成service接口”); generateServiceFile(tableClass, allColumns); //生成service实现类 System.out.println(“生成service实现类”); generateServiceImplFile(tableClass, allColumns); //生成Controller层文件 System.out.println(“生成Controller层文件”); generateControllerFile(tableClass, allColumns); //生成vo类 System.out.println(“生成vo类”); generateEntityVoFile(tableClass, allColumns); //生成dto类 System.out.println(“生成dto类”); generateEntityDtoFile(tableClass, allColumns); //生成pom文件 System.out.println(“生成pom文件”); generatePomFile(tableClass, allColumns); //生成application.yml文件 System.out.println(“生成application.yml文件”); generateApplicationYmlFile(tableClass, allColumns); } dbUtil.closeConnection(); } / * 生成实体文件 */ private void generateEntityFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “.java”; String filePath = templatePathParam.getEntityPath(); String file = templatePathParam.getEntityPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap.put(“model_column”,allColumns); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.entityTemplate, filePath, file, dataMap); } / * 生成mapper文件 */ private void generateMapperFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “Mapper.java”; String filePath = templatePathParam.getMapperPath(); String file = templatePathParam.getMapperPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.mapperTemplate, filePath, file, dataMap); } / * 生成xml映射文件 */ private void generateMapperXmlFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “Mapper.xml”; String filePath = templatePathParam.getMapperXmlPath(); String file = templatePathParam.getMapperXmlPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.mapperXmlTemplate, filePath, file, dataMap); } / * 生成业务接口层 */ private void generateServiceFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “Service.java”; String filePath = templatePathParam.getServicePath(); String file = templatePathParam.getServicePath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.serviceTemplate, filePath, file, dataMap); } / * 生成业务实现层 */ private void generateServiceImplFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “ServiceImpl.java”; String filePath = templatePathParam.getServiceImplPath(); String file = templatePathParam.getServiceImplPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.serviceImplTemplate, filePath, file, dataMap); } / * 生成控制层 */ private void generateControllerFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “Controller.java”; String filePath = templatePathParam.getControllerPath(); String file = templatePathParam.getControllerPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.controllerTemplate, filePath, file, dataMap); } / * 生成Vo类 */ private void generateEntityVoFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “Vo.java”; String filePath = templatePathParam.getEntityVoPath(); String file = templatePathParam.getEntityVoPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap.put(“model_column”,allColumns); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.entityVoTemplate, filePath, file, dataMap); } / * 生成Dto类 */ private void generateEntityDtoFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “Dto.java”; String filePath = templatePathParam.getEntityDtoPath(); String file = templatePathParam.getEntityDtoPath() + “\”+ StrUtil.changeTableStr(tableClass.getTableName()) + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap.put(“model_column”,allColumns); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.entityDtoTemplate, filePath, file, dataMap); } / * 生成Pom文件 */ private void generatePomFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “pom.xml”; String filePath = templatePathParam.getPomPath(); String file = templatePathParam.getPomPath() + “\” + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.pomTemplate, filePath, file, dataMap); } / * 生成application.yml文件 */ private void generateApplicationYmlFile(TableClass tableClass, List<ColumnClass> allColumns) throws Exception{ String suffix = “application.yml”; String filePath = templatePathParam.getApplicationYmlPath(); String file = templatePathParam.getApplicationYmlPath() + “\” + suffix; Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap = getCommonModel(dataMap, tableClass); generateFileByTemplate(TemplateConstant.applicationTemplate, filePath, file, dataMap); } / * 模版通用参数 * @param dataMap 模型map * @param tableClass 表名和表注释参数 * @return */ public Map<String,Object> getCommonModel(Map<String,Object> dataMap, TableClass tableClass){ dataMap.put(“table_name”, StrUtil.changeTableStr(tableClass.getTableName()));//TbUser dataMap.put(“table_name_small”,StrUtil.changeColumnStr(tableClass.getTableName()));//tbUser dataMap.put(“table”,tableClass.getTableName());//tb_user dataMap.put(“author”,templatePathParam.getAuthor()); dataMap.put(“date”,templatePathParam.getCurrentDate()); dataMap.put(“package_name”,templatePathParam.getPackageName()); dataMap.put(“project_name”,templatePathParam.getProjectName()); dataMap.put(“table_annotation”, StringUtils.isNotBlank(tableClass.getTableComment()) ? tableClass.getTableComment() : null); return dataMap; } / * 静态化方法 * @param templateName 模版名称 * @param filePathParam 文件所在目录 绝对路径 * @param fileParam 文件 绝对路径 * @param dataMap 数据模型 * @throws Exception */ private void generateFileByTemplate(final String templateName, String filePathParam, String fileParam, Map<String,Object> dataMap) throws Exception{ Template template = FreeMarkerTemplateUtils.getTemplate(templateName); System.out.println(fileParam); //文件夹不存在创建文件夹 File filePath = new File(filePathParam); if (!filePath.exists() && !filePath.isDirectory()) { filePath.mkdirs(); } //文件不存在创建文件夹 File file = new File(fileParam); if(!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } FileOutputStream fos = new FileOutputStream(file); Writer out = new BufferedWriter(new OutputStreamWriter(fos, “utf-8”),10240); template.process(dataMap,out); } }5 制作通用模版

在 resources/templates 目录下创建模版类

5.1 实体类模版package ${package_name}.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.ToString; import java.util.Date; import java.math.BigDecimal; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serializable; / * 描述:<#if table_annotation??>${table_annotation}模型</#if> * @author ${author} * @date ${date} */ @Data @ToString(callSuper = true) @TableName(${table}) public class ${table_name} implements Serializable { <#if model_column?exists> <#list model_column as model> / * ${model.columnComment!} */ <#if (model.columnType = BIGINT && model.columnName = id)> @TableId(${model.columnName?uncap_first}) private Long ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = BIGINT && model.columnName != id)> @TableField(${model.columnName?uncap_first}) private Long ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = INT || model.columnType = INT UNSIGNED || model.columnType = TINYINT || model.columnType = TINYINT UNSIGNED)> @TableField(${model.columnName?uncap_first}) private Integer ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = DECIMAL)> @TableField(${model.columnName?uncap_first}) private BigDecimal ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = VARCHAR || model.columnType = TEXT || model.columnType = CHAR)> @TableField(${model.columnName?uncap_first}) private String ${model.changeColumnName?uncap_first}; </#if> <#if model.columnType = TIMESTAMP || model.columnType = YEAR || model.columnType = DATE || model.columnType = DATETIME > @TableField(${model.columnName?uncap_first}) @JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”) private Date ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType != BIGINT && model.columnType != INT && model.columnType != DECIMAL && model.columnType != VARCHAR && model.columnType != TEXT && model.columnType != CHAR && model.columnType != TIMESTAMP && model.columnType != YEAR && model.columnType != DATE && model.columnType != DATETIME && model.columnType != INT UNSIGNED && model.columnType != TINYINT && model.columnType != TINYINT UNSIGNED)> @TableField(${model.columnName?uncap_first}) private MISS ${model.changeColumnName?uncap_first}; </#if> </#list> </#if> }5.2 Mapper模版package ${package_name}.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import ${package_name}.entity.${table_name}; import org.apache.ibatis.annotations.Mapper; / * 描述:<#if table_annotation??>${table_annotation}数据库连接层</#if> * @author ${author} * @date ${date} */ @Mapper public interface ${table_name}Mapper extends BaseMapper<${table_name}> { }5.3 Mapper映射文件模版<?xml version=”1.0″ encoding=”UTF-8″ ?> <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd” > <mapper namespace=“${package_name}.mapper.${table_name}Mapper”> </mapper>5.4 Service接口模版package ${package_name}.service; import ${package_name}.entity.${table_name}; import com.baomidou.mybatisplus.extension.service.IService; / * 描述:<#if table_annotation??>${table_annotation}服务实现层接口</#if> * @author ${author} * @date ${date} */ public interface ${table_name}Service extends IService<${table_name}>{ }5.5 Service实现类模版package ${package_name}.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import ${package_name}.entity.${table_name}; import ${package_name}.service.${table_name}Service; import ${package_name}.mapper.${table_name}Mapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; / * 描述:<#if table_annotation??>${table_annotation}服务实现层</#if> * @author ${author} * @date ${date} */ @Slf4j @Service public class ${table_name}ServiceImpl extends ServiceImpl<${table_name}Mapper, ${table_name}> implements ${table_name}Service{ }5.6 Controller模版package ${package_name}.http.controller; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.BeanUtils; import org.springframework.validation.annotation.Validated; import ${package_name}.entity.${table_name}; import ${package_name}.service.${table_name}Service; import ${package_name}.http.vo.${table_name}Vo; import ${package_name}.http.dto.${table_name}Dto; import java.util.List; / * 描述:<#if table_annotation??>${table_annotation}控制层</#if> * @author ${author} * @date ${date} */ @RestController @RequestMapping(“/${table_name_small}) public class ${table_name}Controller { @Autowired private ${table_name}Service ${table_name_small}Service; / * 查询所有 */ @GetMapping public List<${table_name}> list(){ return ${table_name_small}Service.list(); } / * 查询一个 */ @GetMapping(“/{id}”) public ${table_name} get(@PathVariable Long id){ return ${table_name_small}Service.getById(id); } / * 新增 */ @PostMapping public boolean save(@Validated @RequestBody ${table_name}Dto ${table_name_small}Dto){ ${table_name} ${table_name_small} = new ${table_name}(); BeanUtils.copyProperties(${table_name_small}Dto, ${table_name_small}); return ${table_name_small}Service.save(${table_name_small}); } / * 修改 */ @PutMapping public boolean update(@Validated @RequestBody ${table_name}Dto ${table_name_small}Dto){ ${table_name} ${table_name_small} = new ${table_name}(); BeanUtils.copyProperties(${table_name_small}Dto, ${table_name_small}); return ${table_name_small}Service.updateById(${table_name_small}); } / * 删除 * @param id * @return 是否成功 */ @DeleteMapping(“/{id}”) public boolean del(@PathVariable Long id){ return ${table_name_small}Service.removeById(id); } }5.7 实体类Vo模版package ${package_name}.http.vo; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.ToString; import java.math.BigDecimal; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; / * 描述:<#if table_annotation??>${table_annotation}模型</#if>Vo类 * @author ${author} * @date ${date} */ @Data @ToString(callSuper = true) public class ${table_name}Vo implements Serializable { <#if model_column?exists> <#list model_column as model> <#if (model.columnType = BIGINT && model.columnName = id)> @JsonSerialize(using = ToStringSerializer.class) private Long ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = BIGINT && model.columnName != id)> private Long ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = INT || model.columnType = INT UNSIGNED || model.columnType = TINYINT)> private Integer ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = DECIMAL)> private BigDecimal ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = VARCHAR || model.columnType = TEXT || model.columnType = CHAR)> private String ${model.changeColumnName?uncap_first}; </#if> <#if model.columnType = TIMESTAMP || model.columnType = YEAR || model.columnType = DATE || model.columnType = DATETIME > @JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”) private Date ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType != BIGINT && model.columnType != INT && model.columnType != VARCHAR && model.columnType != DECIMAL && model.columnType != TEXT && model.columnType != CHAR && model.columnType != TIMESTAMP && model.columnType != YEAR && model.columnType != DATE && model.columnType != DATETIME && model.columnType != INT UNSIGNED)> private MISS ${model.changeColumnName?uncap_first}; </#if> </#list> </#if> }5.8 实体类Dto模版package ${package_name}.http.dto; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.ToString; import java.math.BigDecimal; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.annotation.JsonFormat; / * 描述:<#if table_annotation??>${table_annotation}模型</#if>Dto类 * @author ${author} * @date ${date} */ @Data @ToString(callSuper = true) public class ${table_name}Dto implements Serializable { <#if model_column?exists> <#list model_column as model> <#if (model.columnType = BIGINT && model.columnName = id)> @JsonSerialize(using = ToStringSerializer.class) private Long ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = BIGINT && model.columnName != id)> private Long ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = INT || model.columnType = INT UNSIGNED || model.columnType = TINYINT)> private Integer ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = DECIMAL)> private BigDecimal ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType = VARCHAR || model.columnType = TEXT || model.columnType = CHAR)> private String ${model.changeColumnName?uncap_first}; </#if> <#if model.columnType = TIMESTAMP || model.columnType = YEAR || model.columnType = DATE || model.columnType = DATETIME > @JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”) private Date ${model.changeColumnName?uncap_first}; </#if> <#if (model.columnType != BIGINT && model.columnType != INT && model.columnType != VARCHAR && model.columnType != DECIMAL && model.columnType != TEXT && model.columnType != CHAR && model.columnType != TIMESTAMP && model.columnType != YEAR && model.columnType != DATE && model.columnType != DATETIME && model.columnType != INT UNSIGNED)> private MISS ${model.changeColumnName?uncap_first}; </#if> </#list> </#if> }5.9 pom文件模版<?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”> <modelVersion>4.0.0</modelVersion> <groupId>${package_name}</groupId> <artifactId>${project_name}</artifactId> <version>1.0-SNAPSHOT</version> <!– 继承Spring boot工程 –> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> </parent> <properties> <!– 项目源码及编译输出的编码 –> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!– 项目编译JDK版本 –> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <!– 依赖包版本管理 –> <spring.boot.version>2.3.9.RELEASE</spring.boot.version> <lombok.version>1.18.8</lombok.version> <mysql.version>5.1.46</mysql.version> <mybatis-plus.version>3.3.1</mybatis-plus.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${r”${mybatis-plus.version}”}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${r”${mysql.version}”}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${r”${lombok.version}”}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency> </dependencies> </project>5.10 application.yml文件模版server: port: ${r”${port:8888}”} spring: application: name: ${project_name} 6 测试

运行代码生成器入口类 CodeGenerateUtils

输出日志如下

D:appdevsJavajdk-11binjava.exe “-javaagent:D:appdevsJetBrainsIntelliJ IDEA 2018.2.4libidea_rt.jar=60577:D:appdevsJetBrainsIntelliJ IDEA 2018.2.4bin” -Dfile.encoding=UTF-8 -classpath D:heima技术文章itheima-codetargetclasses;D:appdevsapache-maven-3.3.9maven_repositoryorgfreemarkerfreemarker2.3.23freemarker-2.3.23.jar;D:appdevsapache-maven-3.3.9maven_repositorymysqlmysql-connector-java5.1.47mysql-connector-java-5.1.47.jar;D:appdevsapache-maven-3.3.9maven_repositoryorgprojectlomboklombok1.18.8lombok-1.18.8.jar;D:appdevsapache-maven-3.3.9maven_repositoryorgapachecommonscommons-lang33.10commons-lang3-3.10.jar freemarker.CodeGenerateUtils ——– 正在生成 undo_log 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityUndoLog.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperUndoLogMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperUndoLogMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceUndoLogService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplUndoLogServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerUndoLogController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoUndoLogVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoUndoLogDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_channel 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmChannel.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmChannelMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmChannelMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmChannelService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmChannelServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmChannelController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmChannelVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmChannelDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_fans_statistics 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmFansStatistics.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmFansStatisticsMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmFansStatisticsMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmFansStatisticsService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmFansStatisticsServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmFansStatisticsController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmFansStatisticsVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmFansStatisticsDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_material 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmMaterial.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmMaterialMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmMaterialMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmMaterialService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmMaterialServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmMaterialController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmMaterialVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmMaterialDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_news 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmNews.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmNewsMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmNewsMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmNewsService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmNewsServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmNewsController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmNewsVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmNewsDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_news_material 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmNewsMaterial.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmNewsMaterialMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmNewsMaterialMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmNewsMaterialService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmNewsMaterialServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmNewsMaterialController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmNewsMaterialVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmNewsMaterialDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_news_statistics 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmNewsStatistics.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmNewsStatisticsMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmNewsStatisticsMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmNewsStatisticsService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmNewsStatisticsServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmNewsStatisticsController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmNewsStatisticsVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmNewsStatisticsDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_sensitive 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmSensitive.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmSensitiveMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmSensitiveMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmSensitiveService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmSensitiveServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmSensitiveController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmSensitiveVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmSensitiveDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ——– 正在生成 wm_user 表相关文件—— 生成实体类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaentityWmUser.java 生成Mapper D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediamapperWmUserMapper.java 生成Mapper映射文件 D:heima技术文章代码itheima-wemediasrcmainresourcescomitheimawemediamapperWmUserMapper.xml 生成service接口 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceWmUserService.java 生成service实现类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediaserviceimplWmUserServiceImpl.java 生成Controller层文件 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpcontrollerWmUserController.java 生成vo类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpvoWmUserVo.java 生成dto类 D:heima技术文章代码itheima-wemediasrcmainjavacomitheimawemediahttpdtoWmUserDto.java 生成pom文件 D:heima技术文章代码itheima-wemediapom.xml 生成application.yml文件 D:heima技术文章代码itheima-wemediasrcmainresourcesapplication.yml ============ 全部生成完成! ============= Process finished with exit code 0

在idea中点击 File > open 打开 D:heima技术文章代码itheima-wemedia

自定义代码生成器(下)
自定义代码生成器(下)

免责声明:文章内容来自互联网,本站仅作为分享,不对其真实性负责,如有侵权等情况,请与本站联系删除。
转载请注明出处:自定义代码生成器(下) https://www.dachanpin.com/a/cyfx/11499.html

(0)
上一篇 2023-05-12 03:21:54
下一篇 2023-05-12 03:22:54

相关推荐

  • 成功创业经验分享,硅藻泥创业必看

    二、选择顺应趋势,有发展潜力的品牌 天然居作为一个有持续发展能力的品牌绝不会跟在别人背后亦步亦趋。天然居走差异化道路与别的品牌形成市场区隔,让竞争对手无从跟随,最终拥有更强的生命力,更高的市场价值! 硅藻泥行业虽然发展了将近十年,但行业为消费者熟知的知名品牌才能称之为渠道品牌。天然居硅藻泥被评为硅藻泥行业十大品牌,品牌实力强势。为加盟商的支持力度会更大,会更…

    创业分享 2023-06-01
    85
  • 博艺盛达钻石画丰富艺术气息 爱上生活爱上钻石画

    上一篇:滋趣冰淇淋加盟品牌,为你塑造潮流与美味   博艺盛达钻石画丰富艺术气息,爱上生活爱上钻石画。博艺盛达钻石画是北京博艺盛达国际贸易有限公司旗下经典品牌。公司成立于2011年7月。经过多年发展,博艺盛达钻石画系列产品以持续、特色、全面、有效的特性从根本上填补了国内手工艺术品的空白,先后通过了国家各专业机构的检测和认证,受到世界各方认识的欢迎。   博艺盛…

    创业分享 2023-05-21
    151
  • 创业板指数行上涨0.43% 创业板指数行情分析

      至诚财经网()12月11日讯   开盘沪指涨0.09%报2587.01点,深成指涨0.23%报7642.16点,创业板指涨0.43%报1332.52点。文化传媒、券商概念、次新股等板块上涨,贵金属、石油行业、天然气、雄安新区等板块的跌幅靠前,集合竞价两市9股涨停,6股跌停。   【机构策略】   湘财证券:12月10日市场直接低开,全天呈现明显的调整行情…

    创业分享 2023-05-13
    80
  • 创业点子在身边 你能想到 可是去做了吗? 15

    创业点子在身边 你能想到 可是去做了吗? 创业·人物   身边的同事突然辞职去创业了,你或许会想“他的项目这么不起眼,能行吗?”   有些在读大学生一边学习一边打游戏,可有的同学在创业,“市场已经定义了这种模式,难道你的想法会更好?”   9月15日,第四届失控大创赛决赛暨颁奖典礼举行,辽沈晚报《青创周刊》从大赛选取部分项目并配以专家点评,帮助大家一起理解创…

    创业分享 2023-05-21
    103
  • 腾讯设计师:为什么资讯APP 都长一个样?

      品牌推广就用这几招,七月活动立减500-1000元   腾讯MXD – Celine Wang :打开手机,国内的资讯 app 除了品牌 logo 外,几乎都长一个样。就如你敲开不同的门,发现房间不光装修风格一样,还住着品味雷同的主人。是什么造就了它们?   △ 资讯 app   资讯产品的本质是连接内容和用户。我们可以把当下的资讯 app 分为三类:内…

    创业分享 2023-05-22
    90

发表回复

登录后才能评论

联系我们

在线咨询: QQ交谈

邮件:362039258@qq.com

工作时间:周一至周五,9:30-16:30,节假日休息