• 一些记录


    代码生成器

    根据Mybatis generator(MBG)结合freemarker写了一个代码生成器,可以直接生成Controller,Service,Dao,bean,以及对应的mapper.xml文件。
    准备材料: 几个模板,mybatis-generator-core-1.3.2.jar。
    注意事项:各个公司的文件结构可能不尽相同,所以请根据实际情况自行采用。

    public class MapperGeneratorTest {
        /**
         *
         */
        private static final String BASEPATH = "C:\tmp\generator\";
        // 获取项目路径
        private static final String ROOTPATH = System.getProperty("user.dir") + "/src/main";
    
        private final String WEBPATH = "这里写上你生成文件的上一级目录";
    
        /**
         * 一键生成
         */
        @Test
        public void generateTest() {
            // 要生成的bean
            String[] entities = new String[]{"value"};
            // 对应的表
            String[] tables = new String[]{"value"};
            // Mapper.java文件路径
            String path = ROOTPATH + WEBPATH + "*/dao/mapper/?Mapper.java";
            // baseMapper全限定名
            String baseMapperQfName = "这里写上baseMapper的全限定名";
            generate(entities, tables, path, baseMapperQfName);
        }
    
        /**
         * 生成Controller,Service, Mapper,xml,bean及其实现
         *
         * @param entities         bean数组
         * @param tables           生成的表数组
         * @param mapperPath       *的位置代表entity, ?代表对于的大写格式
         * @param baseMapperQfName baseMapper全限定名
         */
        private void generate(String[] entities, String[] tables, String mapperPath, String baseMapperQfName) {
            for (int i = 0; i < entities.length; i++) {
                System.err.println("==================开始执行第" + (i + 1) + "次=====================");
                String entity = entities[i];
                // 生成好对应的xml文件
                generateForOne(entity, tables[i]);
                // 如果basePath不存在的话则创建
                File file = new File(BASEPATH);
                if (!file.exists()) {
                    file.mkdirs();
                }
                // 首先写好要运行的bat文件
                writeBat(entity, BASEPATH + entity + ".bat");
                String path = mapperPath.replace("*", entity).replace("?", StringUtil.capitalize(entity));
    
                processMapper(path, entity, baseMapperQfName, !new File(path).exists());
                generateCtrSerDao(entity);
                System.err.println("==================结束执行第" + (i + 1) + "次=====================");
            }
        }
    
        /**
         * 执行bat命令
         *
         * @param batPath bat文件路径
         */
        private Process runCmd(String batPath) {
            Process process = null;
            try {
                process = Runtime.getRuntime().exec("cmd /c C: && start " + batPath);
    //            InputStream input = process.getInputStream();
    //            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
    //            String szline;
    //            while ((szline = reader.readLine())!= null) {
    //                System.out.println(szline);
    //            }
    //            reader.close();
                process.waitFor();
                if (process.exitValue() == 0) {
                    System.err.println("执行bat命令成功");
                }
                // 执行成功之后再destroy
                process.destroy();
                // 执行完毕,关闭本窗口
                Runtime.getRuntime().exec("cmd.exe /C start wmic process where name='cmd.exe' call terminate");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return process;
        }
    
        /**
         * 将命令写入bat文件
         *
         * @param entityName 实体名字
         * @param path       生成bat的路径
         */
        private void writeBat(String entityName, String path) {
            String cmd = "java -jar C:\tmp\mybatis-generator-core-1.3.2.jar -configfile C:\tmp\xml\" + entityName + ".xml -overwrite";
            FileOutputStream fileOutputStream = null;
            try {
                fileOutputStream = new FileOutputStream(new File(path));
                fileOutputStream.write(cmd.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                StreamUtil.close(fileOutputStream);
            }
        }
    
        // 根据模板生成对应的xml
        private void generateForOne(String entityName, String tableName) {
            String outputPath = "C:\tmp\xml";
            if (!new File(outputPath).exists()) {
                boolean createDirectoryFlag = new File(outputPath).mkdirs();
                if (!createDirectoryFlag) {
                    System.err.println("========Danger: mkdirs() error!=========");
                }
            }
            // 获取对应的版本配置
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_21);
            String ftlPath = ROOTPATH + "\resources\freemarker";
            File ftlFilePath = new File(ftlPath);
            try {
                // 设置模板文件上级路径
                configuration.setDirectoryForTemplateLoading(ftlFilePath);
                configuration.setDefaultEncoding("UTF-8");
                // 设置异常处理器
                configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
                // 构建数据模型
                Map<String, Object> dataMap = new HashMap<>();
                dataMap.put("entity", entityName);
                dataMap.put("domain", StringUtil.capitalize(entityName));
                // 解决不规范命名问题
                dataMap.put("table", tableName);
    
                // 获取模板
                Template generatorTemplate = configuration.getTemplate("mapper-generator.ftl");
                // 设置输出路径
                FileOutputStream fileOutputStream = new FileOutputStream(outputPath + File.separator + entityName + ".xml");
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
                generatorTemplate.process(dataMap, outputStreamWriter);
    
            } catch (IOException | TemplateException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 处理mapper.java文件
         *
         * @param path             mapper.java所在路径
         * @param entityName
         * @param baseMapperQfName
         * @param flag             是否是第一次生成
         */
        private void processMapper(String path, String entityName, String baseMapperQfName, boolean flag) {
    
            String backFileName = path + "_backup";
            if (!flag) {
                // 首先备份原来的mapper文件
                FileUtil.copyFile(path, backFileName);
            }
            Process process = runCmd(BASEPATH + entityName + ".bat");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String mapperContent = getMapperContent(path, entityName, baseMapperQfName, flag);
    //        System.err.println("生成的Mapper.java文件内容为: 
    " + mapperContent);
            // 将修改后的mapper写入文件
            FileUtil.writeToFile(path, mapperContent);
            File backFile = new File(backFileName);
            if (backFile.exists()) {
                boolean delete = backFile.delete();
                if (!delete) {
                    System.err.println("删除" + backFileName + "失败!");
                }
            }
    
        }
    
        /**
         * 第一次生成, 返回自动产生Mapper文件中的内容,
         * 非首次生成, 保存原来Mapper.java文件中的方法, 如果未继承BaseMapper, 则处理为继承BaseMapper
         *
         * @param path             mapper.java 路径
         * @param entityName       beanName
         * @param baseMapperQfName baseMapper全限定名
         * @param flag             是否是第一次生成
         * @return 返回生成的Mapper中的String内容
         */
        private String getMapperContent(String path, String entityName, String baseMapperQfName, boolean flag) {
            // Mapper.java文件路径
            String domainName = StringUtil.capitalize(entityName);
            String url = path + (flag ? "" : "_backup");
            String separator = System.getProperty("line.separator");
            // 存储改动过后的string
            StringBuilder buffer = new StringBuilder();
            FileInputStream fis = null;
            InputStreamReader reader = null;
            BufferedReader bufferedReader = null;
            try {
                fis = new FileInputStream(new File(url));
                reader = new InputStreamReader(fis);
                bufferedReader = new BufferedReader(reader);
                String str;
                while ((str = bufferedReader.readLine()) != null) {
                    // 已经import了BaseMapper跳过
                    if (str.contains("mapper.BaseMapper")) continue;
                    // 如果是第一次生成的话
                    if (str.contains("interface")) {
                        buffer.append("import ").append(baseMapperQfName).append(";");
                        // 插入系统的换行符
                        buffer.append(separator);
                        // 格式处理, import 和interface之间添加空行
                        buffer.append(separator);
                        // 处理存在Mapper文件, 但是没有抽取继承的情况
                        if (!str.contains("extends BaseMapper")) {
                            String changedText = str.replace(domainName + "Mapper", domainName + "Mapper extends BaseMapper<" + domainName + ">");
                            buffer.append(changedText);
                        }
                        if (flag) {
                            buffer.append(separator);
                            buffer.append("}");
                            break;
                        }
                    }
    
                    buffer.append(str);
                    buffer.append(separator);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                StreamUtil.close(bufferedReader, reader, fis);
            }
            return buffer.toString();
        }
    
        /**
         * 生成controller,service,dao
         *
         * @param entityName beanName
         */
        private void generateCtrSerDao(String entityName) {
            // 所有模板
            String[] templateNames = new String[]{"BeanController.ftl", "IBeanService.ftl", "BeanServiceImpl.ftl", "IBeanDao.ftl", "BeanDaoImpl.ftl"};
            String[] paths = new String[]{"controller/", "service", "service/impl", "dao", "dao/impl"};
            String[] names = new String[]{"Controller", "Service", "ServiceImpl", "Dao", "DaoImpl"};
            String domainName = StringUtil.capitalize(entityName);
    
            // 获取对应的版本配置
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_21);
            String ftlPath = ROOTPATH + "\resources\freemarker";
            File ftlFilePath = new File(ftlPath);
            FileOutputStream fileOutputStream = null;
            OutputStreamWriter outputStreamWriter = null;
            try {
                // 设置模板文件上级路径
                configuration.setDirectoryForTemplateLoading(ftlFilePath);
                configuration.setDefaultEncoding("UTF-8");
                // 设置异常处理器
                configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
                // 构建数据模型
                Map<String, Object> dataMap = new HashMap<>();
                dataMap.put("entity", entityName);
                dataMap.put("domain", domainName);
    
                for (int i = 0; i < templateNames.length; i++) {
                    String currFtl = templateNames[i];
                    // 获取模板
                    Template generatorTemplate = configuration.getTemplate(currFtl);
                    // 设置输出路径
                    String outputPath = ROOTPATH + WEBPATH + entityName + "/" + paths[i] + "/" + (i % 2 == 0 ? (domainName + names[i]) : ("I" + domainName + names[i])) + ".java";
                    File file = new File(outputPath);
                    // 判断一下是否对应的文件是否已经存在,存在的话,不进行替换
                    if (file.exists()) {
                        System.err.println("[" + outputPath + "]" + "已经存在, 不替换");
                        continue;
                    }
                    File parentFile = file.getParentFile();
                    if (!parentFile.exists()) {
                        boolean createDirectoryFlag = parentFile.mkdirs();
                        if (!createDirectoryFlag) {
                            System.err.println("========Danger: mkdirs() error!=========");
                        }
                    }
                    fileOutputStream = new FileOutputStream(outputPath);
                    outputStreamWriter = new OutputStreamWriter(fileOutputStream);
                    generatorTemplate.process(dataMap, outputStreamWriter);
                    System.err.println("-----" + outputPath + "生成成功" + "-----");
                }
            } catch (IOException | TemplateException e) {
                e.printStackTrace();
            } finally {
                // 关闭流
                StreamUtil.close(outputStreamWriter, fileOutputStream);
            }
        }
    
    }
    

    时间展示处理

    这里仅处理两种不同的日期显示格式,如果有需要执行配置即可

    public class JsonObjectMapper extends ObjectMapper {
        private static final long serialVersionUID = 1L;
    
        public JsonObjectMapper() {
            super();
            // 空值处理为空串 
            this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
                @Override
                public void serialize(Object value, JsonGenerator jg, SerializerProvider sp) throws IOException {
                    jg.writeString("");
                }
            });
    
            //设置JSON时间格式
            SimpleModule module = new SimpleModule();
            module.addSerializer(Date.class, new JsonSerializer<Date>() {
                @Override
                public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String zero = "00:00:00";
                    if (zero.equals(sdf.format(value).split(" ")[1])) {
                        sdf = new SimpleDateFormat("yyyy-MM-dd");
                    }
                    jgen.writeString(sdf.format(value));
                }
            });
            this.registerModule(module);
        }
    
    
    }
    

    同时在spingmvc配置文件中配置:

    <mvc:annotation-driven>
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                        <bean class="这里写JsonObjectMapper全限定名"></bean>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
    当你准备好了,机会来临的时候,你才能抓住
  • 相关阅读:
    iOS自动化测试环境搭建总结
    Python合成多个视频为一个脚本
    Python复制单个文件为多个脚本
    量化投资对于数据源、回测、实盘平台的选择
    使用蒙特卡罗模拟期权定价
    JavaScript 中 call()、apply()、bind() 的用法
    Separate MW and UI
    How to add lintstaged to your react project
    MSSQL语法笔记
    数据库索引失效七字口诀
  • 原文地址:https://www.cnblogs.com/studentytj/p/9328654.html
Copyright © 2020-2023  润新知