1. 程式人生 > >Spring-Boot 使用 mybatis-plus-gennretor程式碼生成器生成程式碼+分頁外掛

Spring-Boot 使用 mybatis-plus-gennretor程式碼生成器生成程式碼+分頁外掛

  • 程式碼自動生成器

1.匯入需要的jar包

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- lombok 小辣椒 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.6</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>
        <!-- mybatis-plus-generator 程式碼生成器jar -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

        <!-- freemarker 模板引型 (倆者選其一) -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <!-- velocity 模板引型 (倆者選其一) -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

 

2 . 模板引型的選擇

package com.shi.generator;

import java.util.Scanner;

/**
 * 模板引型的選擇
 */
public class GeneratorTest {

    /**
     * 讀取控制檯內容
     */
    public static int scanner() {
        Scanner scanner = new Scanner(System.in);
        String help =
                " !!程式碼生成, 輸入 0 表示使用 Velocity 引擎 !!" +
                        "\n對照表:" +
                        "\n0 = Velocity 引擎" +
                        "\n1 = Freemarker 引擎" +
                        "\n請輸入:";
        System.out.println(help);
        int slt = 0;
        // 現在有輸入資料
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if ("1".equals(ipt)) {
                slt = 1;
            }
        }
        return slt;
    }
}

 

3 .  案例

package com.shi.generator;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.*;

/**
 * myBatis-Plus 程式碼生成器案例
 *   說明:該案例生成了controller ,service,dao,mapper,entity
 *   加入:Lombok(小辣椒),swagger2
 *
 *   *************需要自定義的變數***************
 */
public class MysqlGenerator extends GeneratorTest {

    /**
     * MySQL 生成演示
     */
    public static void main(String[] args) {
        int result = scanner();

        /****************************配置資訊********************/
        String[] tableName = new String[] { "large_area","machine_component" };/****************************需要生成的表名********************/
        String outputDir = "D:\\project\\shiTest\\shi_Mybatis_plus2\\src\\main\\java";/****************************輸出的專案目錄********************/
        String moduleName = "marchine";/*****************************模組名(需要自己指定)**********/
        String parentPackage = "com.shi"; /****************************自定義父包路徑********************/
        String userName = "";/****************************使用者名稱********************/
        String password = ""; /****************************密碼(url一樣要改)********************/
        String url = "jdbc:mysql://192.168.69.11:3306/shihaifeng?useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=utf8";

//        自定義需要填充的欄位
//        List<TableFill> tableFillList = new ArrayList<>();
//        tableFillList.add(new TableFill("large_area", FieldFill.INSERT_UPDATE));

        // 程式碼生成器
        AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
                // 全域性配置
                new GlobalConfig()
                        .setOutputDir(outputDir)
                        .setFileOverride(true)// 是否覆蓋檔案
                        .setActiveRecord(true)// 開啟 activeRecord 模式
                        .setEnableCache(false)// XML 二級快取
                        .setBaseResultMap(true)// XML ResultMap
                        .setBaseColumnList(true)// XML columList
                        .setIdType(IdType.AUTO)//主鍵生成策略,自增
                        .setSwagger2(true)//生成swagger2註解支援
                        //.setKotlin(true) 是否生成 kotlin 程式碼
                        .setAuthor("shiye")
                // 自定義檔案命名,注意 %s 會自動填充表實體屬性!
                // .setEntityName("%sEntity");
                // .setMapperName("%sDao")
                // .setXmlName("%sDao")
                // .setServiceName("MP%sService")
                // .setServiceImplName("%sServiceDiy")
                // .setControllerName("%sAction")
        ).setDataSource(
                // 資料來源配置
                new DataSourceConfig()
                        .setDbType(DbType.MYSQL) // 資料庫型別
                        .setTypeConvert(new MySqlTypeConvert() {
                            // 自定義資料庫表字段型別轉換【可選】
                            @Override
                            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                                System.out.println("轉換型別:" + fieldType);
                                // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                                //    return DbColumnType.BOOLEAN;
                                // }
                                return super.processTypeConvert(globalConfig, fieldType);
                            }
                        })
                        .setDriverName("com.mysql.jdbc.Driver")
                        .setUsername(userName)
                        .setPassword(password)
                        .setUrl(url)
        ).setStrategy(
                // 策略配置
                new StrategyConfig()
                         .setCapitalMode(true)// 全域性大寫命名
                        // .setDbColumnUnderline(true)//全域性下劃線命名
//                        .setTablePrefix(new String[]{"bmd_", "mp_"})// 此處可以修改為您的表字首
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                         .setInclude(tableName) // 需要生成的表 如果不指定就生成全部的表
                        // .setExclude(new String[]{"test"}) // 排除生成的表
                        // 自定義實體父類
                        // .setSuperEntityClass("com.baomidou.demo.TestEntity")
                        // 自定義實體,公共欄位
//                        .setSuperEntityColumns(new String[]{"test_id"})
//                        .setTableFillList(tableFillList)
//                        .setEntityBooleanColumnRemoveIsPrefix(true)
                // 自定義 mapper 父類
                // .setSuperMapperClass("com.baomidou.demo.TestMapper")
                // 自定義 service 父類
                // .setSuperServiceClass("com.baomidou.demo.TestService")
                // 自定義 service 實現類父類
                // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
                // 自定義 controller 父類
                // .setSuperControllerClass("com.baomidou.demo.TestController")
                // 【實體】是否生成欄位常量(預設 false)
                // public static final String ID = "test_id";
                // .setEntityColumnConstant(true)
                // 【實體】是否為構建者模型(預設 false)
                // public User setName(String name) {this.name = name; return this;}
                // .setEntityBuilderModel(true)
                // 【實體】是否為lombok模型(預設 false)<a href="https://projectlombok.org/">document</a>
                 .setEntityLombokModel(true)
                // Boolean型別欄位是否移除is字首處理
                // .setEntityBooleanColumnRemoveIsPrefix(true)
                // .setRestControllerStyle(true)
                // .setControllerMappingHyphenStyle(true)
        ).setPackageInfo(
                // 包配置
                new PackageConfig()
                        .setModuleName(moduleName)
                        .setParent(parentPackage)
                        .setController("controller")// 這裡是控制器包名,預設web   別的(service,entity...)都可以預設
        ).setCfg(
                // 注入自定義配置,可以在 VM 中使用 cfg.abc 設定的值

                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map<String, Object> map = new HashMap<>();
                        map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                        this.setMap(map);
                    }
                }.setFileOutConfigList(Collections.singletonList(new FileOutConfig(
                        "/templates/mapper.xml" + ((1 == result) ? ".ftl" : ".vm")) {
                    // 自定義輸出檔案目錄  指定生成的mapper.xml檔案輸出位置
                    @Override
                    public String outputFile(TableInfo tableInfo) {
                        return  "d:\\mapper\\" + tableInfo.getEntityName() + ".xml";
                    }
                }))
        ).setTemplate(
                // 關閉預設 xml 生成,調整生成 至 根目錄
                new TemplateConfig().setXml(null)
                // 自定義模板配置,模板可以參考原始碼 /mybatis-plus/src/main/resources/template 使用 copy
                // 至您專案 src/main/resources/template 目錄下,模板名稱也可自定義如下配置:
                // .setController("...");
                // .setEntity("...");
                // .setMapper("...");
                // .setXml("...");
                // .setService("...");
                // .setServiceImpl("...");
        );
        // 執行生成
        if (1 == result) {
            mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        }
        mpg.execute();

        // 列印注入設定,這裡演示模板裡面怎麼獲取注入內容【可無】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }

}

 

  • 分頁外掛 

可以參考官網(https://mp.baomidou.com/guide/page.html)

1. 編寫配置檔案,初始化分頁外掛

/**
 * Spring boot方式
 * @author shfeng
 * @create 2019-07-19 14:25
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.shi.*.mapper.mapper*")
public class MybatisPlusConfig {

    /**
     * 分頁外掛
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

2. 寫測試檔案

/**
     * 這是是使用mybaits的分頁功能 但是分頁不是物理分頁需要改進
     * 增加分頁外掛 PaginationInterceptor 以後 ,使用的是物理分頁
     */
    @Test
    public void getLargerAraByPage(){
        IPage<LargeArea> page = new Page<>();
        page.setSize(2l);
        page.setCurrent(1l);
        Wrapper<LargeArea> queryWrapper = new QueryWrapper<LargeArea>();
        page = largeAreaMapper.selectPage(page,queryWrapper);
        System.out.println("page = " + page);
    }