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 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")保持一致即可。