Mybatis-plus之代碼生成器

先上官方配置文檔
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>

廢話不多,直接上類,代碼習慣不好,大家將就著看,怎么養(yǎng)成好習慣,歡迎大家批評指正

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 參數(shù)定義
        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("|代碼生成器:請檢查代碼生成參數(shù)                               |");
        System.out.println("|項目名(maven多模塊自動生成到項目之下):"+projectName);
        System.out.println("|覆蓋已有文件:"+isOverrideStr);
        System.out.println("|數(shù)據(jù)庫:"+dbName);
        System.out.println("|用戶名:"+dbUser);
        System.out.println("|密碼:"+dbPwd);
        System.out.println("|表名:"+tableNames);
        System.out.println("|實體開關(guān):"+isCreateEntity);
        System.out.println("|dao層開關(guān):"+isCreateDaoAndProvider);
        System.out.println("|生成dao層還是provider層:"+isCreateDaoOrProvider);
        System.out.println("|service層開關(guān):"+isCreateService);
        System.out.println("|controller開關(guān):"+isCreateController);
        System.out.println("--------------------------------------------------------");

        // 3 全局參數(shù)詢問
        String projectPath = System.getProperty("user.dir");
        if(scanner("是否按照以上參數(shù)執(zhí)行?(y/n)","y").equals("n")){
            projectName = scanner("請輸入項目名稱",projectName);
            isOverrideStr = scanner("是否覆蓋已有文件(y/n)",isOverrideStr);
            dbName = scanner("請輸入數(shù)據(jù)庫名稱(默認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("請輸入服務(wù)名",serviceName);
                camelCaseServiceName = StrKit.toCamelCase(serviceName);
                camelCaseServiceName = StrKit.toCamelCase(serviceName,"-");
                upperCamelCaseServiceName = camelCaseServiceName.substring(0, 1).toUpperCase() + camelCaseServiceName.substring(1);
                isCreateService = "n";
            }else{
                isCreateService = scanner("是否生成service及其實現(xiàn) (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 數(shù)據(jù)源配置
        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);//數(shù)據(jù)庫表映射到實體的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成實體時去掉表前綴
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//數(shù)據(jù)庫表字段映射到實體的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter鏈式操作
        strategy.setRestControllerStyle(true); //restful api風格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中駝峰轉(zhuǎn)連字符
        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 設(shè)置 自定義模板,以及替換官方模板
        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 去下劃線 _或- ,轉(zhuǎn)駝峰,首字母大寫,

                    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設(shè)置
        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、執(zhí)行
        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的用法,這里就是替換官方模板和自定義模板的關(guān)鍵所在.有以下幾個點

1.怎么修改默認模板的內(nèi)容?
mybatis-plus-generator 默認使用的是velocity,如果想修改默認的模板內(nèi)容,只需要將下圖的.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;
            // 設(shè)置模板位置
            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);//配置生效

轉(zhuǎn)載請注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容