1、CRUD代码生成:
根据MyBatisPlus逆向工程改造而来,添加了showDoc文档生成,数据库脚本生成,增删改查文件生成,Po、Vo、Request对象生成等。普通的增删改查一般搞定。并预调了部份判断逻辑。
效果示例:
public class AddHandingPortionAdjustLogic implements ContextLogic<HandingPortionAdjustUpdateRequest> {@Autowiredprivate HandingPortionAdjustMapper handingPortionAdjustMapper;@Overridepublic void handleContext(HandingPortionAdjustUpdateRequest context) {HandingPortionAdjust handingPortionAdjust = context.getForm();if (null == handingPortionAdjust ) {throw new LocalException("调整记录参数不能为空");}handingPortionAdjustMapper.insert(handingPortionAdjust );}
}
2、Excel导入导出代码生成:
无他,拼字符串拼成文件,哈哈。
public class ExcelGenUtil {private final static Class<?> aClass = CppccMemberBackup.class;public static void main(String[] args) {String name = ZYStrUtils.firstLowerCase(aClass.getSimpleName());String supperName = ZYStrUtils.firstUpperCase(name);GenParam genParam = new GenParam();genParam.setAuthor("simple");genParam.setFileBaseDir("D:\\codeGen");genParam.setResponseFileName("用户");genParam.setExcelEntityPackageName("com.xxx.module.user.logics." + name + ".excel");genParam.setMapperPackageName("com.xxx.module.user.mapper." + supperName + "Mapper");genParam.setRequestPackageName("com.xxx.module.user.logics." + name + ".request." + supperName + "SelectRequest");genParam.setAClass(aClass);Generator.gen(genParam);}
}public static void gen(GenParam genParam) {ExcelExportGenerator.generateExcelModel(genParam);ExcelImportGenerator.generateExcelModel(genParam);ExcelExportModelGenerator.generateExcelModel(genParam);ExcelImportModelGenerator.generateExcelModel(genParam);System.out.println("生成完毕");}
3、脚本生成:
无他,拼字符串也。哈哈
public static String INSERT_SQL = "INSERT INTO xxx (id,table_id,join_table_id,column_name,column_comment,column_type,column_places,java_name,is_show,show_width,is_query,is_querydefault,dict_type)" +"VALUES ('%s_%s','%s','','%s','%s','%s','column_places','%s',0,100,0,0,'%s');";public static void main(String[] args) {tableIds="xxx";String properties = "name";String propertiesName = "xx名称";String propertiesType = "string";String dictType = "";List<String> tableIdList = ZYListUtils.str2List(tableIds);List<String> sqls = new ArrayList<>();for (String tableId : tableIdList) {sqls.add(buildSql(tableId, properties, propertiesName, propertiesType, dictType));}String now = ZYDateUtils.formart(new Date(), "yyyy-MM-dd-HH-mm-ss");ZYFileUtils.writeLines(sqls, "D://form_coustom_sql" + now + ".sql", "UTF-8", true);}private static String buildSql(String tableId, String properties, String columnName, String type, String dictType) {String column = ZYStrUtils.camelToUnderline(properties);return String.format(INSERT_SQL, tableId, column, tableId, column, columnName, type, properties, dictType);}
}
4、get set this 代码生成:
无他,拼字符串尔,哈哈
public static <T> void writeSomeEasy(Class<T> clst, WriteType writeType) {Field[] declaredFields = clst.getDeclaredFields();StringBuilder sb = new StringBuilder();String clasName = clst.getSimpleName();String newObj = clasName + " " + ZYStrUtils.firstLowerCase(clasName) + "= new " + clasName + "();";sb.append(newObj).append("\r\n");for (Field field : declaredFields) {String fieldName = field.getName();if ("serialVersionUID".equals(fieldName)) {continue;}String objectName = ZYStrUtils.firstLowerCase(clst.getSimpleName());String simpleName = field.getType().getSimpleName();String text = getTestByFields(writeType, fieldName, simpleName, objectName);sb.append(text).append("\r\n");}System.out.println(sb.toString());}private static String getTestByFields(WriteType writeType, String fieldName, String typeName, String key) {switch (writeType) {case doc_param:// |id|否|string|id|return "|" + fieldName + " |否 |" + typeName + " |" + fieldName + " |";case doc_result:// |id|string|id|return "|" + fieldName + " |" + typeName + " |" + fieldName + " |";case str_json_get_str:// String id=model.getString("id");return "String " + fieldName + "= " + key + ".getString(\"" + fieldName + "\");";case set_model:// model.setId(id);return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(" + fieldName + ");";case set_model_withmap:// model.setId(id);return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(importMap.getString(\"\"));";case get_set:// model.setId(model.getId());return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(" + key + ".get"+ ZYStrUtils.firstUpperCase(fieldName) + "());";case this_get_set:// model.setId(this.id);return key + ".set" + ZYStrUtils.firstUpperCase(fieldName) + "(this." + fieldName + ");";case this_set:// this.id=model.getId();return "this." + fieldName + "=" + key + ".get" + ZYStrUtils.firstUpperCase(fieldName) + "();";case type_get:// String id=model.getId();return typeName + " " + fieldName + " = " + key + "." + "get" + ZYStrUtils.firstUpperCase(fieldName)+ "();";default:break;}return null;}public static enum WriteType {doc_param, doc_result, str_json_get_str, set_model, get_set, this_get_set, this_set, type_get, set_model_withmap,url_param;}
5、ShowDoc文档生成
无他,拼字符串尔,哈哈
public static void toJsonParam(Class<?> oneClass) throws Exception {Map<String, Field> fieldMap = ZYReflectUtils.getFieldMap(oneClass);Map<String, String> map = new HashMap<>();fieldMap.forEach((name, field) -> {final ColumnName columnName = field.getAnnotation(ColumnName.class);String desc = null != columnName ? columnName.value() : field.getName();map.put(field.getName(), desc + "#(" + field.getType().getSimpleName() + ")");});String string = JSONObject.toJSONString(map);System.out.println(string);}//|groupid |int |用户组id,1:超级管理员;2:普通用户 |public static void toShowDocResult(Class<?> oneClass) throws Exception {Map<String, Field> fieldMap = ZYReflectUtils.getFieldMap(oneClass);fieldMap.forEach((name, field) -> {final ColumnName columnName = field.getAnnotation(ColumnName.class);String desc = null != columnName ? columnName.value() : field.getName();String doc = "|%s |%s|%s|";String format = String.format(doc, name, field.getType().getSimpleName(), desc);System.out.println(format);});}
}
6、项目文档需要采集数千行源代码。需要一个个文件打开复制的解决办法
public class CollectCodeDemo {public static void main(String[] args) {// 工程目录String dir = "D:\\javacode\\xxx\\xxx\\module-consult\\future-module-consult-service";// 需要的代码行数String outDir = "D:\\doc\\code.txt";projectCodeCollect(dir, 5000, outDir);}@SneakyThrowspublic static void projectCodeCollect(String dir, int line, String outDir) {List<String> contents = new ArrayList<>();projectCodeCollect(contents, new File(dir), line);ZYFileUtils.writeLines(contents, new File(outDir), "UTF-8", true);}private static void projectCodeCollect(List<String> contents, File dir, int line) {if (contents.size() >= line) {return;}File[] files = dir.listFiles();if (null == files || files.length == 0) {return;}for (File fileItem : files) {if (fileItem.isDirectory()) {projectCodeCollect(contents, fileItem, line);} else {String name = fileItem.getName();if (!name.endsWith(".java")) {continue;}try (FileInputStream fileInputStream = new FileInputStream(fileItem)) {List<String> lines = IOUtils.readLines(fileInputStream, "UTF-8");contents.addAll(lines);} catch (Exception e) {e.printStackTrace();}}}}
}
除去MybatisPlus逆向工程需要掌屋一些velocity或freemarker的部份语法外。其他生成工具基本都是拼接字符串生成java或其他类型文档。不是很难。关键是思路问题。当一件事件具备有规律可循、大量、重复、费时、体力劳动时,就要思考会不会有更简单的办法。有的程序员早九晚五下班,有的程序员天天加班,这就是差距。人家输入几个参数生成一大堆模板文件。随便改改套套,OK搞定。有的重复着大量的体力劳动。一行一行写脚本,一个个字母写文件。仅以此文为引子。提供一种让工作更轻松,少加班的思路。