import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.converts.ClickHouseTypeConvert;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.ClickHouseQuery;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * MpGenerator启动类
 *
 * @author Tuomasi
 * @date
 */
public class MpGenerator {

    private static final Logger logger = LoggerFactory.getLogger(MpGenerator.class);

    private static final Properties CONF = new Properties();

    static {
        try {
            InputStream in = MpGenerator.class.getClassLoader().getResourceAsStream("mp-generate.properties");
            CONF.load(in);
        } catch (IOException e) {
            logger.error("发生异常:", e);
        }
    }

    /**
     * 数据库配置
     */
    private static DataSourceConfig.Builder DATA_SOURCE_CONFIG() {
        System.out.print("请输入数据源(mysql/clickhouse):");
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        if("mysql".equals(input.trim().toLowerCase())) {
            String url = CONF.getProperty("mysql.jdbc.url");
            String user = CONF.getProperty("mysql.jdbc.user");
            String pswd = CONF.getProperty("mysql.jdbc.password");
            String schema = CONF.getProperty("mysql.jdbc.schema");
            return new DataSourceConfig.Builder(url, user, pswd)
                    .dbQuery(new MySqlQuery())
                    .schema(schema)
                    .typeConvert(new MySqlTypeConvert())
                    .keyWordsHandler(new MySqlKeyWordsHandler());
        } else if("clickhouse".equals(input.trim().toLowerCase())) {
            String url = CONF.getProperty("clickhouse.jdbc.url");
            String user = CONF.getProperty("clickhouse.jdbc.user");
            String pswd = CONF.getProperty("clickhouse.jdbc.password");
            String schema = CONF.getProperty("clickhouse.jdbc.schema");
            return new DataSourceConfig.Builder(url, user, pswd)
                    .dbQuery(new ClickHouseQuery())
                    .schema(schema)
                    .typeConvert(new ClickHouseTypeConvert())
                    .keyWordsHandler(new MySqlKeyWordsHandler());
        } else {
            throw new RuntimeException("不支持该数据源!");
        }
    }

    /**
     * 全局配置
     */
    private static BiConsumer<Function<String, String>, GlobalConfig.Builder> GLOBAL_CONFIG() {
        String root_path = System.getProperty("user.dir");
        return (scanner, builder) -> builder.author(scanner.apply("请输入作者名称?"))
                //不覆盖重名文件
                //.fileOverride()
                .outputDir(root_path+"/src/main/java")
                .enableSwagger()
                .dateType(DateType.TIME_PACK)
                .commentDate("yyyy-MM-dd HH:mm:ss")
                //代码生成后不打开目录
                .disableOpenDir();
    }

    /**
     * 包配置
     */
    private static BiConsumer<Function<String, String>, PackageConfig.Builder> PACKAGE_CONFIG() {
        return (scanner, builder) -> builder.parent("com")
                .moduleName("test")
                .entity("model.domain.mp")
                .service("service.mp")
                .serviceImpl("service.impl.mp")
                .mapper("mapper.mp")
                .xml("mapper.mp.xml")
                .controller("controller.mp")
                .other("other.mp");
    }

    /**
     * 策略配置
     */
    private static BiConsumer<Function<String, String>, StrategyConfig.Builder> STRATEGY_CONFIG() {
        return (scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?(所有输入all)")))
                .controllerBuilder()
                .enableRestStyle()
                .enableHyphenStyle()
                .entityBuilder()
                .enableLombok()
                .enableChainModel()
                .addTableFills(
                        new Column("create_time", FieldFill.INSERT),
                        new Column("update_time", FieldFill.UPDATE)
                );
    }

    /**
     * 处理所有表
     */
    private static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    public static void main(String[] args) {
        //数据库配置 区分clickhouse和mysql
        FastAutoGenerator.create(DATA_SOURCE_CONFIG())
                // 全局配置
                .globalConfig(GLOBAL_CONFIG())
                // 包配置
                .packageConfig(PACKAGE_CONFIG())
                // 策略配置
                .strategyConfig(STRATEGY_CONFIG())
                /*
                    模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
                   .templateEngine(new BeetlTemplateEngine())
                   .templateEngine(new FreemarkerTemplateEngine())
                 */
                .execute();
    }

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐