代码自动生成-代码自动生成模块-Saas多租户平台开发
目录
文章目录
内容
1、代码自动生成
Java后端代码开发,基于MVC思想,通常划分controller、service、dao模块,再加上表、mapper.xml等等,创建过程固定而繁琐,那么当我们设计好数据表之后,能不能自动生成对应的controller、service、dao以及dao.xml呢?
答案是肯定的,这里我用的自动代码生成为移植自renxxx-security,使用效果及步骤如下:
-
模块结构图:
-
使用步骤:
-
运行模块,web页面如图:
-
选中表,点击生成代码,如图:
-
解压打包文件,复制代码放入相应包中,如图:
-
2、简单分析
-
实现步骤:
- 获取表信息
- 通过sql获取表信息自行查询相关文档
- 获取字段信息
- 读取application.yml配置信息
- 封装表实体类
- 表名转换java实体类名
- 封装列实体类信息,放入列表
- 字段类型转换为java数据类型
- 判断和封装主键
- 特殊类型转换
- Velocity资源加载器
- 封装模板数据
- VelocityContext
- 获取模板列表
- 渲染模板并生成文件
- 添加压缩文件并下载
- 获取表信息
-
自动生成代码主要逻辑代码如下:
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 // 前端后台管理系统