想作時間管理大師?你能夠試試Mybatis Plus代碼生成器

1. 前言

對於寫Crud的老司機來講時間很是寶貴,一些樣板代碼寫不但費時費力,並且枯燥無味。常常有小夥伴問我,胖哥你怎麼每天那麼有時間去搞新東西,透露一下祕訣唄。java

好吧,今天就把Mybatis-plus的代碼生成器分享出來,讓你也成爲一個優秀的時間管理大師。mysql

2. 基本依賴

Spring BootMySQL爲例,你須要下面這些依賴:算法

<!-- 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>

而後配置好你的數據庫,確保數據庫鏈接通信暢通。spring

3. 定製代碼生成器

這裏我指望生成的目錄結構是這樣的:sql

Mybatis Plus 生成文件的目錄結構

因而我花了點時間定製了一些生成器的配置,代碼以下,就是這麼硬核!數據庫

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                 數據庫鏈接
     * @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();
//        數據庫類型 這裏使用 mysql
        dataSourceConfig.setDbType(DbType.MYSQL)
                .setUrl(dbUrl)
                .setUsername(username)
                .setPassword(password)
//                驅動名稱  這裏使用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)
//                下劃線轉駝峯
                .setNaming(NamingStrategy.underline_to_camel)
                //修改替換成你須要的表名,多個表名傳數組
                .setInclude(tableNames);
//        使用 AR 模式
        config.setActiveRecord(true)
//                設置頭註釋的 author
                .setAuthor("system")
//                項目輸出路徑
                .setOutputDir(outDir)
//                是否覆蓋已經生成的同名文件
                .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();
    }

}
若是我生成的目錄結構可以知足你的須要,那就巧了,直接拿去用;若是不知足須要,你能夠按照註釋的說明進行微調。18年搞的用了好幾年,沒出過什麼亂子。

4. 代碼生成器的使用

使用起來很是簡單,確保數據庫可以使用JDBC鏈接成功,寫個main方法,配置一下,跑起來就是了:api

/**
 * @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
//                數據庫鏈接
                .dbUrl("jdbc:mysql://localhost:3306/test")
//                帳戶
                .userName("root")
//                密碼
                .password("123456")
                // 生成類位置
                .dir(mainDir + "java")
                // 生成xml 位置
                .xmlDir(mainDir + "resources")
                // 包引用路徑
                .packageName("cn.felord.mybatis")
                .build();

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


    }
}

而後代碼就生成了,是否是很是的好用?恭喜你得到了 時間管理大師 榮譽稱號。數組

切記不要炫耀,不然需求加倍。

5. 總結

雖然好用,可是建議新手不要使用,多手寫一下代碼。另外複雜的SQL仍是建議本身寫,多鍛鍊寫SQL的能力。若是你在使用中有什麼問題,能夠私信我進行溝通。緩存

關注公衆號:Felordcn 獲取更多資訊mybatis

我的博客:https://felord.cn

相關文章
相關標籤/搜索