MP 代码生成器工具类

Mybatis-Plus 代码生成器工具类

对 MP 的代码生成器写一个简单的工具类:

public class Main {
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入" + tip + ":");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (!StringUtils.isEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
//        String parentPath = System.getProperty("user.dir"); // 如果工程就一个模块只设置 parentName
        String parentPath = "E:\\xxx\\xxx\\"; // 如果工程就一个模块只设置 parentName
        String submoduleName = "test"; // 如果有子模块还需设置 submoduleName 一般针对一个模块的表
        String generatingPath = "com.cnda.server"; // 逆向生成的代码的根路径


        /*
         *  AutoGenerator 代码生成器
         */
        AutoGenerator ag = new AutoGenerator();

        System.out.println(parentPath);

        //1. 全局配置
        GlobalConfig config = new GlobalConfig();

        /*
         * GlobalConfig主要配置的属性有:
         * -- 是否支持AR模式
         * -- 生成代码结构的根路径
         * -- 文件是否覆盖
         * -- 主键策略
         * -- 生成基本的resultMap
         * -- 生成基本的SQL片段,也就是xml文件中的sql标签,包含了表中的字段名
         */


        config  // 设置作者名
                .setAuthor("cnda")
                // 是否支持AR模式:AR 模式相对于原始的 MP 模式来说,可以通过 pojo 实体类(继承了 Model 类)
                // 直接操作数据库。但是底层任然是使用 mapper 进行操作。
                // .setActiveRecord(true)

                // 生成路径:项目地址 + 模块地址,一般情况下
                .setOutputDir(parentPath + "/"+ submoduleName+"/src/main/java")
                // 文件覆盖
                //.setFileOverride(false)
                // 打开输出目录
                .setOpen(false)
                // 主键策略
                .setIdType(IdType.AUTO)
                // 设置日期格式          
                //.setDateType(DateType.ONLY_DATE)
                // 设置生成的service接口的名字的首字母是否为I,默认Service是以I开头的
                .setServiceName("%sService")
                //生成基本的resultMap
                .setBaseResultMap(true)
                // 实体属性 swagger2 注解
                //.setSwagger2(true)
                //生成基本的SQL片段
                .setBaseColumnList(true);

        //2. 数据源配置
        /**
         * DataSourceConfig的主要属性配置
         * 此处为MP连接数据库读取数据库中表的属性和字段名,帮我们自动生成项目结构和数据库中表对应的实体类
         * -- 数据库类型
         */
        DataSourceConfig dsConfig = new DataSourceConfig();
        // 设置数据库类型
        dsConfig//.setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUrl("jdbc:mysql://localhost:3306/yeb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai")
                .setUsername("root")
                .setPassword("root");

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {

            }
        };

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 通过模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        // 定义了 mapper.xml 文件输出的位置!指向的是 resources/mapper/*
        focList.add(new FileOutConfig(templatePath) {

            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return parentPath + "/"+submoduleName+"/src/main/resources/mapper/"+tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);


        //3. 策略配置globalConfiguration中
        /**
         * StrategyConfig的主要属性配置
         * -- 全局大写命名
         * -- 数据库表映射到实体类的命名策略
         * -- 生成表(要生成实体类的表名,支持多表·11一起生成,以数组的形式填写)
         * -- 设置表的前缀(TablePrefix)
         */
        StrategyConfig stConfig = new StrategyConfig();
        //全局大写命名
        stConfig.setCapitalMode(true)
                // 数据库表映射到实体的命名策略
                .setNaming(NamingStrategy.underline_to_camel) // 驼峰命名
                // 数据库表字段映射实体类的命名策略
                .setColumnNaming(NamingStrategy.no_change) // 不做任何改变
                // lombok 模型
                .setEntityLombokModel(true)
                // 生成 @RestController 控制器
                .setRestControllerStyle(true)
                // 生成的表,多个表以英文逗号区分
                .setInclude(scanner("表名,多个英文逗号分割").split(",")) // 由 scanner 控制台输入多个表名进行逆向工程生成代码
                //url中驼峰转连字符
                .setControllerMappingHyphenStyle(true)
                // 设置表的前缀,防止生成实体类时出现表的前缀
                .setTablePrefix("t_");

        //4. 包名策略配置
        /**
         * PackageConfig的主要属性配置
         * 公共包--Parent
         */
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent(generatingPath)
                .setMapper("mapper")
                .setService("service")
                .setController("controller")
                .setServiceImpl("service.impl")
                .setEntity("pojo");
        // mapper.xml 之前在 InjectionConfig 那里配置过了
        //.setXml("mapper");

        //5. 整合配置
        /**
         * 整合需要的对象有:
         * --> GlobalConfig
         * --> DataSourceConfig
         * --> StrategyConfig
         * --> PackageConfig
         */
        ag.setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setCfg(cfg)
                .setTemplate(templateConfig)
                .setTemplateEngine(new FreemarkerTemplateEngine())
                .setPackageInfo(pkConfig);
        //6. 执行
        ag.execute();
        System.out.println("======= 代码生成完毕 ========");
    }
}

上面应该能满足大部分基础的项目结构。需要注意的是前面几个路径的变量设置。

还有一个就是 mapper.xml 一般是在项目的 resource 目录下,如果需要设置到与 mapper 接口一个包下,就需要将 ag.setCfg(cfg) 删除,然后再 pkConfig.setXml("path") 保证与 setMapper("path") 保持一致即可。

posted @ 2023-03-07 17:42  CN_DADA  阅读(181)  评论(0编辑  收藏  举报