首頁 > 軟體

使用MybatisPlus自定義模版中能獲取到的資訊

2022-05-21 19:00:46

使用MybatisPlus的AutoGenerator生成程式碼

這個可自行官網檢視,或者搜尋引擎查一下一大堆可以參考的,這裡就不過多敘述。

模版中能獲取到哪些資訊

官方沒有給出在自定義模版中你能獲取到哪些資訊來生成你想要的程式碼,所以本人就看了一下原始碼,能獲取到的資訊都在com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine類的getObjectMap方法中,如下:

    /**
     * <p>
     * 渲染物件 MAP 資訊
     * </p>
     *
     * @param tableInfo 表資訊物件
     * @return
     */
    public Map<String, Object> getObjectMap(TableInfo tableInfo) {
        Map<String, Object> objectMap = new HashMap<>();
        ConfigBuilder config = this.getConfigBuilder();
        if (config.getStrategyConfig().isControllerMappingHyphenStyle()) {
            objectMap.put("controllerMappingHyphenStyle", config.getStrategyConfig().isControllerMappingHyphenStyle());
            objectMap.put("controllerMappingHyphen", StringUtils.camelToHyphen(tableInfo.getEntityPath()));
        }
        objectMap.put("restControllerStyle", config.getStrategyConfig().isRestControllerStyle());
        objectMap.put("package", config.getPackageInfo());
        GlobalConfig globalConfig = config.getGlobalConfig();
        objectMap.put("author", globalConfig.getAuthor());
        objectMap.put("idType", globalConfig.getIdType() == null ? null : globalConfig.getIdType().toString());
        objectMap.put("logicDeleteFieldName", config.getStrategyConfig().getLogicDeleteFieldName());
        objectMap.put("versionFieldName", config.getStrategyConfig().getVersionFieldName());
        objectMap.put("activeRecord", globalConfig.isActiveRecord());
        objectMap.put("kotlin", globalConfig.isKotlin());
        objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        objectMap.put("table", tableInfo);
        objectMap.put("enableCache", globalConfig.isEnableCache());
        objectMap.put("baseResultMap", globalConfig.isBaseResultMap());
        objectMap.put("baseColumnList", globalConfig.isBaseColumnList());
        objectMap.put("entity", tableInfo.getEntityName());
        objectMap.put("entityColumnConstant", config.getStrategyConfig().isEntityColumnConstant());
        objectMap.put("entityBuilderModel", config.getStrategyConfig().isEntityBuilderModel());
        objectMap.put("entityLombokModel", config.getStrategyConfig().isEntityLombokModel());
        objectMap.put("entityBooleanColumnRemoveIsPrefix", config.getStrategyConfig().isEntityBooleanColumnRemoveIsPrefix());
        objectMap.put("superEntityClass", this.getSuperClassName(config.getSuperEntityClass()));
        objectMap.put("superMapperClassPackage", config.getSuperMapperClass());
        objectMap.put("superMapperClass", this.getSuperClassName(config.getSuperMapperClass()));
        objectMap.put("superServiceClassPackage", config.getSuperServiceClass());
        objectMap.put("superServiceClass", this.getSuperClassName(config.getSuperServiceClass()));
        objectMap.put("superServiceImplClassPackage", config.getSuperServiceImplClass());
        objectMap.put("superServiceImplClass", this.getSuperClassName(config.getSuperServiceImplClass()));
        objectMap.put("superControllerClassPackage", config.getSuperControllerClass());
        objectMap.put("superControllerClass", this.getSuperClassName(config.getSuperControllerClass()));
        return objectMap;
    }

下面我就順便整理一下方便以後檢視

屬性型別描述範例
controllerMappingHyphenStylebooleancontrollerMapping是否為連字元形式駝峰:@RequestMapping("/managerUserActionHistory")連字元:@RequestMapping("/manager-user-action-history")
controllerMappingHyphenString實體類的連字元形式manager-user-action-history
restControllerStyleboolean是否為RestController模式 
packageMap所有包設定資訊 
package.EntityStringEntity所在包路徑com.geek.sean.test.model
package.MapperStringMapper所在包路徑com.geek.sean.test.mapper
package.XmlStringMapper的xml檔案所在包路徑com.geek.sean.test.mapper.xml
package.ServiceImplStringService實現類所在包路徑com.geek.sean.test.service.impl
package.ServiceStringService所在包路徑com.geek.sean.test.service
package.ControllerStringController所在包路徑com.geek.sean.test.controller
authorStringGlobalConfig中設定的author 
idTypeStringGlobalConfig中設定的idType 
logicDeleteFieldNameString策略設定項中設定的邏輯刪除屬性名稱 
versionFieldNameString策略設定項中設定的樂觀鎖屬性名稱 
activeRecordboolean是否開啟ActiveRecord模式 
kotlinboolean是否開啟 Kotlin 模式 
dateString當前日期(yyyy-MM-dd)2019-07-09
tableTableInfo表資訊,關聯到當前欄位資訊 
table.nameString表名例:sys_user
table.commentString表描述使用者資訊表
table.entityNameString實體類名稱SysUser
table.mapperNameStringMapper類名SysUserMapper
table.xmlNameStringMapper對應的xml名稱SysUserMapper
table.serviceNameStringService名稱SysUserService
table.serviceImplNameStringService實現類名稱SysUserServiceImpl
table.controllerNameStringController名稱SysUserController
table.fieldsList<TableField>欄位資訊集合 
table.fields[n].nameString欄位名稱user_id
table.fields[n].typeString欄位型別int(11)、varchar(64)、timestamp、char(1)
table.fields[n].propertyNameString屬性名userId、userName
table.fields[n].columnTypeString屬性型別String、Integer
table.fields[n].commentString欄位描述使用者名稱
table.importPackagesList<String>引入包集合[‘com.baomidou.mybatisplus.enums.IdType’,‘java.util.Date’]
table.fieldNamesString表欄位名,逗號分隔user_id, user_name, password
enableCacheboolean是否在xml中新增二級快取設定 
baseResultMapboolean是否開啟 BaseResultMap 
baseColumnListboolean是否開啟 baseColumnList 
entityStringEntity類名 
entityColumnConstantboolean【實體】是否生成欄位常數(預設 false) 
entityBuilderModelboolean【實體】是否為構建者模型(預設 false) 
entityLombokModelboolean【實體】是否為lombok模型(預設 false) 
entityBooleanColumnRemoveIsPrefixbooleanBoolean型別欄位是否移除is字首(預設 false)比如 : 資料庫欄位名稱 : ‘is_xxx’,型別為 : tinyint. 在對映實體的時候則會去掉is,在實體類中對映最終結果為 xxx
superEntityClassStringEntity父類別BaseEntity
superMapperClassPackageStringMapper父類別包路徑com.baomidou.mybatisplus.mapper.BaseMapper
superMapperClassStringMapper父類別BaseMapper
superServiceClassPackageStringService父類別包路徑com.baomidou.mybatisplus.service.IService
superServiceClassStringService父類別IService
superServiceImplClassPackageStringService實現類父類別包路徑com.baomidou.mybatisplus.service.impl.ServiceImpl
superServiceImplClassStringService實現類父類別ServiceImpl
superControllerClassPackageStringController類父類別包路徑 
superControllerClassStringController父類別 

總結了一上午,個別欄位沒有放上,自己用到時候可以再去原始碼看看。

MybatisPlus遇到的坑

springBoot專案整合mybatis-plus、lombok時遇到了使用程式碼生成器生成實體類及mapper後,呼叫方法時報錯找不到mapper,後經過一項項調整pom檔案內jar包依賴,才知道mybatis-plus版本號存在很多不相容。

1、匯入依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- mybatis的orm外掛 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.1.9</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>1.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--阿里資料庫連結依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

因為我用的是阿里雲的資料庫,所以需要匯入阿里雲及資料庫依賴,lombok為簡化實體類生成的外掛jar包。

注意:千萬注意mybatis-plus版本!!!千萬注意mybatis-plus版本!!!千萬注意mybatis-plus版本!!!

2、設定分頁組態檔和資料來源

package com.ds.tech.config;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
/**
 * 資料來源設定
 */
@Configuration
public class DataSourceConfig {
 
    @Bean(name="dataSource")
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource(){
        return new DruidDataSource();
    }
 
    // 設定事物管理器
    @Bean(name="transactionManager")
    public DataSourceTransactionManager transactionManager(){
        return new DataSourceTransactionManager(dataSource());
    }
}
package com.ds.tech.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
@Configuration
//掃描dao或者是Mapper介面
@MapperScan("com.ds.tech.mapper*")
public class MybatisPlusConfig {
  /**
   * mybatis-plus 分頁外掛
   */
  @Bean
  public PaginationInterceptor paginationInterceptor(){
      PaginationInterceptor page = new PaginationInterceptor();
      page.setDialectType("mysql");
      return page;
  }
}

設定程式碼生成器,然後就可以生成程式碼使用了 

package com.ds.tech;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
 * <p>
 * 程式碼生成器演示
 * </p>
 */
public class MpGenerator { 
    final static String  dirPath = "D://mybatis";
 
    /**
     * <p>
     * MySQL 生成演示
     * </p>
     */
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        // 選擇 freemarker 引擎,預設 Veloctiy
        //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
 
        // 全域性設定
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(dirPath);
        gc.setAuthor("dashen");
        gc.setFileOverride(true); //是否覆蓋
        gc.setActiveRecord(false);// 不需要ActiveRecord特性的請改為false
        gc.setEnableCache(false);// XML 二級快取
        gc.setBaseResultMap(false);// XML ResultMap
        gc.setBaseColumnList(false);// XML columList
 
        // 自定義檔案命名,注意 %s 會自動填充表實體屬性!
        // gc.setMapperName("%sDao");
        // gc.setXmlName("%sMapper");
        // gc.setServiceName("MP%sService");
        // gc.setServiceImplName("%sServiceDiy");
        // gc.setControllerName("%sAction");
        mpg.setGlobalConfig(gc);
 
        // 資料來源設定
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setTypeConvert(new MySqlTypeConvert(){
            // 自定義資料庫表欄位型別轉換【可選】
//            @Override
//            public DbColumnType processTypeConvert(String fieldType) {
//                System.out.println("轉換型別:" + fieldType);
//                // 注意!!processTypeConvert 存在預設型別轉換,如果不是你要的效果請自定義返回、非如下直接返回。
//                return super.processTypeConvert(fieldType);
//            }
        });
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("k");
        dsc.setPassword("mj^");
        dsc.setUrl("jdbc:mysql://rm-2zql.rds.aliyuncs.06/mjmk_dev?useUnicode=true&characterEncoding=utf-8");
        mpg.setDataSource(dsc);
 
        // 策略設定
        StrategyConfig strategy = new StrategyConfig();
        // strategy.setCapitalMode(true);// 全域性大寫命名 ORACLE 注意
        strategy.setTablePrefix(new String[] { "tb_", "tsys_" });// 此處可以修改為您的表字首
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        strategy.setInclude(new String[] { "store" }); // 需要生成的表
        // strategy.setExclude(new String[]{"test"}); // 排除生成的表
        // 自定義實體父類別
        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
        // strategy.setSuperEntityClass("java.io.Serializable");
        // 自定義實體,公共欄位
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
        // 自定義 mapper 父類別
        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
        // 自定義 service 父類別
        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
        // 自定義 service 實現類父類別
        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
        // 自定義 controller 父類別
        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
        // 【實體】是否生成欄位常數(預設 false)
        // public static final String ID = "test_id";
        // strategy.setEntityColumnConstant(true);
        // 【實體】是否為構建者模型(預設 false)
        // public User setName(String name) {this.name = name; return this;}
         strategy.setEntityBuilderModel(true);
         strategy.setEntityLombokModel(true);
        mpg.setStrategy(strategy);
 
        // 包設定
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.ds.tech");
//        pc.setModuleName("");
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setServiceImpl("serviceImpl");
        pc.setXml("mapperXml");
 
        mpg.setPackageInfo(pc);
 
        // 注入自定義設定,可以在 VM 中使用 cfg.abc 【可無】
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };
 
        // 自定義 xxList.jsp 生成
        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
/*        focList.add(new FileOutConfig("/template/list.jsp.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定義輸入檔名稱
                return "D://my_" + tableInfo.getEntityName() + ".jsp";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);*/
 
        // 調整 xml 生成目錄演示
/*        focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return dirPath + tableInfo.getEntityName() + "Mapper.xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        */
        mpg.setCfg(cfg);
 
        // 關閉預設 xml 生成,調整生成 至 根目錄
/*        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);*/
 
        // 自定義模板設定,可以 copy 原始碼 mybatis-plus/src/main/resources/templates 下面內容修改,
        // 放置自己專案的 src/main/resources/templates 目錄下, 預設名稱一下可以不設定,也可以自定義模板名稱
        // TemplateConfig tc = new TemplateConfig();
        // tc.setController("...");
        // tc.setEntity("...");
        // tc.setMapper("...");
        // tc.setXml("...");
        // tc.setService("...");
        // tc.setServiceImpl("...");
        // 如上任何一個模組如果設定 空 OR Null 將不生成該模組。
        // mpg.setTemplate(tc);
 
        // 執行生成
        mpg.execute();
 
        // 列印注入設定【可無】
        System.err.println(mpg.getCfg().getMap().get("abc"));
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com