美文网首页Mybatis-plus
MyBatis Plus-代码生成器

MyBatis Plus-代码生成器

作者: 石头耳东 | 来源:发表于2022-06-12 22:27 被阅读0次

    前言:本文末尾处附有自定义代码生成器的源码,感兴趣的可以前往下载。

    零、本文纲要

    一、代码生成器快速入门
    二、源码使用快速入门
    三、自定义代码生成器starter

    一、代码生成器快速入门

    MyBatis Plus-代码生成器官方文档

    1. 基础依赖

    mybatis-plus
    mybatis-plus-boot-starter
    mybatis-plus-extension
    mybatis-plus-core
    mybatis-plus-annotation
    mybatis-plus-generator

    2. 测试代码

    注意将下面的:url、username、password以及注释部分的内容改为自己测试模块的内容。

    FastAutoGenerator.create("url", "username", "password")
        .globalConfig(builder -> {
            builder.author("baomidou") // 设置作者
                .enableSwagger() // 开启 swagger 模式
                .fileOverride() // 覆盖已生成文件
                .outputDir("D://"); // 指定输出目录
        })
        .packageConfig(builder -> {
            builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
                .moduleName("system") // 设置父包模块名
                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 设置mapperXml生成路径
        })
        .strategyConfig(builder -> {
            builder.addInclude("t_simple") // 设置需要生成的表名
                .addTablePrefix("t_", "c_"); // 设置过滤表前缀
        })
        .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
        .execute();
    
    1. 测试

    然后就报错了

    Caused by:

    各种类的缺失异常.png

    官方提供的依赖除了未传递依赖 mp 包,还缺失了很大一部分依赖。所以,直接跟源码来探下究竟。

    MyBatis-Plus 代码生成器(3.5.1+版本)GitHub网址

    下载源码研究.png

    二、源码使用快速入门

    1. 查看源码结构

    下载好源码后,映入眼帘的是 build.gradle ,可以看到官方是使用 gradle 来进行依赖等内容的统一管理的。

    gradle管理.png

    但是,我们通常使用maven进行项目开发,所以需要对管理工具做下简单调整。

    我们需要通过查看 build.gradle 文件的 buildscript.dependencies 以及 ext.lib 的内容,来插入官方使用版本的依赖。

    抽取gradle配置中的依赖.png

    或者使用IDEA工具自动识别,add maven dependencies

    2. 调整后的依赖

    以下为IDEA工具添加的本地仓库的依赖,与以上不完全一致,如下:

    <properties>
        <mybatis.plus.generator.version>3.5.2</mybatis.plus.generator.version>
        <mybatis.plus.annotation.version>3.4.3</mybatis.plus.annotation.version>
        <mybatis.plus.core.version>3.4.3</mybatis.plus.core.version>
        <mybatis.plus.extension.version>3.4.3</mybatis.plus.extension.version>
        <kotlin.runtime.version>1.0.7</kotlin.runtime.version>
        <freemarker.version>2.3.31</freemarker.version>
        <velocity.version>1.5</velocity.version>
        <beetl.version>3.10.0.RELEASE</beetl.version>
        <mysql.connector.java.version>8.0.29</mysql.connector.java.version>
        <slf4j.simple.version>1.7.21</slf4j.simple.version>
    </properties>
    
    <dependencies>
        <!--   mybatis-plus生成器依赖   -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis.plus.generator.version}</version>
        </dependency>
        <!--   mybatis-plus注解依赖   -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-annotation</artifactId>
            <version>${mybatis.plus.annotation.version}</version>
        </dependency>
        <!--   mybatis-plus核心依赖   -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-core</artifactId>
            <version>${mybatis.plus.core.version}</version>
        </dependency>
        <!--   mybatis-plus额外拓展   -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>${mybatis.plus.extension.version}</version>
        </dependency>
        <!--   补充注解   -->
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-runtime</artifactId>
            <version>${kotlin.runtime.version}</version>
        </dependency>
        <!--   freemarker模板框架   -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}</version>
        </dependency>
        <!--   velocity工具   -->
        <dependency>
            <groupId>velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>${velocity.version}</version>
        </dependency>
        <!--   beetl工具   -->
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl</artifactId>
            <version>${beetl.version}</version>
        </dependency>
        <!--   mysql数据库连接   -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.java.version}</version>
        </dependency>
        <!--   日志依赖   -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.simple.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    

    3. 测试代码

    此处如上,省略。

    至此,我们已经可以使用代码生成器来帮助我们生成日常所需的代码了。但是,每次使用还需要各种配置依赖,写固定的代码逻辑并不是我们希望的。所以,我们考虑将此内容抽成一个starter,即拿即用。

    三、自定义代码生成器starter

    1. 明确生成器starter的目标

    a、配置使用
    b、省去逻辑代码编辑

    2. 参考spring-boot-starter

    ① 自动装配

    首先,添加 spring-boot-starter-web 依赖,也可以直接用starter,这个更全一些。

    我们知道spring-boot项目自动装配会读取 src/main/resources/META-INF/spring.factories 文件,进而加载内部的内容。所以,我们编辑自己的自动装配类。如下:

    Ⅰ 在上述目录添加 spring.factories 文件

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.stone.autoconfig.MyBatisPlusGeneratorAutoConfiguration
    

    Ⅱ 编写 MyBatisPlusGeneratorAutoConfiguration 自动配置类

    public class MyBatisPlusGeneratorAutoConfiguration {
    }
    

    ② yml配置加载

    spring-boot项目常常会编写application.yml配置文件,然后自动装配时会自动读取其内容。因此我们使用@ConfigurationProperties注解,来帮助我们读取指定配置。

    代码生成器官方文档.png

    通过查阅MyBatis Plus-代码生成器官方文档,不难发现我们在做的核心内容起始就是配置:
    a、 数据库配置(DataSourceConfig);
    b、 全局配置(GlobalConfig);
    c、 包配置(PackageConfig);
    d、 模板配置(TemplateConfig)【不常用】;
    e、 注入配置(InjectionConfig)【不常用】;
    f、 策略配置(StrategyConfig)。

    官方样例配置了其中5个,abcdf。因此,我们配置较为常用的5个,以及其较可能用到的属性、方法等。

    Ⅰ 定制 数据库配置(DataSourceConfig)

    编写 CustomDataSourceConfigProperties 类,此处抽取了经常配置的 url、username、password 举例,如下:

    @Component
    @ConfigurationProperties(prefix = "stone.datasource")
    public class CustomDataSourceConfigProperties {
        /**
         * 驱动连接的URL
         */
        private String url = null;
    
        /**
         * 数据库连接用户名
         */
        private String username = "root";
    
        /**
         * 数据库连接密码
         */
        private String password = "root";
    
        //此处省略get/set方法
    }
    

    当然,此处如果为了方便,可以使用 lombok 依赖/插件。

    编写 CustomDataSourceConfig 类,如下:

    @Component
    public class CustomDataSourceConfig {
    
        @Autowired
        private CustomDataSourceConfigProperties customDataSourceConfigProperties;
    
        @Bean
        public DataSourceConfig dataSourceConfig() {
            //1. 获取数据库配置的建造者对象
            DataSourceConfig.Builder builder = new DataSourceConfig.Builder(
                    //1.1 设置数据库URL
                    customDataSourceConfigProperties.getUrl(),
                    //1.2 设置用户名
                    customDataSourceConfigProperties.getUsername(),
                    //1.3 设置登录密码
                    customDataSourceConfigProperties.getPassword()
            );
            //2. 返回数据源配置对象
            return builder.build();
        }
    }
    

    Ⅱ 全局配置(GlobalConfig)
    Ⅲ 包配置(PackageConfig)
    Ⅳ 模板配置(TemplateConfig)【不常用】
    Ⅴ 策略配置(StrategyConfig)

    省略。

    ③ 编写自定义代码生成器工具类

    编写CustomGenerator,如下:

    public class CustomGenerator {
        @Autowired
        private GlobalConfig globalConfig;
    
        @Autowired
        private PackageConfig packageConfig;
    
        @Autowired
        private StrategyConfig strategyConfig;
    
        @Autowired
        private TemplateConfig templateConfig;
    
        @Autowired
        private DataSourceConfig dataSourceConfig;
    
        public void generateCode() throws Exception {
            //1. 生成器对象
            AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfig);
            //2. 配置全局属性
            autoGenerator.global(globalConfig);
            //3. 配置包属性
            autoGenerator.packageInfo(packageConfig);
            //4. 配置策略
            autoGenerator.strategy(strategyConfig);
            //5. 配置模板
            autoGenerator.template(templateConfig);
            //6. 开始生成Code
            autoGenerator.execute();
        }
    }
    

    ④ 在自动配置类引入各个组件bean

    @Import({
            CustomDataSourceConfig.class,
            CustomGlobalConfig.class,
            CustomPackageConfig.class,
            CustomStrategyConfig.class,
            CustomTemplateConfig.class,
            CustomDataSourceConfigProperties.class,
            CustomGlobalConfigProperties.class,
            CustomPackageConfigProperties.class,
            CustomStrategyConfigProperties.class,
            CustomTemplateConfigProperties.class
    })
    public class MyBatisPlusGeneratorAutoConfiguration {
        @Bean
        public CustomGenerator customGenerator() {
            return new CustomGenerator();
        }
    }
    

    此时,我们install一下我们的程序就可以在项目中使用自定义的starter生成代码。如果无法正常在项目中被加载,则手动build。

    image.png

    添加依赖,在项目中测试:

    Ⅰ 添加依赖

    <dependency>
        <groupId>com.stone.mybatis</groupId>
        <artifactId>stone-mybatis-plus-generator-starter-simple</artifactId>
        <version>1.0.0.RELEASE</version>
    </dependency>
    

    Ⅱ 编写application.yml配置文件

    编写配置文件.png
    stone:
      datasource: # 数据源配置
        url: "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false"
        username: root
        password: root
      global: # 全局配置
        author: stone
        enable-swagger: true
        output-dir: D:\JavaStudy\Level2\custom-generator-demo\src\main\java
      package: # 包配置
        parent: com.stone
        xml: mapper.xml
      strategy: # 策略配置
        table-prefix: t_
    

    Ⅲ 生成所需文件

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = GeneratorApplication.class)
    public class GeneratorTest {
        //注入自定义的生成器对象
        @Autowired
        private CustomGenerator customGenerator;
        //测试生成代码
        @Test
        public void testGenerator() throws Exception {
            customGenerator.generateCode();
        }
    }
    
    生成的代码文件.png 生成的文件.png

    ⑤ 优化

    我们常用的yml配置会有选项提示的内容,我们可以使用 spring-boot-configuration-processor 帮助我们完成此功能。

    添加该依赖,然后执行 mvn:clean → install。此时,我们可以在项目的 target/classes/META-INF 目录下看到一个 spring-configuration-metadata.json 文件。将该文件复制至 src/main/resources/META-INF 目录下。

    打开该文件,拖动到最下方,如下:

    "hints": []
    

    hints 提供默认选项的内容并未配置,还是空的。添加自己认为需要提醒的默认配置选项,如下:

    "hints": [
        {
          "name": "stone.global.disable-open-dir",
          "values": [
            {
              "value": false,
              "description": "【默认】打开输出目录"
            },
            {
              "value": true,
              "description": "不打开输出目录"
            }
          ]
        }
    ]
    
    优化后的效果.png

    注意:在我们添加完 spring-configuration-metadata.json 文件后,将 spring-boot-configuration-processor 依赖注释掉。未注释的话,框架运行时又会生成一个该文件,同样的提示显示两条。

    至此,我们就可以在我们想要使用的项目中使用自己的代码生成器生成代码了。

    感兴趣的话也可以直接下载过去使用:stone-mybatis-plus-generator-starter-simple (github.com)

    四、结尾

    以上即为MyBatis Plus-代码生成器的全部内容,感谢阅读。

    相关文章

      网友评论

        本文标题:MyBatis Plus-代码生成器

        本文链接:https://www.haomeiwen.com/subject/fllnmrtx.html