代码生成器

Posted haocang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码生成器相关的知识,希望对你有一定的参考价值。

代码生成器

添加依赖

  • 添加代码生成器依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.2.0</version>
</dependency>
  • 添加模板引擎依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。

    Velocity(默认)

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.1</version>
</dependency>

? Freemarker

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>

? Beetl

<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.0.13.RELEASE</version>
</dependency>

? 注意!如果您选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎。

AutoGenerator generator = new AutoGenerator();

// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());

// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());

// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());

// other config
...

程序编写

/**
     * 代码生成器入口方法
     */
    public static void main(String[] args) {
        System.out.print("请输入需要生成实体对象的表名:");
        Scanner scanner = new Scanner(System.in);
        String tableName = scanner.nextLine();
        AutoGenerator mpg = INSTANCE.getAutoGenerator(tableName);//配置代码生成器
        mpg.execute();//生成代码
        System.err.println(" TableName【 " + tableName + " 】Generate Success !");
    }



/**
     * 获取AutoGenerator
     */
    private AutoGenerator getAutoGenerator(String tableName) {
        return new AutoGenerator()
                // 全局配置
                .setGlobalConfig(getGlobalConfig())
                // 数据源配置
                .setDataSource(getDataSourceConfig())
                // 策略配置
                .setStrategy(getStrategyConfig(tableName))
                // 包配置
                .setPackageInfo(getPackageConfig())
                // 注入自定义配置,可以在 VM 中使用 ${cfg.abc} 获取属性
                .setCfg(getInjectionConfig())
                //自定义模板
                .setTemplate(getTemplateConfig());
    }


/**
     * 获取GlobalConfig,配置全局变量
     */
    private GlobalConfig getGlobalConfig() {
        
        return new GlobalConfig()
                .setOutputDir(System.getProperty("user.dir") + "/src/main/java")// 输出目录
                .setFileOverride(true)// 是否覆盖文件
                .setActiveRecord(false)// 开启 activeRecord 模式(java不支持这种模式)
                .setEnableCache(false)// XML 二级缓存
                .setBaseResultMap(false)// XML ResultMap
                .setBaseColumnList(false)// XML ColumnList
                .setKotlin(false)// 是否生成 kotlin 代码
                .setOpen(false)
                .setAuthor("HuangXuLin")// 作者
                // 自定义文件命名, 注意 %s 会自动填充表实体属性
                .setEntityName("%s")
                .setMapperName("%sMapper")
                .setXmlName("%sMapper")
                .setServiceName("I%sService")
                .setServiceImplName("%sServiceImpl")
                .setControllerName("%sController");
                 .setSwagger2(true);//实体属性 Swagger2 注解
    }



    /**
     * 获取DataSourceConfig,数据源配置
     */
    private DataSourceConfig getDataSourceConfig() {
        return new DataSourceConfig()
                .setDbType(DbType.DB2)// 数据库类型
                .setTypeConvert(new DB2TypeConvert() {
                    //自定义转换器,可以转换一些特殊类型,这应该是db2特有的
                    @Override
                    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                        if (fieldType.toLowerCase().equals("bit")) {
                            return DbColumnType.BOOLEAN;
                        }
                        if (fieldType.toLowerCase().equals("tinyint")) {
                            return DbColumnType.INTEGER;
                        }
                        if (fieldType.toLowerCase().equals("date")) {
                            return DbColumnType.DATE;
                        }
                        if (fieldType.toLowerCase().equals("time")) {
                            return DbColumnType.DATE;
                        }
                        if (fieldType.toLowerCase().equals("datetime")) {
                            return DbColumnType.DATE;
                        }
                        return super.processTypeConvert(globalConfig, fieldType);
                    }
                })
                .setDriverName("com.ibm.db2.jcc.DB2Driver")
                .setUsername("db2inst1")
                .setPassword("XFjubao")
                .setUrl("jdbc:db2://192.168.1.203:50000/PZDB");
    }

 /**
     * 获取StrategyConfig,策略配置
     */
    private StrategyConfig getStrategyConfig(String tableName) {
        List<TableFill> tableFillList = getTableFills();
        return new StrategyConfig()
                .setCapitalMode(false)// 全局大写命名
                .setTablePrefix("pz_")// 去除前缀
                .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                // .setInclude(new String[] { "user" }) // 需要生成的表
                // 自定义实体父类
                .setSuperEntityClass("com.sinosoft.pz.framework.model.entity.BaseEntity")
                // 自定义实体, 公共字段
                .setSuperEntityColumns("id")
                .setTableFillList(tableFillList)
                // 自定义 mapper 父类
                .setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper")
                // 自定义 controller 父类
                // .setSuperControllerClass("xx.xx.SuperController")
                // 自定义 service 实现类父类
                .setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl")
                // 自定义 service 接口父类
                .setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService")
                // 【实体】是否生成字段常量(默认 false)
                .setEntityColumnConstant(true)
                // 【实体】是否为构建者模型(默认 false)
                .setEntityBuilderModel(false)
                // 【实体】是否为lombok模型(默认 false)
                .setEntityLombokModel(true)
                // Boolean类型字段是否移除is前缀处理
                .setEntityBooleanColumnRemoveIsPrefix(true)
                //是否添加@restController注释(controller)
                .setRestControllerStyle(true)
               //添加表名表名
                .setInclude(tableName);
    }

/**
     * 获取PackageConfig, 包配置
     */
    private PackageConfig getPackageConfig() {
        return new PackageConfig()
                .setParent("com.sinosoft.pz.system")
                .setController("web.controller")
                .setEntity("model.entity")
                .setMapper("mapper")
                .setService("service")
                .setServiceImpl("service.impl");
    }



/**
     * 获取InjectionConfig,自定义配置
     */
    private InjectionConfig getInjectionConfig() {
        return new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                //map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");自定义作者名称,在模板中用${abc}获取
                this.setMap(map);
            }
        }.setFileOutConfigList(Collections.singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
            // 自定义输出文件目录,因为mapper.xml和其他的文件不放到同一个目录下,所以需要自定义配置
            @Override
            public String outputFile(TableInfo tableInfo) {
                String resourcePath = getRootPath() + "/src/main/resources";
                System.err.println(" Generator Resource Path:【 " + resourcePath + " 】");
                return resourcePath + "/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
            }
        }));
    }

/**
     * 获取TemplateConfig,自定义模板
     */
    private TemplateConfig getTemplateConfig() {
        //没有自定义的模板
        return new TemplateConfig().setXml(null);
    }

Velocity模板

待续

以上是关于代码生成器的主要内容,如果未能解决你的问题,请参考以下文章

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

Apollo Codegen 没有找到生成代码的操作或片段

vscode代码片段生成vue模板

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

vs 2010代码片段