Mybatis-plus进阶之代码生成器

前言

Mybatis也有对应的反向工程mybatis-generator来生成相关的Mapper接口和xml配置。Mybatis-plus的代码生成更为简单。

导入pom依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
    <scope>provided</scope>
</dependency>

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

加入freemarker的配置,我们的示例使用freemarker模板

SpringBoot配置文件中配置freemarker模板

spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath*:templates/*.ftl

注:在我们依赖的mybatis-plus-generator包中就存在对应的模板文件,一般情况下我们无需从jar包中拷贝出来,除非你想自定义。

mybatis-plus-generator包中默认的模板文件如下:

在这里插入图片描述

编写测试代码

package com.yyoo.boot.mp;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Collections;


@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MPApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Test2 {
    @Value("${my.hikari.jdbc-url}")
    private String url;
    @Value("${my.hikari.username}")
    private String username;
    @Value("${my.hikari.password}")
    private String password;

    @Test
    public void t1(){
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author("auto") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .disableOpenDir() // 禁用执行完成后打开文件夹
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("C://work//tmp"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.yyoo.boot") // 设置父包名
                            .moduleName("mp") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "C://work//tmp//mapper")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("t_my_emp")
                            .build()

                            .entityBuilder()
                            .enableLombok() // 使用lombok
                            .idType(IdType.ASSIGN_ID)
                            .convertFileName((String entityName) -> {
                                if(entityName.startsWith("T")) {
                                    return entityName.substring(1);
                                }else {
                                    return entityName;
                                }
                            })
                            .build()

                            .mapperBuilder()
                            .enableBaseResultMap() // 在mapper.xml文件中生成ResultMap
                            .convertMapperFileName(entityName -> {
                                String fileName;
                                if(entityName.startsWith("T")) {
                                    fileName = entityName.substring(1);
                                }else {
                                    fileName = entityName;
                                }
                                return fileName+"Mapper";
                            })
                            .convertXmlFileName(entityName -> {
                                String fileName;
                                if(entityName.startsWith("T")) {
                                    fileName = entityName.substring(1);
                                }else {
                                    fileName = entityName;
                                }
                                return fileName+"Mapper";
                            })

                            .serviceBuilder()
                            // 不能和formatFileName一起使用
                            .convertServiceFileName(entityName -> {
                                String fileName;
                                if(entityName.startsWith("T")) {
                                    fileName = entityName.substring(1);
                                }else {
                                    fileName = entityName;
                                }
                                return fileName+"Service";
                            })
                            .convertServiceImplFileName(entityName -> {
                                String fileName;
                                if(entityName.startsWith("T")) {
                                    fileName = entityName.substring(1);
                                }else {
                                    fileName = entityName;
                                }
                                return fileName+"ServiceImpl";
                            })

                            .controllerBuilder()
                            .enableHyphenStyle()
                            .enableRestStyle()
                            // 不能和formatFileName一起使用
                            .convertFileName(entityName -> {
                                String fileName;
                                if(entityName.startsWith("T")) {
                                    fileName =  entityName.substring(1);
                                }else {
                                    fileName = entityName;
                                }
                                return fileName+"Controller";
                            });
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }

}

代码比较长,但都非常简单。只是有些地方需要注意

  1. idType需要根据你的需要来设置
  2. convertFileName方法和formatFileName不要一起使用,如果一起使用,那么convertFileName方法将不会执行。只有formatFileName方法会生效。
  3. convertFileName方法接收一个ConverterFileName对象,示例中我们有很多类似的重复代码,大家可以将他们独立出来定义,减少代码量。(ConverterFileName是一个函数式接口)
  4. 示例中的各个方法配置的详细说明,请查看官网链接代码生成器的配置
  5. 注:本文示例只支持3.5.1+版本,旧版本的代码情参考官网。

上一篇:Mybatis-plus进阶之分布式id生成
下一篇:待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值