Mybatis Flex代码生成器抽象类

mybatis-flex代码生成器抽象类

添加依赖

<dependency>
    <groupId>com.mybatis-flex</groupId>
    <artifactId>mybatis-flex-spring-boot-starter</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>com.mybatis-flex</groupId>
    <artifactId>mybatis-flex-processor</artifactId>
    <version>1.6.1</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>com.mybatis-flex</groupId>
    <artifactId>mybatis-flex-codegen</artifactId>
    <version>1.6.1</version>
</dependency>

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.32</version>
</dependency>

代码生成器抽象类

package cn.com.wuhm.mybatis.flex.utils;

import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.*;
import com.mybatisflex.codegen.dialect.JdbcTypeMapping;
import com.mybatisflex.codegen.template.impl.EnjoyTemplate;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 对代码生成器的封装抽象类
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/30
 */
public abstract class AbstractFlexCodegen {

    /**
     * 代码生成
     */
    public void codegen(){
        Generator generator = new Generator(this.getDatasource(), this.createGlobalConfig());
        generator.generate();
    }

    private GlobalConfig createGlobalConfig(){
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();
        // 设置注释配置
        this.setJavadocConfig(globalConfig);

        // 设置包配置
        this.setPackageConfig(globalConfig);

        // 设置策略配置
        this.setStrategyConfig(globalConfig);

        // 设置模板配置
        this.setTemplateConfig(globalConfig);

        // 设置entity配置
        this.setEntityConfig(globalConfig);

        // 设置mapper配置
        this.setMapperConfig(globalConfig);

        // 设置mapperXml配置
        this.setMapperXmlConfig(globalConfig);

        // 设置service配置
        this.setServiceConfig(globalConfig);

        // 设置serviceImpl配置
        this.setServiceImplConfig(globalConfig);

        // 设置controller配置
        this.setControllerConfig(globalConfig);

        // 设置TableDef配置
        this.setTableDefConfig(globalConfig);

        // 设置全局列配置
        this.setGlobalColumnConfig(globalConfig);

        // 配置全局字段映射
        this.jdbcTypeMapping();

        // 设置要生成的模块
        this.setGlobalGenFile(globalConfig);

        return globalConfig;
    }

    /**
     * 获取数据源
     * @return
     */
    private DataSource getDatasource(){
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(this.getUrl());
        dataSource.setUsername(this.getUsername());
        dataSource.setPassword(this.getPassword());
        return dataSource;
    }

    /**
     * 包配置信息
     * @return
     */
    private void setPackageConfig(GlobalConfig globalConfig){
        PackageConfig packageConfig = globalConfig.getPackageConfig();
        // 基础包名
        packageConfig.setBasePackage(this.basePackage());
        if(this.isMultiModule() && StringUtils.hasText(this.multiModuleName())){
            // 设置多模块名的生成路径
            packageConfig.setSourceDir(System.getProperty("user.dir") + "/" + this.isMultiModule() + "/src/main/java");
        }
    }

    /**
     * 是否多模块工程
     * @return
     */
    protected boolean isMultiModule(){
        return false;
    }

    /**
     * 多模块名称
     * @return
     */
    protected String multiModuleName(){
        return "";
    }

    /**
     * 设置注释
     * @param globalConfig
     */
    private void setJavadocConfig(GlobalConfig globalConfig){
        JavadocConfig javadocConfig = globalConfig.getJavadocConfig();
        javadocConfig.setAuthor("mybatis-flex");
//        javadocConfig.setSince();
    }

    /**
     * 包生成策略
     * @return
     */
    private void setStrategyConfig(GlobalConfig globalConfig){
        StrategyConfig strategyConfig = globalConfig.getStrategyConfig();
        strategyConfig.setTablePrefix(this.tablePrefix());
        strategyConfig.setGenerateTable(this.tables());
    }

    /**
     * 生成的表前缀
     * @return
     */
    protected String tablePrefix(){
        return null;
    }

    /**
     * 模板配置
     * @param globalConfig
     */
    private void setTemplateConfig(GlobalConfig globalConfig){
        TemplateConfig templateConfig = globalConfig.getTemplateConfig();
        // 这里可以指定模板的类型有Freemarker,EnjoyTemplate(Flex自带的)
        templateConfig.setTemplate(new EnjoyTemplate());

    }

    /**
     * 实体类配置
     * @param globalConfig
     */
    private void setEntityConfig(GlobalConfig globalConfig){
        EntityConfig entityConfig = globalConfig.getEntityConfig();
        entityConfig.setClassSuffix("");
        // 是否开启lombok注解
        entityConfig.setOverwriteEnable(this.overwriteEnable());
        entityConfig.setWithLombok(this.enableLombok());
        entityConfig.setWithSwagger(this.enableSwagger());
        entityConfig.setSuperClass(this.entitySupperClass());
    }

    /**
     * 默认关闭Lombok注解
     * @return
     */
    protected boolean enableLombok(){
        return false;
    }

    /**
     * 默认关闭swagger注解
     * @return
     */
    protected boolean enableSwagger(){
        return false;
    }

    /**
     * 实体类父类的类全限定名
     * @return
     */
    protected Class entitySupperClass(){
        return null;
    }

    /**
     * 设置mapper配置
     * @param globalConfig
     */
    private void setMapperConfig(GlobalConfig globalConfig){
        MapperConfig mapperConfig = globalConfig.getMapperConfig();
        // 默认mapper文件永不覆盖
        mapperConfig.setOverwriteEnable(false);
    }

    /**
     * 设置service配置
     * @param globalConfig
     */
    private void setServiceConfig(GlobalConfig globalConfig){
        ServiceConfig serviceConfig = globalConfig.getServiceConfig();
        serviceConfig.setClassPrefix("I");
        // 默认service文件永不覆盖
        serviceConfig.setOverwriteEnable(false);
    }

    /**
     * 设置serviceImpl配置
     * @param globalConfig
     */
    private void setServiceImplConfig(GlobalConfig globalConfig){
        ServiceImplConfig serviceImplConfig = globalConfig.getServiceImplConfig();
        // 默认mapper文件永不覆盖
        serviceImplConfig.setOverwriteEnable(false);
    }

    /**
     * controller配置
     * @param globalConfig
     */
    private void setControllerConfig(GlobalConfig globalConfig){
        ControllerConfig controllerConfig = globalConfig.getControllerConfig();
        // 默认mapper文件永不覆盖
        controllerConfig.setOverwriteEnable(false);
        controllerConfig.setSuperClass(this.restSupperClass());
        controllerConfig.setRestStyle(this.enableRestStyle());
    }

    /**
     * controller的父类
     * @return
     */
    protected Class restSupperClass(){
        return null;
    }

    /**
     * 是否生成restful风格的接口
     * @return
     */
    protected boolean enableRestStyle(){
        return false;
    }

    /**
     * TableDef配置
     * @param globalConfig
     */
    private void setTableDefConfig(GlobalConfig globalConfig){
        TableDefConfig tableDefConfig = globalConfig.getTableDefConfig();
        // 默认mapper文件永不覆盖
        tableDefConfig.setOverwriteEnable(this.overwriteEnable());
    }

    /**
     * MapperXmlConfig配置
     * @param globalConfig
     */
    private void setMapperXmlConfig(GlobalConfig globalConfig){
        MapperXmlConfig mapperXmlConfig = globalConfig.getMapperXmlConfig();
        // 默认mapper文件永不覆盖
        mapperXmlConfig.setOverwriteEnable(false);
    }


    /**
     * 设置全局列配置
     * @param globalConfig
     */
    protected void setGlobalColumnConfig(GlobalConfig globalConfig){
        Map<String, ColumnConfig> columnConfigMap = new HashMap<>();
        ColumnConfig columnConfig = new ColumnConfig();
        columnConfig.setColumnName(this.globalPrimaryKeyName());
        columnConfig.setPrimaryKey(true);
        columnConfig.setKeyType(this.getKeyType());
        columnConfigMap.put(this.globalPrimaryKeyName(), columnConfig);
        globalConfig.getStrategyConfig().setColumnConfigMap(columnConfigMap);
    }

    /**
     * 全局主键名称:默认ID
     * @return
     */
    private String globalPrimaryKeyName(){
        return "id";
    }
    /**
     * 主键生成策略默认:KeyType.Auto
     * @return
     */
    protected KeyType getKeyType(){
        return KeyType.Auto;
    }

    /**
     * 设置全局字段映射规则
     */
    protected void jdbcTypeMapping(){
        JdbcTypeMapping.registerMapping(LocalDateTime.class, Date.class);
    }


    /**
     * 设置需要生成的文件模块:默认只生成entity,tableDef,mapper,mapperXml,service,serviceImpl
     * @param globalConfig
     */
    protected void setGlobalGenFile(GlobalConfig globalConfig){
        globalConfig.enableEntity();
        globalConfig.enableTableDef();
        globalConfig.enableMapper();
        globalConfig.enableMapperXml();
        globalConfig.enableService();
        globalConfig.enableServiceImpl();
        if(!this.disableController()){
            globalConfig.enableController();
        }
        if(!this.disablePackageInfo()){
            globalConfig.enablePackageInfo();
        }
    }

    /**
     * 禁止生成controller:默认不生成
     * @return
     */
    protected boolean disableController(){
        return true;
    }

    /**
     * 默认不生成packageInfo
     *
     * @return
     */
    protected boolean disablePackageInfo(){
        return true;
    }
    /**
     * 设置数据库连接地址
     * @return
     */
    public abstract String getUrl();

    /**
     * 数据库账号
     * @return
     */
    public abstract String getUsername();

    /**
     * 数据库密码
     * @return
     */
    public abstract String getPassword();

    /**
     * 设置包基础路径
     * @return
     */
    public abstract String basePackage();

    /**
     * 需要生成的数据库表名
     *
     * @return
     */
    public abstract String[] tables();

    /**
     * 是否重新生成文件
     * @return
     */
    protected boolean overwriteEnable(){
        return true;
    }
}

使用

定义一个工具类,继承这个抽象类,并实现里面的抽象方法即可

package cn.com.wuhm.mybatis.flex.utils;

/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/30
 */
public class CodegenUtil extends AbstractFlexCodegen{

    public static void main(String[] args) {
        CodegenUtil codegenUtil = new CodegenUtil();
        codegenUtil.codegen();
    }

    @Override
    public String getUrl() {
        return "jdbc:mysql://127.0.0.1:3306/flex_test?characterEncoding=utf-8";
    }

    @Override
    public String getUsername() {
        return "root";
    }

    @Override
    public String getPassword() {
        return "xxxxxx";
    }

    @Override
    public String basePackage() {
        return "cn.com.wuhm.mybatis.flex";
    }

    @Override
    public String[] tables() {
        return new String[]{"tb_account"};
    }


    @Override
    protected String tablePrefix() {
        return "tb_";
    }
}

结果:

0%