Mybatis-Plus的使用(二)—— 代碼生成器

原文鏈接:橙子&栗子&世界——Mybatis-Plus的使用(二)—— 代碼生成器

代碼生成器的介紹

對於我來說,開發時最難受的時候除了有bug沒有解決之外,就是做複製粘貼了。每次創建一個新的模塊,都要重複的不斷複製實體類的屬性,然後在寫上一次註釋,再把代碼中該繼承的繼承。用Mybatis-Plus的代碼生成器AutoGenerator就可以省去這一部分的煩惱。它幫我直接把EntityMapperMapper XMLServiceController等文件預先生成好,也幫我把Entity對應的表做好了映射,也寫好的註釋,還有Service以及Mapper文件,也幫我把Mybatis-Plus需要用的父類繼承好了。這樣就省去我這一部分的開發工作。

代碼生成器的依賴

除了一章節的Mybatis-Plus的核心依賴以外,還需要添加兩個重要的依賴:

	<!--mybatisplus的代碼生成器依賴-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

以及

	<!--freemarker模板引擎-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

代碼生成工具類

AutoGenerator

代碼生成器的主類,之後的各種配置都會添加到這個類裏面,例如:

  • GlobalConfig(全局配置);
  • DataSourceConfig(數據源配置);
  • PackageConfig(包配置);
  • TemplateConfig(模板配置)
  • InjectionConfig(自定義配置);
  • StrategyConfig(策略配置(數據庫表配置));
	AutoGenerator mpg = new AutoGenerator();// 代碼生成器主類

GlobalConfig

全局配置,定義文件的輸出目錄,設置文件的@author信息等

        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");// 獲取用戶程序當前路徑(項目根的路徑)
        gc.setOutputDir(projectPath + "/src/main/java");// 生成文件的輸出目錄(默認值:D 盤根目錄)
        gc.setAuthor("ck");// 開發人員(默認值:null)
        gc.setOpen(false);// 是否打開輸出目錄(默認值:null)
        gc.setFileOverride(true);// 是否覆蓋已有文件(默認值:false)
        mpg.setGlobalConfig(gc);//把全局配置添加到代碼生成器主類

DataSourceConfig

數據源配置,這個比較清晰了,數據庫表映射實體類時需要配置數據庫的連接信息。

        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://47.103.17.3:3306/lm_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8");
        dsc.setSchemaName("public");// 數據庫 schema name(例如 PostgreSQL 可指定爲 public)
        dsc.setDbType(DbType.MYSQL);// 數據庫類型
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");// 驅動名稱
        dsc.setUsername("chenkang"); // 用戶名
        dsc.setPassword("258963"); // 密碼

類型轉換 默認由 dbType 類型決定選擇對應數據庫內置實現。
實現 ITypeConvert 接口自定義數據庫 字段類型 轉換爲自己需要的 java 類型,也可以直接重寫自帶的MySqlTypeConvert類的processTypeConvert方法,是一個道理

	dsc.setTypeConvert(new MySqlTypeConvert() {
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                return super.processTypeConvert(globalConfig, fieldType);
            }
        });
	mpg.setDataSource(dsc);//把數據源配置添加到代碼生成器主類

PackageConfig

包配置,就是每個類最上面的package,比如:package com.ck.mybatisplus.foundation.service;這裏包配置可以分別配置serviceentitycontroller等等

	PackageConfig pc = new PackageConfig();
        pc.setModuleName("foundation");// 父包模塊名
        pc.setParent("com.ck.mybatisplus");// 父包名。如果爲空,將下面子包名必須寫全部, 否則就只需寫子包名
        pc.setService("service");// Service包名
        pc.setEntity("entity");// Entity包名
        pc.setServiceImpl("service.impl");// ServiceImpl包名
        pc.setMapper("mapper");// Mapper包名
        pc.setController("controller");// Contoller包名
        // pc.setXml("mapper.xml");// Mapper.xml包名
        mpg.setPackageInfo(pc);// 把包配置添加到代碼生成器主類

TemplateConfig

模板配置,配置模板,此模板配置默認生成mybatisplus自帶模板的controller.javaservice.javaserviceImpl.javamapper.java.xmlentity類的文件
若不想用默認的模板生成的文件,有兩種方法:

  1. 一種是直接set自定義的模板路徑,如下面的templateConfig.setController("/templates/MyController.java.ftl")
  2. 第二種是使用自定義配置(下面有講解),前提是要先把默認值設爲null,如templateConfig.setXml(null)。兩種方法的共同點是都需要先有自定義的模板文件,

不同是第一種的文件生成路徑是在前面的包配置固定了的,第二種是連文件生成的路徑都是可以自定義的!

	TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
//        templateConfig.setController("/templates/MyController.java.ftl");
        mpg.setTemplate(templateConfig);// 把模板配置添加到代碼生成器主類

InjectionConfig

自定義配置,前面也說了,只要有相應的模板文件,基本上能滿足在項目中任何位置生成你想要的文件,比如.java.xml.jsp文件等,首先new出自定義配置的對象,如下

	InjectionConfig cfg = new InjectionConfig() {
            /**
             * 使用initMap是抽象方法,所以必須被重寫,
             * 注入自定義 Map 對象(注意需要setMap放進去),該對象可以傳遞到模板引擎通過 cfg.xxx 引用
             */
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                map.put("mapperId", "testMapperId");
                this.setMap(map);
            }
        };

然後配置模板的路徑

.ftl表示是模板引擎是 freemarker,還有.vm表示模板引擎是 velocity等等

String templatePath = "/templates/mapper.xml.ftl";

再自定義輸出配置,配置 FileOutConfig 指定模板文件、輸出文件達到自定義文件生成目的,如果同時自定義兩個或多個以上,可以直接focList.add多個new FileOutConfig(templatePath) {}配置

自定義配置會被優先輸出

	List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義輸出文件名 , 如果你 Entity 設置了前後綴、此處注意 xml 的名稱會跟着發生變化!!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

自定義判斷是否創建文件,該配置用於判斷某個類是否需要覆蓋創建,如果想覆蓋之前已生成的文件,isCreate方法直接返回true,默認是false

一般情況可以不用配置這個,直接使用默認的不覆蓋

	cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判斷自定義文件夾是否需要創建,
//                checkDir("調用默認方法創建的目錄");
                // 當然也可以自定義哪些文件可以被覆蓋哪些不可以被覆蓋,更新判斷邏輯返回true或者false
                return false;
            }
        });
	cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

StrategyConfig

數據庫表配置,通過該配置,可指定需要生成哪些表或者排除哪些表等信息,

	StrategyConfig strategy = new StrategyConfig();
        // 數據庫表映射到實體的命名策略:下劃線轉駝峯
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 數據庫表字段映射到實體的命名策略, 未指定按照 naming 執行
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 自定義繼承類全稱,帶包名 (以下爲示例)
        strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
        strategy.setEntityLombokModel(true);// 【實體】是否爲lombok模型(默認 false)
        strategy.setRestControllerStyle(true);// 生成 @RestController 控制器
        strategy.setSuperEntityColumns("id");// 寫於父類中的公共字段
        strategy.setInclude("fnd_user");// 需要包含的表名,允許正則表達式(與exclude二選一配置)
        strategy.setExclude("m_fnd_user1");// 需要排除的表名,允許正則表達式
        strategy.setControllerMappingHyphenStyle(true);// 駝峯轉連字符
        strategy.setEntityTableFieldAnnotationEnable(true);// 是否生成實體時,生成字段註解 默認false;
        strategy.setTablePrefix(pc.getModuleName() + "_");// 表前綴
        mpg.setStrategy(strategy);// 把策略配置添加到代碼生成器主類

模板引擎

向代碼生成器主類上配置模板引擎,這是是freemarkermpg.execute()方法就是執行生成代碼類。

	mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();

以上內容來源於

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章