MyBatis Plus-代碼生成器

前言:本文末尾處附有自定義代碼生成器的源碼,感興趣的可以前往下載喉前。

零、本文綱要

一王财、代碼生成器快速入門
二卵迂、源碼使用快速入門
三、自定義代碼生成器starter

一绒净、代碼生成器快速入門

MyBatis Plus-代碼生成器官方文檔见咒。

1. 基礎(chǔ)依賴

mybatis-plus
mybatis-plus-boot-starter
mybatis-plus-extension
mybatis-plus-core
mybatis-plus-annotation
mybatis-plus-generator

2. 測(cè)試代碼

注意將下面的:url、username挂疆、password以及注釋部分的內(nèi)容改為自己測(cè)試模塊的內(nèi)容改览。

FastAutoGenerator.create("url", "username", "password")
    .globalConfig(builder -> {
        builder.author("baomidou") // 設(shè)置作者
            .enableSwagger() // 開啟 swagger 模式
            .fileOverride() // 覆蓋已生成文件
            .outputDir("D://"); // 指定輸出目錄
    })
    .packageConfig(builder -> {
        builder.parent("com.baomidou.mybatisplus.samples.generator") // 設(shè)置父包名
            .moduleName("system") // 設(shè)置父包模塊名
            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 設(shè)置mapperXml生成路徑
    })
    .strategyConfig(builder -> {
        builder.addInclude("t_simple") // 設(shè)置需要生成的表名
            .addTablePrefix("t_", "c_"); // 設(shè)置過濾表前綴
    })
    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默認(rèn)的是Velocity引擎模板
    .execute();
  1. 測(cè)試

然后就報(bào)錯(cuò)了

Caused by:

各種類的缺失異常.png

官方提供的依賴除了未傳遞依賴 mp 包缤言,還缺失了很大一部分依賴宝当。所以,直接跟源碼來探下究竟胆萧。

MyBatis-Plus 代碼生成器(3.5.1+版本)GitHub網(wǎng)址庆揩。

下載源碼研究.png

二、源碼使用快速入門

1. 查看源碼結(jié)構(gòu)

下載好源碼后跌穗,映入眼簾的是 build.gradle 订晌,可以看到官方是使用 gradle 來進(jìn)行依賴等內(nèi)容的統(tǒng)一管理的。

gradle管理.png

但是蚌吸,我們通常使用maven進(jìn)行項(xiàng)目開發(fā)锈拨,所以需要對(duì)管理工具做下簡(jiǎn)單調(diào)整。

我們需要通過查看 build.gradle 文件的 buildscript.dependencies 以及 ext.lib 的內(nèi)容羹唠,來插入官方使用版本的依賴奕枢。

抽取gradle配置中的依賴.png

或者使用IDEA工具自動(dòng)識(shí)別,add maven dependencies肉迫。

2. 調(diào)整后的依賴

以下為IDEA工具添加的本地倉庫的依賴验辞,與以上不完全一致,如下:

<properties>
    <mybatis.plus.generator.version>3.5.2</mybatis.plus.generator.version>
    <mybatis.plus.annotation.version>3.4.3</mybatis.plus.annotation.version>
    <mybatis.plus.core.version>3.4.3</mybatis.plus.core.version>
    <mybatis.plus.extension.version>3.4.3</mybatis.plus.extension.version>
    <kotlin.runtime.version>1.0.7</kotlin.runtime.version>
    <freemarker.version>2.3.31</freemarker.version>
    <velocity.version>1.5</velocity.version>
    <beetl.version>3.10.0.RELEASE</beetl.version>
    <mysql.connector.java.version>8.0.29</mysql.connector.java.version>
    <slf4j.simple.version>1.7.21</slf4j.simple.version>
</properties>

<dependencies>
    <!--   mybatis-plus生成器依賴   -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>${mybatis.plus.generator.version}</version>
    </dependency>
    <!--   mybatis-plus注解依賴   -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-annotation</artifactId>
        <version>${mybatis.plus.annotation.version}</version>
    </dependency>
    <!--   mybatis-plus核心依賴   -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-core</artifactId>
        <version>${mybatis.plus.core.version}</version>
    </dependency>
    <!--   mybatis-plus額外拓展   -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-extension</artifactId>
        <version>${mybatis.plus.extension.version}</version>
    </dependency>
    <!--   補(bǔ)充注解   -->
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-runtime</artifactId>
        <version>${kotlin.runtime.version}</version>
    </dependency>
    <!--   freemarker模板框架   -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>${freemarker.version}</version>
    </dependency>
    <!--   velocity工具   -->
    <dependency>
        <groupId>velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>${velocity.version}</version>
    </dependency>
    <!--   beetl工具   -->
    <dependency>
        <groupId>com.ibeetl</groupId>
        <artifactId>beetl</artifactId>
        <version>${beetl.version}</version>
    </dependency>
    <!--   mysql數(shù)據(jù)庫連接   -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.connector.java.version}</version>
    </dependency>
    <!--   日志依賴   -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>${slf4j.simple.version}</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

3. 測(cè)試代碼

此處如上喊衫,省略跌造。

至此,我們已經(jīng)可以使用代碼生成器來幫助我們生成日常所需的代碼了。但是壳贪,每次使用還需要各種配置依賴陵珍,寫固定的代碼邏輯并不是我們希望的。所以违施,我們考慮將此內(nèi)容抽成一個(gè)starter互纯,即拿即用。

三磕蒲、自定義代碼生成器starter

1. 明確生成器starter的目標(biāo)

a留潦、配置使用
b、省去邏輯代碼編輯

2. 參考spring-boot-starter

① 自動(dòng)裝配

首先辣往,添加 spring-boot-starter-web 依賴兔院,也可以直接用starter,這個(gè)更全一些站削。

我們知道spring-boot項(xiàng)目自動(dòng)裝配會(huì)讀取 src/main/resources/META-INF/spring.factories 文件坊萝,進(jìn)而加載內(nèi)部的內(nèi)容。所以许起,我們編輯自己的自動(dòng)裝配類十偶。如下:

Ⅰ 在上述目錄添加 spring.factories 文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.stone.autoconfig.MyBatisPlusGeneratorAutoConfiguration

Ⅱ 編寫 MyBatisPlusGeneratorAutoConfiguration 自動(dòng)配置類

public class MyBatisPlusGeneratorAutoConfiguration {
}

② yml配置加載

spring-boot項(xiàng)目常常會(huì)編寫application.yml配置文件,然后自動(dòng)裝配時(shí)會(huì)自動(dòng)讀取其內(nèi)容园细。因此我們使用@ConfigurationProperties注解惦积,來幫助我們讀取指定配置。

代碼生成器官方文檔.png

通過查閱MyBatis Plus-代碼生成器官方文檔猛频,不難發(fā)現(xiàn)我們?cè)谧龅暮诵膬?nèi)容起始就是配置:
a荣刑、 數(shù)據(jù)庫配置(DataSourceConfig);
b伦乔、 全局配置(GlobalConfig)厉亏;
c、 包配置(PackageConfig)烈和;
d爱只、 模板配置(TemplateConfig)【不常用】;
e招刹、 注入配置(InjectionConfig)【不常用】恬试;
f、 策略配置(StrategyConfig)疯暑。

官方樣例配置了其中5個(gè)训柴,abcdf。因此妇拯,我們配置較為常用的5個(gè)幻馁,以及其較可能用到的屬性洗鸵、方法等。

Ⅰ 定制 數(shù)據(jù)庫配置(DataSourceConfig)

編寫 CustomDataSourceConfigProperties 類仗嗦,此處抽取了經(jīng)常配置的 url膘滨、username、password 舉例稀拐,如下:

@Component
@ConfigurationProperties(prefix = "stone.datasource")
public class CustomDataSourceConfigProperties {
    /**
     * 驅(qū)動(dòng)連接的URL
     */
    private String url = null;

    /**
     * 數(shù)據(jù)庫連接用戶名
     */
    private String username = "root";

    /**
     * 數(shù)據(jù)庫連接密碼
     */
    private String password = "root";

    //此處省略get/set方法
}

當(dāng)然火邓,此處如果為了方便,可以使用 lombok 依賴/插件德撬。

編寫 CustomDataSourceConfig 類铲咨,如下:

@Component
public class CustomDataSourceConfig {

    @Autowired
    private CustomDataSourceConfigProperties customDataSourceConfigProperties;

    @Bean
    public DataSourceConfig dataSourceConfig() {
        //1. 獲取數(shù)據(jù)庫配置的建造者對(duì)象
        DataSourceConfig.Builder builder = new DataSourceConfig.Builder(
                //1.1 設(shè)置數(shù)據(jù)庫URL
                customDataSourceConfigProperties.getUrl(),
                //1.2 設(shè)置用戶名
                customDataSourceConfigProperties.getUsername(),
                //1.3 設(shè)置登錄密碼
                customDataSourceConfigProperties.getPassword()
        );
        //2. 返回?cái)?shù)據(jù)源配置對(duì)象
        return builder.build();
    }
}

Ⅱ 全局配置(GlobalConfig)
Ⅲ 包配置(PackageConfig)
Ⅳ 模板配置(TemplateConfig)【不常用】
Ⅴ 策略配置(StrategyConfig)

省略。

③ 編寫自定義代碼生成器工具類

編寫CustomGenerator蜓洪,如下:

public class CustomGenerator {
    @Autowired
    private GlobalConfig globalConfig;

    @Autowired
    private PackageConfig packageConfig;

    @Autowired
    private StrategyConfig strategyConfig;

    @Autowired
    private TemplateConfig templateConfig;

    @Autowired
    private DataSourceConfig dataSourceConfig;

    public void generateCode() throws Exception {
        //1. 生成器對(duì)象
        AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfig);
        //2. 配置全局屬性
        autoGenerator.global(globalConfig);
        //3. 配置包屬性
        autoGenerator.packageInfo(packageConfig);
        //4. 配置策略
        autoGenerator.strategy(strategyConfig);
        //5. 配置模板
        autoGenerator.template(templateConfig);
        //6. 開始生成Code
        autoGenerator.execute();
    }
}

④ 在自動(dòng)配置類引入各個(gè)組件bean

@Import({
        CustomDataSourceConfig.class,
        CustomGlobalConfig.class,
        CustomPackageConfig.class,
        CustomStrategyConfig.class,
        CustomTemplateConfig.class,
        CustomDataSourceConfigProperties.class,
        CustomGlobalConfigProperties.class,
        CustomPackageConfigProperties.class,
        CustomStrategyConfigProperties.class,
        CustomTemplateConfigProperties.class
})
public class MyBatisPlusGeneratorAutoConfiguration {
    @Bean
    public CustomGenerator customGenerator() {
        return new CustomGenerator();
    }
}

此時(shí)鸣驱,我們install一下我們的程序就可以在項(xiàng)目中使用自定義的starter生成代碼。如果無法正常在項(xiàng)目中被加載蝠咆,則手動(dòng)build。

image.png

添加依賴北滥,在項(xiàng)目中測(cè)試:

Ⅰ 添加依賴

<dependency>
    <groupId>com.stone.mybatis</groupId>
    <artifactId>stone-mybatis-plus-generator-starter-simple</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>

Ⅱ 編寫application.yml配置文件

編寫配置文件.png
stone:
  datasource: # 數(shù)據(jù)源配置
    url: "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false"
    username: root
    password: root
  global: # 全局配置
    author: stone
    enable-swagger: true
    output-dir: D:\JavaStudy\Level2\custom-generator-demo\src\main\java
  package: # 包配置
    parent: com.stone
    xml: mapper.xml
  strategy: # 策略配置
    table-prefix: t_

Ⅲ 生成所需文件

@RunWith(SpringRunner.class)
@SpringBootTest(classes = GeneratorApplication.class)
public class GeneratorTest {
    //注入自定義的生成器對(duì)象
    @Autowired
    private CustomGenerator customGenerator;
    //測(cè)試生成代碼
    @Test
    public void testGenerator() throws Exception {
        customGenerator.generateCode();
    }
}
生成的代碼文件.png
生成的文件.png

⑤ 優(yōu)化

我們常用的yml配置會(huì)有選項(xiàng)提示的內(nèi)容刚操,我們可以使用 spring-boot-configuration-processor 幫助我們完成此功能。

添加該依賴再芋,然后執(zhí)行 mvn:clean → install菊霜。此時(shí),我們可以在項(xiàng)目的 target/classes/META-INF 目錄下看到一個(gè) spring-configuration-metadata.json 文件济赎。將該文件復(fù)制至 src/main/resources/META-INF 目錄下鉴逞。

打開該文件,拖動(dòng)到最下方司训,如下:

"hints": []

hints 提供默認(rèn)選項(xiàng)的內(nèi)容并未配置构捡,還是空的。添加自己認(rèn)為需要提醒的默認(rèn)配置選項(xiàng)壳猜,如下:

"hints": [
    {
      "name": "stone.global.disable-open-dir",
      "values": [
        {
          "value": false,
          "description": "【默認(rèn)】打開輸出目錄"
        },
        {
          "value": true,
          "description": "不打開輸出目錄"
        }
      ]
    }
]
優(yōu)化后的效果.png

注意:在我們添加完 spring-configuration-metadata.json 文件后勾徽,將 spring-boot-configuration-processor 依賴注釋掉。未注釋的話统扳,框架運(yùn)行時(shí)又會(huì)生成一個(gè)該文件喘帚,同樣的提示顯示兩條。

至此咒钟,我們就可以在我們想要使用的項(xiàng)目中使用自己的代碼生成器生成代碼了吹由。

感興趣的話也可以直接下載過去使用:stone-mybatis-plus-generator-starter-simple (github.com)

四朱嘴、結(jié)尾

以上即為MyBatis Plus-代碼生成器的全部?jī)?nèi)容倾鲫,感謝閱讀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市级乍,隨后出現(xiàn)的幾起案子舌劳,更是在濱河造成了極大的恐慌,老刑警劉巖玫荣,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甚淡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捅厂,警方通過查閱死者的電腦和手機(jī)贯卦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焙贷,“玉大人撵割,你說我怎么就攤上這事≌奚郑” “怎么了啡彬?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)故硅。 經(jīng)常有香客問我庶灿,道長(zhǎng),這世上最難降的妖魔是什么吃衅? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任往踢,我火速辦了婚禮,結(jié)果婚禮上徘层,老公的妹妹穿的比我還像新娘峻呕。我一直安慰自己,他們只是感情好趣效,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布瘦癌。 她就那樣靜靜地躺著,像睡著了一般跷敬。 火紅的嫁衣襯著肌膚如雪佩憾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天干花,我揣著相機(jī)與錄音妄帘,去河邊找鬼。 笑死池凄,一個(gè)胖子當(dāng)著我的面吹牛抡驼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肿仑,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼致盟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碎税!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馏锡,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤雷蹂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后杯道,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匪煌,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年党巾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萎庭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡齿拂,死狀恐怖驳规,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情署海,我是刑警寧澤吗购,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站砸狞,受9級(jí)特大地震影響捻勉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趾代,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丰辣。 院中可真熱鬧撒强,春花似錦、人聲如沸笙什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琐凭。三九已至芽隆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間统屈,已是汗流浹背胚吁。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愁憔,地道東北人腕扶。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吨掌,于是被迫代替她去往敵國和親半抱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脓恕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容