mybatis-plus代碼生成,實體類不生成父類屬性


一、參考文檔:

官方文檔其實說的很清楚了,可能有個別地方有點不太清楚。

  mybatis-plus官方: https://mp.baomidou.com/guide/generator.html  

模版引擎用的beetl,之前沒怎么接觸過這塊,不過感覺beetl有點像是寫jsp一樣,上手快。

  beetl官方: http://ibeetl.com/guide/#/beetl/

二、具體實現,說明可以看注釋,更詳細的配置可以看官方文檔。

依賴:

       <!--代碼生成-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--代碼生成使用的模版引擎-->
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl</artifactId>
            <version>2.9.3</version>
        </dependency>

 

 

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.BeetlTemplateEngine;

import java.util.HashMap;
import java.util.Map;

public class Main {
    //核心類,所有操作配置都圍繞該類展開。
    private static final AutoGenerator mpg = new AutoGenerator();
    //獲取項目目錄
    private static final String projectPath = System.getProperty("user.dir");
    //項目基礎包
    private static final String Package = "com.mz.mzservice";
    //子模塊包名,最終生成的是類似  com.mz.mzservice.dev 這樣的
    private static final String ModuleName = "dev";

    public static void main(String[] args) {
        //數據庫連接配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("root");
        mpg.setDataSource(dataSourceConfig);
        //公用的一些配置,一看就懂的就不加注釋了。
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(projectPath + "/src/main/java");
        globalConfig.setAuthor("sun");
        //日期類型的字段使用哪個類型,默認是 java8的 日期類型,此處改為 java.util.date
        globalConfig.setDateType(DateType.ONLY_DATE);
        //是否覆蓋 已存在文件,默認 false 不覆蓋
        globalConfig.setFileOverride(false);
        //mapper.xml 是否生成 ResultMap,默認 false 不生成
        globalConfig.setBaseResultMap(true);
        //mapper.xml 是否生成 ColumnList,默認 false 不生成
        globalConfig.setBaseColumnList(true);
        //生成的實體類名字,增加前后綴的 ,下面的mapper xml 同理,另外還有controller和service的名稱配置
//        globalConfig.setEntityName("%sEntity");
        globalConfig.setMapperName("%sMapper");
        globalConfig.setXmlName("%sMapper");
        //是否生成完成后打開資源管理器
        globalConfig.setOpen(false);
        mpg.setGlobalConfig(globalConfig);

        PackageConfig pc = new PackageConfig();
        pc.setParent(Package);
        pc.setModuleName(ModuleName);
        mpg.setPackageInfo(pc);

        StrategyConfig strategy = new StrategyConfig();
        //支持正則表達式,字符串數組。 和 Exclude 二選一
        // TODO 此處使用正則生成時,提示有些bug。
        //  被正則過濾的表會提示 “^dev_.*$” 表不存在,其實需要生成代碼的表已經正常生成完畢了。
        strategy.setInclude("^dev_.*$");
        //  不需要生成的表
        //  strategy.setExclude("sequence");
        //此處配置為 下划線轉駝峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        //生成的字段 是否添加注解,默認false
        strategy.setEntityTableFieldAnnotationEnable(true);
        //表前綴,配置后 生成的的代碼都會把前綴去掉
//        strategy.setTablePrefix("dev_");
        //實體類的基礎父類。沒有可以不配置。
        strategy.setSuperEntityClass("com.mz.mzservice.entity.BaseEntity");
        //這里本來以為配置上 生成的實體類就沒有父類的屬性了,但其實不是。
        //如何去掉父類屬性,下面有說明。
        strategy.setSuperEntityColumns("creater","createTime","editor","editTime","remark");
        //controller,基礎父類
        strategy.setSuperControllerClass("com.mz.mzservice.controller.BaseController");
        //是否啟用 Lombok
        strategy.setEntityLombokModel(true);
        //是否啟用 builder 模式 例:new DevDevice().setDealerId("").setDeviceCode("");
        strategy.setEntityBuilderModel(true);
        mpg.setStrategy(strategy);

        InjectionConfig in = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                //自定義配置,在模版中cfg.superColums 獲取
                // TODO 這里解決子類會生成父類屬性的問題,在模版里會用到該配置
                map.put("superColums", this.getConfig().getStrategyConfig().getSuperEntityColumns());
                this.setMap(map);
            }
        };
        in.setFileOutConfigList(CollectionUtil.newArrayList(new FileOutConfig("/templates/mapper.xml.btl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義mapper xml輸出目錄
                return projectPath + "/src/main/resources/mapper/" + ModuleName
                        + "/" + tableInfo.getMapperName()  + StringPool.DOT_XML;
            }
        }));
        mpg.setCfg(in);
        TemplateConfig templateConfig = new TemplateConfig();
        //自定義模版
        templateConfig.setController("/templates/btl/controller.java");
        templateConfig.setEntity("/templates/btl/entity.java");
        //關閉默認的mapper xml生成
        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);
        //使用beetl模版引擎
        mpg.setTemplateEngine(new BeetlTemplateEngine());
        mpg.execute();
    }

}

三、自定義模版,這里我只粘貼出來,子類不生成父類屬性的地方。修改是基於官方模版的。

說明:大概邏輯是判斷字段名是否包含在之前在代碼里配置的父類字段。如果包含則直接continue。

entity.java.btl

 

 

 

 

四、官方的默認模版位置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM