自從使用Mybatis Plus代碼生成器熔吗,我已經(jīng)成為一名時間管理者

1. 前言

對于寫Crud的老司機來說時間非常寶貴辆床,一些樣板代碼寫不但費時費力,而且枯燥無味桅狠。經(jīng)常有小伙伴問我佛吓,青秧你怎么天天那么有時間去搞新東西,透露一下秘訣唄

image.png

好吧垂攘,今天就把Mybatis-plus的代碼生成器分享出來维雇,讓你也成為一個優(yōu)秀的時間管理者。

2. 基本依賴

以Spring Boot和MySQL為例晒他,你需要下面這些依賴:

<!-- lombok 如果不使用 需要修改代碼生成器的相關(guān)配置 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>compile</scope>
</dependency>
<!-- 連接池 你可以使用其它替換掉 -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis plus starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- mybatis plus 生成器模塊 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>
<!-- 引入freemarker包 作為代碼生成器引擎 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

然后配置好你的數(shù)據(jù)庫吱型,確保數(shù)據(jù)庫連接通訊暢通。

3. 定制代碼生成器

這里我期望生成的目錄結(jié)構(gòu)是這樣的:

image.png

于是我花了點時間定制了一些生成器的配置陨仅,代碼如下:

package cn.felord.mybatis.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
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.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;


/**
 * 代碼生成器配置
 *
 * @author felord
 * @since 10 :39  2018/9/9
 */
public class CodeGenerator {
    private String dbUrl;
    private String userName;
    private String password;
    private String dir;
    private String xmlDir;
    private String packageName;

    private CodeGenerator() {
    }

    /**
     * The type Config builder.
     */
    public static class ConfigBuilder {

        private String dbUrl;
        private String userName;
        private String password;
        private String dir;
        private String xmlDir;
        private String packageName;


        /**
         * Db url config builder.
         *
         * @param dbUrl the db url
         * @return the config builder
         */
        public ConfigBuilder dbUrl(final String dbUrl) {
            this.dbUrl = dbUrl;
            return this;
        }

        /**
         * User name config builder.
         *
         * @param userName the user name
         * @return the config builder
         */
        public ConfigBuilder userName(final String userName) {
            this.userName = userName;
            return this;
        }

        /**
         * Password config builder.
         *
         * @param password the password
         * @return the config builder
         */
        public ConfigBuilder password(final String password) {
            this.password = password;
            return this;
        }

        /**
         * Dir config builder.
         *
         * @param dir the dir
         * @return the config builder
         */
        public ConfigBuilder dir(final String dir) {
            this.dir = dir;
            return this;
        }

        /**
         * Dir config builder.
         *
         * @param xmlDir the dir
         * @return the config builder
         */
        public ConfigBuilder xmlDir(final String xmlDir) {
            this.xmlDir = xmlDir;
            return this;
        }

        /**
         * Package name config builder.
         *
         * @param packageName the package name
         * @return the config builder
         */
        public ConfigBuilder packageName(final String packageName) {
            this.packageName = packageName;
            return this;
        }

        /**
         * Build code generator.
         *
         * @return the code generator
         */
        public CodeGenerator build() {
            CodeGenerator generator = new CodeGenerator();

            generator.dbUrl = Optional.of(this.dbUrl).get();
            generator.userName = Optional.of(this.userName).get();
            generator.password = Optional.of(this.password).get();
            generator.dir = Optional.of(this.dir).get();
            generator.xmlDir = Optional.of(this.xmlDir).get();
            generator.packageName = Optional.of(this.packageName).get();
            return generator;
        }
    }


    /**
     * Code.
     *
     * @param tableNames the table names
     */
    public void code(String... tableNames) {
        codingMysql(true, false, true, this.dbUrl, this.userName, this.password, this.dir, this.xmlDir, this.packageName, tableNames);
    }

    /**
     *
     * 生成器核心部分
     *
     * @param serviceNameStartWithI 是否前綴I
     * @param createController      是否生成controller
     * @param useLombok             是否使用 lombok
     * @param dbUrl                 數(shù)據(jù)庫連接
     * @param username              用戶名稱
     * @param password              密碼
     * @param outDir                輸出目錄
     * @param xmlDir                xml 文件目錄
     * @param packageName           包路徑
     * @param tableNames            表名稱
     */
    private static void codingMysql(boolean serviceNameStartWithI,
                                    boolean createController,
                                    boolean useLombok,
                                    String dbUrl,
                                    String username,
                                    String password,
                                    String outDir,
                                    String xmlDir,
                                    String packageName,
                                    String... tableNames) {
        GlobalConfig config = new GlobalConfig();
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
//        數(shù)據(jù)庫類型 這里使用 mysql
        dataSourceConfig.setDbType(DbType.MYSQL)
                .setUrl(dbUrl)
                .setUsername(username)
                .setPassword(password)
//                驅(qū)動名稱  這里使用mysql
                .setDriverName("com.mysql.jdbc.Driver");

        // 自定義xml輸出路徑
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
//        你也可以定制 xml 的模板
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義xml文件的路徑
                return xmlDir + "/mapper/" + tableInfo.getMapperName() + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);


//        策略配置項
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(false)
//                是否使用 lombok
                .setEntityLombokModel(useLombok)
//                下劃線轉(zhuǎn)駝峰
                .setNaming(NamingStrategy.underline_to_camel)
                //修改替換成你需要的表名津滞,多個表名傳數(shù)組
                .setInclude(tableNames);
//        使用 AR 模式
        config.setActiveRecord(true)
//                設置頭注釋的 author
                .setAuthor("system")
//                項目輸出路徑
                .setOutputDir(outDir)
//                是否覆蓋已經(jīng)生成的同名文件
                .setFileOverride(true)
//                雪花算法生成id
                .setIdType(IdType.ASSIGN_ID)
//                是否使用緩存
                .setEnableCache(false)
//                是否生成 xml 中的 基礎 resultMap
                .setBaseResultMap(true);
        if (!serviceNameStartWithI) {
//            Service 層的 通用格式后綴
            config.setServiceName("%sService");
        }
//             實體類包名
        PackageConfig packageConfig = new PackageConfig().setParent(packageName).setEntity("entity");
        TemplateConfig templateConfig = new TemplateConfig().setXml(null);
//        這里選擇不生成 controller  實際上 生成的大多不符合我們需要  到服務層就行了
        if (!createController) {
            templateConfig.setController(null);
        }
//        整合起來運行
        new AutoGenerator()
                .setGlobalConfig(config)
                .setTemplateEngine(new FreemarkerTemplateEngine())
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig)
                .setCfg(cfg)
                .setTemplate(templateConfig)
                .execute();
    }

}

如果我生成的目錄結(jié)構(gòu)能夠滿足你的需要铝侵,那就巧了,直接拿去用触徐;如果不滿足需要咪鲜,你可以按照注釋的說明進行微調(diào)。18年搞的用了好幾年撞鹉,沒出過什么亂子疟丙。

4. 代碼生成器的使用

使用起來非常簡單,確保數(shù)據(jù)庫能夠使用JDBC連接成功鸟雏,寫個main方法享郊,配置一下,跑起來就是了:

/**
 * @author felord.cn
 * @since 11:34
 **/
public class AutoCoding {
    public static void main(String[] args) {

//          maven 工程 main 包的全路徑
        final String mainDir = "C:\\IdeaProjects\\bc-recyling\\src\\main\\";

        CodeGenerator.ConfigBuilder builder = new CodeGenerator.ConfigBuilder();

        CodeGenerator codeGenerator = builder
//                數(shù)據(jù)庫連接
                .dbUrl("jdbc:mysql://localhost:3306/test")
//                賬戶
                .userName("root")
//                密碼
                .password("123456")
                // 生成類位置
                .dir(mainDir + "java")
                // 生成xml 位置
                .xmlDir(mainDir + "resources")
                // 包引用路徑
                .packageName("cn.felord.mybatis")
                .build();

        //根據(jù)表生成后臺代碼
        codeGenerator.code("user_info");


    }
}

然后代碼就生成了孝鹊,是不是非常的好用炊琉?恭喜你獲得了 時間管理大師 榮譽稱號。

5. 總結(jié)

雖然好用又活,但是建議新手不要使用苔咪,多手寫一下代碼。另外復雜的SQL還是建議自己寫柳骄,多鍛煉寫SQL的能力团赏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夹界,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隘世,老刑警劉巖可柿,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丙者,居然都是意外死亡复斥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門械媒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來目锭,“玉大人,你說我怎么就攤上這事纷捞×『纾” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵主儡,是天一觀的道長奖唯。 經(jīng)常有香客問我,道長糜值,這世上最難降的妖魔是什么丰捷? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任坯墨,我火速辦了婚禮,結(jié)果婚禮上病往,老公的妹妹穿的比我還像新娘捣染。我一直安慰自己,他們只是感情好停巷,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布耍攘。 她就那樣靜靜地躺著,像睡著了一般叠穆。 火紅的嫁衣襯著肌膚如雪少漆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天硼被,我揣著相機與錄音示损,去河邊找鬼。 笑死嚷硫,一個胖子當著我的面吹牛检访,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仔掸,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脆贵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了起暮?” 一聲冷哼從身側(cè)響起卖氨,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎负懦,沒想到半個月后筒捺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡纸厉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年系吭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颗品。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肯尺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躯枢,到底是詐尸還是另有隱情则吟,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布锄蹂,位于F島的核電站逾滥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寨昙,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一讥巡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舔哪,春花似錦欢顷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对雪。三九已至抹剩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钓账,已是汗流浹背陕悬。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工题暖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉超。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓胧卤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拼岳。 傳聞我的和親對象是個殘疾皇子枝誊,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353