代码自动生成-代码自动生成模块-Saas多租户平台开发

代码自动生成-代码自动生成模块-Saas多租户平台开发


目录




内容

1、代码自动生成

Java后端代码开发,基于MVC思想,通常划分controller、service、dao模块,再加上表、mapper.xml等等,创建过程固定而繁琐,那么当我们设计好数据表之后,能不能自动生成对应的controller、service、dao以及dao.xml呢?

答案是肯定的,这里我用的自动代码生成为移植自renxxx-security,使用效果及步骤如下:

  • 模块结构图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-liraAJ3Z-1605515381122)(./images/2020-11-16_structure.png)]

  • 使用步骤:

    1. 运行模块,web页面如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dyhAw4sr-1605515381175)(./images/2020-11-16_generator-index.png)]

    2. 选中表,点击生成代码,如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BBXM0msY-1605515381180)(./images/2020-11-16_pack.png)]

    3. 解压打包文件,复制代码放入相应包中,如图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OKblKL7-1605515381182)(./images/2020-11-16_pack-code.png)]

2、简单分析

  • 实现步骤:

    1. 获取表信息
      • 通过sql获取表信息自行查询相关文档
    2. 获取字段信息
    3. 读取application.yml配置信息
    4. 封装表实体类
      • 表名转换java实体类名
    5. 封装列实体类信息,放入列表
      • 字段类型转换为java数据类型
      • 判断和封装主键
      • 特殊类型转换
    6. Velocity资源加载器
    7. 封装模板数据
      • VelocityContext
    8. 获取模板列表
    9. 渲染模板并生成文件
    10. 添加压缩文件并下载
  • 自动生成代码主要逻辑代码如下:

      public static void generatorCode(Map<String, String> table,
      									 List<Map<String, String>> columns, ZipOutputStream zip) {
      		//配置信息
      		Configuration config = getConfig();
      		boolean hasBigDecimal = false;
      		//表信息
      		TableEntity tableEntity = new TableEntity();
      		tableEntity.setTableName(table.get("tableName"));
      		tableEntity.setComments(table.get("tableComment"));
      		//表名转换成Java类名
      		String className = tableToJava(tableEntity.getTableName(), config.getString("tablePrefix"));
      		tableEntity.setClassName(className);
      		tableEntity.setClassname(StringUtils.uncapitalize(className));
    
      		//列信息
      		List<ColumnEntity> columsList = new ArrayList<>();
      		for (Map<String, String> column : columns) {
      			ColumnEntity columnEntity = new ColumnEntity();
      			columnEntity.setColumnName(column.get("columnName"));
      			columnEntity.setDataType(column.get("dataType"));
      			columnEntity.setComments(column.get("columnComment"));
      			columnEntity.setExtra(column.get("extra"));
    
      			//列名转换成Java属性名
      			String attrName = columnToJava(columnEntity.getColumnName());
      			columnEntity.setAttrName(attrName);
      			columnEntity.setAttrname(StringUtils.uncapitalize(attrName));
    
      			//列的数据类型,转换成Java类型
      			String attrType = config.getString(columnEntity.getDataType(), "unknowType");
      			columnEntity.setAttrType(attrType);
      			if (!hasBigDecimal && attrType.equals("BigDecimal")) {
      				hasBigDecimal = true;
      			}
      			//是否主键
      			if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) {
      				tableEntity.setPk(columnEntity);
      			}
    
      			columsList.add(columnEntity);
      		}
      		tableEntity.setColumns(columsList);
    
      		//没主键,则第一个字段为主键
      		if (tableEntity.getPk() == null) {
      			tableEntity.setPk(tableEntity.getColumns().get(0));
      		}
    
      		//设置velocity资源加载器
      		Properties prop = new Properties();
      		prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
      		Velocity.init(prop);
    
      		String mainPath = config.getString("mainPath");
      		mainPath = StringUtils.isBlank(mainPath) ? "com.ihrm" : mainPath;
    
      		//封装模板数据
      		Map<String, Object> map = new HashMap<>();
      		map.put("tableName", tableEntity.getTableName());
      		map.put("comments", tableEntity.getComments());
      		map.put("pk", tableEntity.getPk());
      		map.put("className", tableEntity.getClassName());
      		map.put("classname", tableEntity.getClassname());
      		map.put("pathName", tableEntity.getClassname().toLowerCase());
      		map.put("columns", tableEntity.getColumns());
      		map.put("hasBigDecimal", hasBigDecimal);
      		map.put("mainPath", mainPath);
      		map.put("package", config.getString("package"));
      		map.put("moduleName", config.getString("moduleName"));
      		map.put("author", config.getString("author"));
      		map.put("email", config.getString("email"));
      		map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN));
      		VelocityContext context = new VelocityContext(map);
    
      		//获取模板列表
      		List<String> templates = getTemplates();
      		for (String template : templates) {
      			//渲染模板
      			StringWriter sw = new StringWriter();
      			Template tpl = Velocity.getTemplate(template, "UTF-8");
      			tpl.merge(context, sw);
    
      			try {
      				//添加到zip
      				zip.putNextEntry(new ZipEntry(getFileName(template, tableEntity.getClassName(), config.getString("package"), config.getString("moduleName"))));
      				IOUtils.write(sw.toString(), zip, "UTF-8");
      				IOUtils.closeQuietly(sw);
      				zip.closeEntry();
      			} catch (IOException e) {
      				throw new RRException("渲染模板失败,表名:" + tableEntity.getTableName(), e);
      			}
      		}
      	}
    
  • 关于模板内容,包路径等等可根据需要自行修改。

如需完整模块代码可自行查询相关文档或者联系本人或者去本人gitee仓库下载。
下面正式进入业务逻辑相关模块。

后记

本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785

后端JAVA源代码地址:https://gitee.com/gaogzhen/ihrm-parent    // 后端项目
前端项目源代码地址:https://gitee.com/gaogzhen/ihrm-vue    // 前端后台管理系统

猜你喜欢

转载自blog.csdn.net/gaogzhen/article/details/109723749