mybatis-plus3.x 代码生成器AutoGenerator详细说明

一、前言

授人以鱼不如,如果想了解更多以及版本更新。
建议前往mybatis-plus的官方网站,以下两个链接都是:

https://baomidou.com/guide/generator.html#%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B

https://baomidou.com/config/

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

二、直接贴代码,写得非常详细,可以直接用

2.1 代码

花了很长时间整理,直接可以用。
多看注释

/**
 *  演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
 *
 * @author cancan
 * @since 2020-03-23
 */
public class CodeGenerator {
    
    

    /**
     * 配置模块与表
     */
    private static Map<String, List<String>> moduleTableMap = Maps.newHashMap();

    static{
    
    
        //key为当前所有文件放置的包名,如果为空指的就是packageConfig父类目录下,value为在该包名下生成的表,可以多张表,存放在list
        moduleTableMap.put("mp", Arrays.asList("china","region","user"));
    }


    public static void main(String[] args) {
    
    
        autoGenerator();
    }

    /**
     * mybatis-plus代码生成器主要是由以下几部分组成
     * 1. 代码生成器基本配置
     * 2. 数据源 dataSourceConfig 配置
     * 3. 数据库表配置,一般不配置
     * 4. 包名配置
     * 5. 模板配置
     * 6. 全局策略 globalConfig 配置
     * 7. 注入 injectionConfig 配置
     *
     * 执行代码生成操作
     */
    private static void autoGenerator(){
    
    
        if(MapUtils.isNotEmpty(moduleTableMap)){
    
    
            for(Map.Entry<String,List<String>> entry : moduleTableMap.entrySet()){
    
    
                List<String> tables = entry.getValue();
                if(CollectionUtils.isNotEmpty(tables)){
    
    
                    tables.stream().forEach(e->{
    
    
                        // 代码生成器
                        AutoGenerator mpg = new AutoGenerator();
                        // 1. 代码生成器基本配置
                        String projectPath = globalConfig(mpg);
                        // 2. 数据源 dataSourceConfig 配置
                        dataSourceConfig(mpg);
                        // 4. 包名配置
                        PackageConfig pc =packageConfig(mpg,entry.getKey());
                        // 5. 模板配置
                        injectionConfig(mpg,pc,projectPath);
                        // 6. 全局策略 globalConfig 配置
                        strategyConfig(mpg,pc,e);
                        //7. 注入 injectionConfig 配置
                        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
                        //执行代码生成操作
                        mpg.execute();
                    });
                }
            }
        }else{
    
    
            throw new RuntimeException("请配置模块");
        }
    }

    /**
     * 1. 代码生成器基本配置 设置全局配置.
     *
     * @param mpg 自动代码生成对象
     * @return 设置全局配置
     */
    private static String globalConfig(AutoGenerator mpg){
    
    
        //设置全局配置
        GlobalConfig gc = new GlobalConfig();

        //获取当前路径
        String projectPath = System.getProperty("user.dir");

        System.out.println(projectPath);
        //自定义输出文件
        //配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的
        gc.setOutputDir(projectPath + "/src/main/java");

        gc.setAuthor("czchen");

        //是否打开输出目录
        gc.setOpen(true);

        //只使用 java.util.date 代替
        gc.setDateType(DateType.ONLY_DATE);

        //指定生成的主键的ID类型
        //gc.setIdType(IdType.UUID);

        //开启 BaseResultMap,默认值:false
        gc.setBaseResultMap(true);

        //开启 baseColumnList,默认值:false
        gc.setBaseColumnList(true);

        //是否在xml中添加二级缓存配置,默认值:false
        //gc.setEnableCache(true);

        mpg.setGlobalConfig(gc);

        //实体属性 Swagger2 注解
        gc.setSwagger2(true);

        return projectPath;
    }

    /**
     * 2. 数据源 dataSourceConfig 配置
     *
     * @param mpg 自动代码生成对象
     */
    private static void dataSourceConfig(AutoGenerator mpg){
    
    
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&serverTimezone=UTC");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("admin");

        mpg.setDataSource(dsc);
    }

    /**
     * 4. 包名配置, 设置包配置.
     *
     * @param mpg 自动代码生成对象
     * @param moduleName 当前包的名字
     * @return 包的配置
     */
    private static PackageConfig packageConfig(AutoGenerator mpg, String moduleName){
    
    
        // 包配置
        PackageConfig pc = new PackageConfig();

        //父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
        pc.setParent("com.cancan.mp");

        //父包模块名
        pc.setModuleName(moduleName);

        mpg.setPackageInfo(pc);
        return pc;
    }

    /**
     * 5. 模板配置, 自定义配置
     *
     * @param mpg 自动代码生成对象
     * @param pc 包配置
     * @param projectPath 设置全局配置
     */
    private static void injectionConfig(AutoGenerator mpg, PackageConfig pc, String projectPath){
    
    

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
    
    
            @Override
            public void initMap() {
    
    
                // to do nothing
            }
        };

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

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

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
    
    
            @Override
            public String outputFile(TableInfo tableInfo) {
    
    
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                String outPath = projectPath+"/src/main/java/"+pc.getParent().replaceAll("\\.","/")
                        +"/mapper/"+tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                return outPath;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));
    }

    /**
     * 6. 全局策略 globalConfig 配置,策略配置
     *
     * @param mpg 自动代码生成对象
     * @param pc 包配置
     * @param tableName 表格名字
     */
    private static void strategyConfig(AutoGenerator mpg, PackageConfig pc, String tableName){
    
    
        //策略配置
        StrategyConfig strategy = new StrategyConfig();

        //数据库表映射到实体的命名策略 --- 数据库名
        //no_change 不做任何改变,原样输出
        //underline_to_camel 下划线转驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);

        //数据库表字段映射到实体的命名策略, 未指定按照 naming 执行 --- 字段名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);

        //自定义继承的Entity类全称,带包名
        //strategy.setSuperEntityClass("com.cancan.base.entity.BaseEntity");
        //【实体】是否为lombok模型(默认 false)
        strategy.setEntityLombokModel(true);

        //生成 @RestController 控制器
        strategy.setRestControllerStyle(true);

        //strategy.setSuperControllerClass("com.cancan.base.web.BaseController"); 
        // 自定义继承的Controller类全称,带包名
        //需要包含的表名,当enableSqlFilter为false时,允许正则表达式(与exclude二选一配置)
        strategy.setInclude(tableName);

        //【实体】是否生成字段常量(默认 false)
        //strategy.setEntityColumnConstant(true);

        //默认实体类贴上 @TableField
        strategy.setEntityTableFieldAnnotationEnable(true);

        //驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);

        //字段前缀
        strategy.setTablePrefix(pc.getModuleName() + "_"); 
        mpg.setStrategy(strategy);
    }

}

2.2 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.17.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.cancan.mp</groupId>
    <artifactId>mp-codegenerator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <java.version>1.8</java.version>
        <mybatis.version>3.4.1</mybatis.version>
        <alibaba.druid.version>1.0.29</alibaba.druid.version>
        <mysql.connector.version>5.1.38</mysql.connector.version>
        <guava.version>28.1-android</guava.version>
        <commons-lang3.version>3.8.1</commons-lang3.version>
        <commons-beanutils.version>1.9.3</commons-beanutils.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,
         在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <!-- 引入Druid依赖,阿里巴巴所提供的数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${alibaba.druid.version}</version>
        </dependency>

        <!-- 提供mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>

        <!--maputils工具-->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>${commons-beanutils.version}</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>
    </dependencies>

</project>

猜你喜欢

转载自blog.csdn.net/qq_34168515/article/details/109967062