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

1. 前言

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

image.png

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

2. 基本依賴

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

<!-- lombok 如果不使用 需要修改代碼生成器的相關配置 -->
<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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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