SpringBoot中的自動代碼生成 – 基於Mybatis-Plus

作者:湯圓

個人博客:javalover.cc

前言

大家好啊,我是湯圓,今天給大家帶來的是《SpringBoot中的自動代碼生成 – 基於Mybatis-Plus》,希望對大家有幫助,謝謝

文章純屬原創,個人總結難免有差錯,如果有,麻煩在評論區回復或後台私信,謝啦

簡介

基於Mybatis-Plus的自動代碼生成有很多方式,這裡介紹下我在用的兩種:

  • 本地代碼生成:Mybatis-Plus官方
  • 在線代碼生成:第三方

這兩種各有優缺點,看喜歡哪一種了

聽說Idea也有自動生成的插件,但是我還沒去看,我覺得這倆就夠用了(但也說不準哪天,用了插件後,才發現柳暗花明呢)

有的官人,可能要問了,既然Mybatis-Plus官網有例子了,為啥還要在這裡寫出來呢?

是因為對於我這種不熟悉模板引擎的人來說,官網介紹的一些配置我們可以省掉,從而減少我們調試的時間(因為默認的模板生成配置就夠用了,我們不需要再去接觸那些模板語法啥的)

本地代碼生成

就是在自己的項目里,寫一個Java程序,配置好各種參數,啟動後就可以自動生成

這種方法的好處是,直接生成到本地項目,不需要手動再去複製粘貼

缺點就是,剛開始的配置比較多(但是一勞永逸)

好了,下面開始上代碼,好消息是下面的代碼都有注釋說明,另一個好消息是生成的代碼也是有注釋的(尤其是entity類的字段註解,很實用)

  1. 配置pom.xml

    <!-- mybatis-plus代碼生成器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.4.0</version>
    </dependency>
    <!-- velocity模板引擎,用於mybatis-plus代碼生成器 -->
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-engine-core</artifactId>
        <version>2.3</version>
    </dependency>
    <!-- lombok 自動生成會用到-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
    </dependency>
    
  2. 自動生成代碼的Java主程序:參考官網

    // 演示例子,執行 main 方法控制台輸入模塊表名回車自動生成對應項目目錄中
    public class GenerateCode {
    
        /**
         * <p>
         * 讀取控制台內容
         * </p>
         */
        public static String scanner(String tip) {
            Scanner scanner = new Scanner(System.in);
            StringBuilder help = new StringBuilder();
            help.append("請輸入" + tip + ":");
            System.out.println(help.toString());
            if (scanner.hasNext()) {
                String ipt = scanner.next();
                if (StringUtils.isNotBlank(ipt)) {
                    return ipt;
                }
            }
            throw new MybatisPlusException("請輸入正確的" + tip + "!");
        }
    
        public static void main(String[] args) {
            // 代碼生成器
            AutoGenerator mpg = new AutoGenerator();
    
            // 1. 全局配置
            GlobalConfig gc = new GlobalConfig();
            // 項目根目錄
            String projectPath = System.getProperty("user.dir");
            // 生成代碼的輸出目錄:一般這個就是固定的,這裡不用寫到具體的哪個包,因為下面會單獨配置包名
            gc.setOutputDir(projectPath + "/src/main/java");
            // 生成代碼的author
            gc.setAuthor("javalover");
            // 生成代碼後,是否自動打開生成的目錄:這裡我們不需要,因為就是生成到當前項目
            gc.setOpen(false);
            // 設置全局配置
            mpg.setGlobalConfig(gc);
    
            // 2. 數據源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://localhost:3306/guns?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&nullCatalogMeansCurrent=true");
            dsc.setDriverName("com.mysql.cj.jdbc.Driver");
            dsc.setUsername("root");
            dsc.setPassword("root");
            mpg.setDataSource(dsc);
    
            // 3. 包配置
            PackageConfig pc = new PackageConfig();
            // 設置包名:和上面的輸出目錄進行拼接(ourDir+parent)
            pc.setParent("cn.stylefeng.guns.modular.business");
            // 檢測命令行輸入的模塊名:和上面的包名進行拼接(outDir+parent+moduleName),生成代碼都會放到這個模塊下
            pc.setModuleName(scanner("模塊名"));
            mpg.setPackageInfo(pc);
    
            // 4. 策略配置
            StrategyConfig strategy = new StrategyConfig();
            // 自動生成 實體類的命名:數據庫映射到實體類,下劃線轉駝峰
            strategy.setNaming(NamingStrategy.underline_to_camel);
            // 這裡如果不設置,會跟隨上面實體類的命名設置
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
            // 字段註解:這裡我們把表字段的註解打開,比如@TableField("car_name")
            strategy.setEntityTableFieldAnnotationEnable(true);
            // 實體類的父類:如果有就配置,記得加包名
            strategy.setSuperEntityClass("cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity");
            // 映射類的父類:如果有就配置,記得加包名
            strategy.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper");
            // 服務接口的父類:如果有就配置,記得加包名
            strategy.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService");
            // 服務實現類的父類:如果有就配置,記得加包名
            strategy.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl");
            // 控制器類的父類:如果有就配置,記得加包名
            // strategy.setSuperControllerClass("");
    
            // lombok:是否開啟Lombok的註解,比如@Data,@EqualsAndHashCode(callSuper = true)
            strategy.setEntityLombokModel(true);
            // 控制器的@RestController註解:是否開啟,不開啟則默認為@Controller
            strategy.setRestControllerStyle(true);
            // 監測命令行的輸入:表名
            strategy.setInclude(scanner("表名,多個英文逗號分割").split(","));
            // 控制器的請求映射url風格:駝峰轉連字符,比如"carList"-> "car-list"
            strategy.setControllerMappingHyphenStyle(true);
            // 設置表的前綴:設置後,生成的類名和Controller的請求映射中就不會包含表前綴
            // 設置後為 @RequestMapping("/gps/car"),而不是@RequestMapping("/gps/gps-car")
            // 類名同理
            strategy.setTablePrefix("gps");
            mpg.setStrategy(strategy);
    
            // 5. 配置模板引擎
            // 默認採用velocity模板
    //        mpg.setTemplateEngine(new VelocityTemplateEngine());
            mpg.execute();
        }
    }
    
    

    啟動程序,在命令行依次輸入包名,表名,等待運行完成就可以了

    生成後的目錄結構如下:

    生成後的目錄結構

    可以看到,基本的框架都有了

    下面我們看下生成的entity文件:

    Car.java

    /**
     * <p>
     * 車輛管理
     * </p>
     *
     * @author javalover
     * @since 2021-04-22
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @TableName("gps_car")
    public class Car extends BaseEntity {
    
        private static final long serialVersionUID = 1L;
    
        /**
         * 車輛id
         */
        @TableId("car_id")
        private Long carId;
    
        /**
         * 所屬公司id
         */
        @TableField("company_id")
        private Long companyId;
    
        /**
         * 車輛名稱
         */
        @TableField("car_name")
        private String carName;
    
        /**
         * 車輛種類
         */
        @TableField("car_type")
        private Integer carType;
    
        /**
         * 車輛顏色
         */
        @TableField("car_color")
        private String carColor;
    
        /**
         * 司機
         */
        @TableField("car_driver")
        private String carDriver;
    
        /**
         * 車輛價格
         */
        @TableField("car_price")
        private BigDecimal carPrice;
    
        /**
         * 油耗
         */
        @TableField("fuel_consumption")
        private BigDecimal fuelConsumption;
    
        /**
         * 車牌號
         */
        @TableField("car_number")
        private String carNumber;
    
        /**
         * 車架號
         */
        @TableField("frame_number")
        private String frameNumber;
    
        /**
         * 載重
         */
        @TableField("load_weight")
        private BigDecimal loadWeight;
    
        /**
         * 車照片
         */
        @TableField("car_img")
        private String carImg;
    
        /**
         * 車輛實時定位
         */
        @TableField("car_location")
        private String carLocation;
    }
    
    

    可以看到,注釋的很詳細啊,多好(字段的注釋是根據數據庫的注釋來的)

在線代碼生成

就是在第三方的網站,配置各種參數,點擊生成就可以了,然後下載到本地

這種方法的好處是,前期不用太多配置,使用方便

缺點就是

  • 需要在線配置一個小型的數據庫,上傳SQL語句

  • 生成後,需要拉到本地項目中

  • 不夠靈活,比如父類的配置等

其實它的缺點就是因為它的簡單導致的

這種就比較適合新的項目,想要快速上手體驗的朋友

因為在線的操作很簡單,這裡給出鏈接,具體操作大家體驗下就知道了

在線鏈接://gen.stylefeng.cn/#/createCode

總結

自動生成代碼的方式有很多,而這裡的只是冰山一角

角1:基於Mybatis-Plus官網的例子(靈活,功能全)

角2:基於第三方的在線生成(簡單,上手快)

後記

最後,感謝大家的觀看,謝謝

期待官人們的點贊哦