Mybatis Plus最新代码生成器AutoGenerator

烟雨 3年前 (2023-03-03) 阅读数 499 #MyBatis
文章标签 MyBatis

AutoGenerator 是 MyBatis Plus推出的代码生成器,可以快速生成Entity、Mapper、Mapper XML、Service、Controller等各个模块的代码,比Mybatis Generator更强大,开发效率更高。

以往我们使用mybatis generator生成代码正常需要配置mybatis-generator-config.xml,代码配置比较繁琐复杂,比如:

<generatorConfiguration>
    <context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 注释 -->
        <commentGenerator>
            <!-- 是否不生成注释 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://ip:3306/codingmoretiny02?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false"
                        userId="codingmoretiny02"
                        password="123456">
            <!--高版本的 mysql-connector-java 需要设置 nullCatalogMeansCurrent=true-->
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"/>
        </javaTypeResolver>

        <!-- 生成实体类地址 -->
        <javaModelGenerator targetPackage="com.codingmore.mbg.po" targetProject="src/main/java">
            <!-- 是否针对string类型的字段在set方法中进行修剪,默认false -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- 生成Mapper.xml文件 -->
        <sqlMapGenerator targetPackage="com.codingmore.mbg.mapper" targetProject="src/main/resources">
        </sqlMapGenerator>

        <!-- 生成 XxxMapper.java 接口-->
        <javaClientGenerator targetPackage="com.codingmore.mbg.dao" targetProject="src/main/java" type="XMLMAPPER">
        </javaClientGenerator>

        <table schema="" tableName="user" domainObjectName="User"
               enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               enableUpdateByExample="false" selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

使用AutoGenerator

1、初始化数据库

CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `mobile` varchar(100) NULL DEFAULT NULL COMMENT '手机号',
  `create_by` varchar(64) NULL DEFAULT NULL COMMENT '创建人',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) COMMENT = '用户';

2、在 pom.xml 文件中添加 AutoGenerator 的依赖。

<dependencies>
    <!-- mybatis-plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3.4</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.2</version>
    </dependency>

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

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

3、核心代码

public class GeneratorConfig {
    private final static String URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
    private final static String USERNAME = "root";
    private final static String PASSWORD = "123456";

    //包名
    private final static String PAGE = "com.zender.auto.code";
    //生成路径
    private final static String PROJECTPATH = "E://test";
    private final static String MODULE = "/code";
    private final static String AUTHOR = "zender";



    public static DataSourceConfig initDataSourceConfig() {
        return new DataSourceConfig
                .Builder(URL, USERNAME, PASSWORD)
                .dbQuery(new MySqlQuery())
                //自定义数据库-java类型转换器,具体类需继承MySqlTypeConvert
                //.typeConvert(new MySqlTypeConvert())
                .keyWordsHandler(new MySqlKeyWordsHandler())
                .build();
    }

    /**
     * 全局配置
     * @return
     */
    public static GlobalConfig initGlobalConfig(){
        // 全局配置
        return new GlobalConfig.Builder()
                //设置输出文件路径
                .outputDir(PROJECTPATH + MODULE)
                .author(AUTHOR)
                //执行完 是否打开输出的目录,默认true
                .disableOpenDir()
                // 设置日期类型为Date(若不设置时间类型都会变成LocalDateTime部分连接池例如druid是无法识别的)
                .dateType(DateType.ONLY_DATE)
                .build();
    }

    /**
     * 包配置
     * @return
     */
    public static PackageConfig initPackageConfig(){
        // 包配置
        return new PackageConfig.Builder()
                //父包
                .parent(PAGE)
                //自定义实体包名
                .entity("entity")
                //自定义mapper包名
                .mapper("mapper")
                //自定义mapper.xml包名
                .xml("mapper.xmls")
                //自定义service包名
                .service("service")
                //自定义serviceImpl包名
                .serviceImpl("service.impl")
                //自定义controller包名
                .controller("controller")
                //自定义包名
                .other("domain")
                .build();
    }

    /**
     * 模板配置
     * @return
     */
    public static TemplateConfig initTemplateConfig(){
        // 配置模板
        return new TemplateConfig.Builder()
                .entity("templates/entity.java")
                .controller("templates/controller.java")
                .mapper("templates/mapper.java")
                .service("templates/service.java")
                .serviceImpl("templates/serviceImpl.java")
                .xml("templates/mapper.xml")
                .build();
    }

    /**
     * 策略配置
     * @return
     */
    public static StrategyConfig initStrategyConfig(List<String> tableNames){
        // 策略配置
        return new StrategyConfig.Builder()
                .addInclude(tableNames)
                //定制实体
                .entityBuilder()
                .enableLombok()
                .naming(NamingStrategy.underline_to_camel)
                .columnNaming(NamingStrategy.underline_to_camel)
                //生成实体时生成数据库字段注解
                .enableTableFieldAnnotation()
                //定制controller
                .controllerBuilder()
                //是否rest模式
                .enableRestStyle()
                //定制service & Impl
                .serviceBuilder()
                //service命名规则
                .convertServiceFileName(new ConverterFileName() {
                    @NotNull
                    @Override
                    public String convert(String entityName) {
                        return entityName + ConstVal.SERVICE;
                    }
                })
                //定制mapper
                .mapperBuilder()
                .enableBaseColumnList()
                .enableBaseResultMap()
                //TODO 需根据实际缓存调整
                .cache(Cache.class)
                .build();
    }

    /**
     * 注入自定义配置-参数、生成类
     * @return
     */
    public static InjectionConfig initInjectionConfig(Map<String, Object> parameterMap){
        //自定义生成类
        HashMap<String, String> customFileMap = new HashMap<>(4);
        //Vo实体
        customFileMap.put(File.separator+"%sVO.java", "templates/vo.java.ftl");
        //DTO实体
        customFileMap.put(File.separator+"%sDTO.java", "templates/dto.java.ftl");

        return new InjectionConfig.Builder()
                .customMap(parameterMap)
                .customFile(customFileMap)
                .build();
    }
}

4、自定以模板解析器

public class EnhanceFreemarkerTemplateEngine extends FreemarkerTemplateEngine {
    @Override
    protected void outputCustomFile(Map<String, String> customFile, TableInfo tableInfo, Map<String, Object> objectMap) {
        String entityName = tableInfo.getEntityName();
        String otherPath = this.getPathInfo(OutputFile.other);
        customFile.forEach((key, value) -> {
            String fileName = String.format(otherPath + File.separator + entityName + "%s", key);
            this.outputFile(new File(fileName), objectMap, value, true);
        });
    }
}

5、启动类

public class MyGenerator {
    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator(GeneratorConfig.initDataSourceConfig());
        //自定义参数,全局适用
        HashMap<String, Object> parameterMap = new HashMap<>(4);
        parameterMap.put("workflow", true);
        parameterMap.put("permission", true);
        //需要生成的表名
        List<String> tableLists = Arrays.asList("user");
        //全局配置
        mpg.global(GeneratorConfig.initGlobalConfig())
                //包配置
                .packageInfo(GeneratorConfig.initPackageConfig())
                //模板配置
                .template(GeneratorConfig.initTemplateConfig())
                //策略配置
                .strategy(GeneratorConfig.initStrategyConfig(tableLists))
                //自定义配置
                .injection(GeneratorConfig.initInjectionConfig(parameterMap));
        //生成
        mpg.execute(new EnhanceFreemarkerTemplateEngine());
    }
}

结构如下

image.png

运行结果

image.png

想了解MyBatis Plus代码生成配置可以参考官方配置:代码生成器配置新

版权声明

非特殊说明,本文由Zender原创或收集发布,欢迎转载。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

作者文章
热门