SpringBoot实战:构建MyBatis-Plus代码生成器

2024-01-28 21:58:18 浏览数 (1)

大家好,我是腾讯云开发者社区的 Front_Yue,本篇文章将实战演示如何实现MyBatis-Plus的代码生成器功能来提升我们的开发效率。

前言

随着项目规模的增长和业务需求的迭代加速,如何快速搭建稳定且易于维护的数据访问层成为开发过程中的重要议题。在这其中,MyBatis-Plus因其丰富的扩展能力及强大的自动化特性,在众多ORM框架中脱颖而出。

尤其值得关注的是其内置的代码生成器模块,能够依据数据库表结构一键生成实体类、Mapper接口、Mapper XML文件以及Service层基础代码等全套后端基础组件。

正文内容

1. 安装MyBatis-Plus相关依赖

在编写代码生成配置前,我们先安装项目中需要用到的相关依赖。在项目的pom.xml文件中添加以下依赖:

代码语言:xml复制
<!--依赖版本配置-->
<properties>
    <mysql.version>8.0.33</mysql.version>
    <mybaits-plus.version>3.5.5</mybaits-plus.version>
    <velocity.version>2.3</velocity.version>
</properties>
<!--数据库-mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>${mybaits-plus.version}</version>
</dependency>
<!--代码生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>${mybaits-plus.version}</version>
</dependency>
<!-- velocity代码生成使用模板 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>${velocity.version}</version>
</dependency>

2. 配置项目相关的yml文件

我们在项目的application.yml文件中配置我们数据库相关的信息,我以MySQL为例,大家可以结合自己项目的具体情况来说明。

代码语言:yml复制
# 数据库配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo_mybaits_plus?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: 123456

3. 编写代码生成controller层

为什么要使用分层结构呢?因为作为一个项目,我希望我代码生成后期是可以在前端界面操作的,这样可以为我们提供便捷的操作。

所以我在controller包下创建了一个JavaGenerstorController类来实现这一功能,其中请求参数tableName 为数据库需要生成的表名

代码语言:java复制
@RestController
@RequestMapping("/generator")
public class JavaGenerstorController {
    @Autowired
    private IJavaGeneratorService javaGeneratorService;
   @GetMapping("/java")
    public String generatorCode(String tableName){
        javaGeneratorService.generatorCode(tableName);
        return "代码生成成功";
    }
}

4. 编写代码生成service层

代码语言:java复制
public interface IJavaGeneratorService {
    public void generatorCode(String tableName);
}

5. 编写代码生成服务实现类

实现类当然是一个业务最核心的部分,所以在实现类中,我们需要详细配置代码生成相关属性以及参数。

代码语言:java复制
public class JavaGeneratorImpl implements IJavaGeneratorService {
    @Override
    public void generatorCode(String tableName) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/demo", "root", "123456")
                .globalConfig(builder -> {
                    builder.author("frontyue") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .disableOpenDir() //禁止打开输出目录
                            .dateType(DateType.TIME_PACK)
                            .commentDate("“yyyy-MM-dd HH:mm:ss”")
                            .outputDir("E://MyProject//frontyue//frontyue-generator//src//main//java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.frontyue") // 设置父包名
                            .moduleName("generaror") // 设置父包模块名
                            .entity("domain")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "E://MyProject//frontyue//frontyue-generator//src//main//resources//mapper//generator"));
                })
                .strategyConfig(builder -> {
                    builder.addInclude(tableName); // 设置需要生成的表名
//                            .addTablePrefix(null); // 设置过滤表前缀
                    builder.entityBuilder()
//                           .superClass(BaseEntity.class) 实体类继承基类
                            .enableFileOverride()
                            .enableLombok()
                            .enableTableFieldAnnotation()
                            .addTableFills()
                            .idType(IdType.AUTO)
                            .build();
                    builder .controllerBuilder()
                            .superClass(BaseController.class)
                            .enableFileOverride()
                            .enableRestStyle()
                            .build();
                    builder.serviceBuilder()
                            .enableFileOverride()
                            .build();
                    builder.mapperBuilder()
                            .enableFileOverride()
                            .enableMapperAnnotation()
                            .enableBaseResultMap()
                            .enableBaseColumnList()
                            .build();
                })
                // 配置代码生成模版
                .templateConfig(builder -> {
                    builder.disable(TemplateType.ENTITY)
                            .entity("/templates/entity.java.vm")
                            .service("/templates/service.java.vm")
                            .serviceImpl("/templates/serviceImpl.java.vm")
                            .mapper("/templates/mapper.java.vm")
                            .xml("/templates/mapper.xml.vm")
                            .controller("/templates/controller.java.vm")
                            .build();
                })
                .templateEngine(new VelocityTemplateEngine())
//              .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

在服务实现类中,我们配置了全局配置、数据源配置、包配置和策略配置。

  • 全局配置中设置了输出目录、作者、是否打开输出目录、是否覆盖已有文件、Service接口的名称、主键生成策略;
  • 数据源配置中设置了数据库类型、数据库连接地址、用户名和密码;
  • 包配置中设置了生成的Java实体类、Mapper接口、Service接口和XML文件的所在包;
  • 策略配置中设置了表名到实体类名的映射策略、字段名到属性名的映射策略、是否使用Lombok、是否使用RestController、需要生成的表名和Controller的URL中是否使用短横线分隔。

6. 如何配置模版代码

我们在项目的依赖中找到mybatis-plus-generator 打开,会发现有个templates目录,里面放置了各种格式的模版,我们将适合我们的模版复制到我们项目中resources下,这里我以vm格式为例。

复制完成后,我们将模版路径在代码生成配置中引入即可。需要说明的是,我们需要根据自己项目的业务来配置模版内容来达到我们的需求,主要修改的是controller层,其他类需具体情况而定。

下面是我的示例,我也会把项目代码放到gitee或者github上,供大家参考。

代码语言:java复制
    @Autowired
    private $!{table.serviceName} $!{table.entityPath}Service;

    @ApiOperation("查询$!{table.comment}")
    @GetMapping("/list")
    public AjaxResult list(${entity} ${table.entityPath}){
            List<${entity}> list= $!{table.entityPath}Service.list($!{table.entityPath});
            return success(list);
    }

    @ApiOperation("分页查询$!{table.comment}")
    @GetMapping("/page")
    public AjaxResult page(Page<${entity}> page,${entity} ${table.entityPath}){
            IPage<${entity}> $!{table.entityPath}IPage= $!{table.entityPath}Service.page(page, ${table.entityPath});
            return success($!{table.entityPath}IPage);
    }

    @ApiOperation("获取$!{table.comment}详细信息")
    @GetMapping(value = "/{id}")
    public AjaxResult getById(@PathVariable Long id){
            return success( $!{table.entityPath}Service.getById(id));
    }

    @ApiOperation("新增$!{table.comment}")
    @PostMapping
    public AjaxResult save(@RequestBody ${entity} ${table.entityPath}){
            return success(${table.entityPath}Service.save(${table.entityPath}));
    }

    @ApiOperation("修改$!{table.comment}")
    @PutMapping
    public AjaxResult updateById(@RequestBody ${entity} ${table.entityPath}){
            return success(${table.entityPath}Service.updateById(${table.entityPath}));
    }

    @ApiOperation("删除$!{table.comment}")
    @DeleteMapping("/{id}")
    public AjaxResult remove(@PathVariable Long id){
            return success(${table.entityPath}Service.removeById(id));
    }

7. 测试代码生成

我们在气短业务中使用axios发送请求,比如:

代码语言:js复制
// 使用get方法直接带参数
axios.get('http://localhost:8888/generator/java', {
  params: {
    tableName: 'users'
  }
})
.then(response => {
  console.log(response.data); // 处理返回的数据
})
.catch(error => {
  console.error('Error fetching data:', error);
});

发送成功后,我们在项目中设定的目录下就会有这些java类。

需要注意的是,生成的代码可能会缺失引入的依赖等一些问题,此时需要我们手动导入类,需将导入的类路径添加到我们的模版代码中。

总结

MyBatis-Plus的代码生成器是非常实用的工具,它们可以大大提高开发效率,减少手写代码的工作量,使我们可以将注意力集中在复杂的业务需求上。

在使用代码生成器时,我们需要注意配置文件的参数和插件的使用方法,以便更好地发挥它们的作用,以上就是代码生成的基本过程,后期我也会优化,还有更多的功能等待我们去探索。

最后,感谢腾讯云开发者社区小伙伴的陪伴,如果你喜欢我的博客内容,认可我的观点和经验分享,请点赞、收藏和评论,这将是对我最大的鼓励和支持。同时,也欢迎大家提出宝贵的意见和建议,让我能够更好地改进和完善我的博客。谢谢!

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞