Mybatis-plus之代码生成器

2021-08-21  本文已影响0人  指尖行动

先上官方配置文档
https://mp.baomidou.com/config/generator-config.html#controllername

目的:mybatis-plus自定义模板生成;mybatis-plus修改默认模板

pom

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.4.0</version>
            </dependency>
   
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>2.3</version>
            </dependency>

废话不多,直接上类,代码习惯不好,大家将就着看,怎么养成好习惯,欢迎大家批评指正

MyBatisGenerator.java

scanner方法封装一下

// 摘自官方,稍加改动
public static String scanner(String tip,String defaultValue) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("(按q退出)请输入" + tip + ":"+ (!StringUtils.isNotBlank(defaultValue) ? "" : "(默认值="+defaultValue+")"));
        System.out.println(help.toString());
        if (scanner.hasNextLine()) {
            String ipt = scanner.nextLine();
            if(ipt.equals("q")){
                System.exit(1);
            }
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }else if (StringUtils.isNotBlank(defaultValue)){
                return defaultValue;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

生成器配置,代码很长,,自己看吧。。。抱歉咯

public static void generator(){
        // 1 参数定义
        String projectName = "demo";
        String isOverrideStr = "y";
        String dbName = "oauth";
        String dbUser = "root";
        String dbPwd = "322103";
        String tableNames = "*";// *号全部
        String isCreateEntity = "y";
        String isCreateDaoAndProvider = "y";
        String isCreateDaoOrProvider = "d";// d/p
        String isCreateService = "y";
        String isCreateController = "y";
        String serviceName = "";
        String camelCaseServiceName = "";
        String upperCamelCaseServiceName = "";

        // 2 提示
        System.out.println("--------------------------------------------------------");
        System.out.println("|代码生成器:请检查代码生成参数                               |");
        System.out.println("|项目名(maven多模块自动生成到项目之下):"+projectName);
        System.out.println("|覆盖已有文件:"+isOverrideStr);
        System.out.println("|数据库:"+dbName);
        System.out.println("|用户名:"+dbUser);
        System.out.println("|密码:"+dbPwd);
        System.out.println("|表名:"+tableNames);
        System.out.println("|实体开关:"+isCreateEntity);
        System.out.println("|dao层开关:"+isCreateDaoAndProvider);
        System.out.println("|生成dao层还是provider层:"+isCreateDaoOrProvider);
        System.out.println("|service层开关:"+isCreateService);
        System.out.println("|controller开关:"+isCreateController);
        System.out.println("--------------------------------------------------------");

        // 3 全局参数询问
        String projectPath = System.getProperty("user.dir");
        if(scanner("是否按照以上参数执行?(y/n)","y").equals("n")){
            projectName = scanner("请输入项目名称",projectName);
            isOverrideStr = scanner("是否覆盖已有文件(y/n)",isOverrideStr);
            dbName = scanner("请输入数据库名称(默认localhost:3306)",dbName);
            dbUser = scanner("请输入db用户名",dbUser);
            dbPwd = scanner("请输入db密码",dbPwd);
            tableNames = scanner("请输入需要生成的表名,多表用逗号分隔,全部生成请输入[*]",tableNames);
            isCreateEntity = scanner("是否生成entity (y/n)",isCreateEntity);
            isCreateDaoAndProvider = scanner("是否生成dao或provider文件(y/n)",isCreateDaoAndProvider);
            isCreateDaoOrProvider = scanner("生成Provider还是Dao文件? p/d",isCreateDaoOrProvider);
            if(isCreateDaoOrProvider.equals("p")) {
                serviceName = scanner("请输入服务名",serviceName);
                camelCaseServiceName = StrKit.toCamelCase(serviceName);
                camelCaseServiceName = StrKit.toCamelCase(serviceName,"-");
                upperCamelCaseServiceName = camelCaseServiceName.substring(0, 1).toUpperCase() + camelCaseServiceName.substring(1);
                isCreateService = "n";
            }else{
                isCreateService = scanner("是否生成service及其实现 (y/n)",isCreateService);
            }
            isCreateController = scanner("是否生成controller (y/n)",isCreateController);
        }

        // 4 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(projectPath+ File.separator+ projectName + "/src/main/java");
        gc.setAuthor("zl");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(isOverrideStr.equals("y")); //重新生成时文件是否覆盖
        gc.setServiceName("%sService"); //去掉Service接口的首字母I
        gc.setIdType(IdType.ASSIGN_ID); //主键策略
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式
        gc.setXmlName("%sMapper");
        gc.setMapperName("%sDao");
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);

        // 5 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/"+dbName+"?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername(dbUser);
        dsc.setPassword(dbPwd);
        dsc.setDbType(DbType.MYSQL);


        // 6 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(null); //模块名
        pc.setParent("com.soul");
        pc.setController("rest");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("dao");
        pc.setXml("dao.mapper");


        // 7 策略配置
        StrategyConfig strategy = new StrategyConfig();
        if(!tableNames.trim().equals("*")){
            strategy.setInclude(tableNames.split(","));//对那一张表生成代码
        }
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
        strategy.setSuperControllerClass("com.soul.base.BaseController");
        strategy.setSuperEntityClass("com.soul.entity.po.BasePO");
        strategy.setSuperEntityColumns("id","create_by","create_dept_path","create_date","update_by","update_dept_path","update_date");
        strategy.setEntityTableFieldAnnotationEnable(true);
        strategy.setTablePrefix("t_","v_","b_");
        strategy.setLogicDeleteFieldName("enables");
        strategy.setChainModel(true);
        strategy.setEntityBooleanColumnRemoveIsPrefix(true);


        // 8 InjectionConfig 设置 自定义模板,以及替换官方模板
        InjectionConfig config = null;
        if(isCreateDaoAndProvider.equals("y") && isCreateDaoOrProvider.equals("p")){
            pc.setMapper("provider");
            pc.setXml("provider.fallback");
            String finalServiceName = serviceName;
            String finalCamelCaseServiceName = camelCaseServiceName;
            String finalUpperCamelCaseServiceName = upperCamelCaseServiceName;
            config = new InjectionConfig() {
                @Override
                public void initMap() {
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("serviceName", finalServiceName);
                    // ServiceName 去下划线 _或- ,转驼峰,首字母大写,

                    map.put("camelCaseServiceName", finalCamelCaseServiceName);
                    map.put("upperCamelCaseServiceName", finalUpperCamelCaseServiceName);
                    this.setMap(map);
                }
            };
            config.setFileOutConfigList(new ArrayList<>());
            String finalProjectName = projectName;
            FileOutConfig providerFile = new FileOutConfig("/templates/provider.java.vm") {
                @Override
                public String outputFile(TableInfo tableInfo) {
                    return projectPath+ File.separator+ finalProjectName + "/src/main/java"+File.separator + "com/soul/provider/"+(finalUpperCamelCaseServiceName) + "Provider.java";
                }
            };
            config.getFileOutConfigList().add(providerFile);
            String finalProjectName2 = projectName;
            FileOutConfig serviceFile = new FileOutConfig("/templates/_service.java.vm") {
                @Override
                public String outputFile(TableInfo tableInfo) {
                    return projectPath+ File.separator+ finalProjectName2 + "/src/main/java"+File.separator + "com/soul/service/"+finalUpperCamelCaseServiceName + "Service.java";
                }
            };
            config.getFileOutConfigList().add(serviceFile);
            String finalProjectName3 = projectName;
            FileOutConfig serviceImplFile = new FileOutConfig("/templates/_serviceimpl.java.vm") {
                @Override
                public String outputFile(TableInfo tableInfo) {
                    return projectPath+ File.separator+ finalProjectName3 + "/src/main/java"+File.separator + "com/soul/service/impl/"+finalUpperCamelCaseServiceName + "ServiceImpl.java";
                }
            };
            config.getFileOutConfigList().add(serviceImplFile);
        }




        // 9 TemplateConfig设置
        TemplateConfig templateConfig = new TemplateConfig();
        if(isCreateEntity.equals("n")){
            templateConfig.setEntity(null);
        }
        if(isCreateDaoAndProvider.equals("n") || isCreateDaoOrProvider.equals("p") ){
            templateConfig.setXml(null);
            templateConfig.setMapper(null);
        }
        if(isCreateService.equals("n") || isCreateDaoOrProvider.equals("p")){
            templateConfig.setService(null);
            templateConfig.setServiceImpl(null);
        }
        if(isCreateController.equals("n")){
            templateConfig.setController(null);
        }

        // 10、执行
        AutoGenerator mpg = new AutoGenerator();
        mpg.setGlobalConfig(gc);
        mpg.setDataSource(dsc);
        mpg.setPackageInfo(pc);
        mpg.setStrategy(strategy);
        mpg.setCfg(config);
        mpg.setTemplate(templateConfig);
        mpg.execute();



        System.out.println("注意: mapper.xml 默认在包下,请注意添加pom加入xml文件到classes下");

    }
这里着重说一下InjectionConfig的用法,这里就是替换官方模板和自定义模板的关键所在.有以下几个点

1.怎么修改默认模板的内容?
mybatis-plus-generator 默认使用的是velocity,如果想修改默认的模板内容,只需要将下图的.vm文件拷贝到resources下就可以了。


image.png

2.怎么指定输出特定的文件?比如只生成Service 或者Controller?

    // set null则不生成
    TemplateConfig templateConfig = new TemplateConfig();
    templateConfig.setEntity(null);
    templateConfig.setXml(null);
    templateConfig.setMapper(null);
    templateConfig.setService(null);
    templateConfig.setServiceImpl(null);
    mpg.setTemplate(templateConfig);//配置生效

3.怎么增加自己的模板?比如PO、VO、DTO、Provider等?
自己在resources中定义自己的velocity模板,这里不列举了。

           InjectionConfig config = new InjectionConfig() {
                @Override
                public void initMap() {
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("serviceName", finalServiceName);//模板中cfg.serviceName取值
                    this.setMap(map);
                }
            };
            config.setFileOutConfigList(new ArrayList<>());
            String finalProjectName = projectName;
            // 设置模板位置
            FileOutConfig providerFile = new FileOutConfig("/templates/provider.java.vm") {
                @Override
                public String outputFile(TableInfo tableInfo) {
                   // 输出位置
                    return projectPath+ File.separator+ finalProjectName + "/src/main/java"+File.separator + "com/soul/provider/"+tableInfo.getEntityName() + "Provider.java";
                }
            };
            config.getFileOutConfigList().add(providerFile);
            mpg.setCfg(config);//配置生效

转载请注明出处

上一篇 下一篇

猜你喜欢

热点阅读