一起来学Mybatis Plus(三) & 代码生成器

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一起来学Mybatis Plus(三) & 代码生成器

前言

目前正在出一个Mybatis Plus系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

之前给大家讲过Mybatis教程,而MyBatis-Plus 是一个 MyBatis 的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。大家需要注意的是它只是一个工具,大家需要掌握和重点学习的依然是Mybatis,在熟练掌握基础的情况下使用MyBatis-Plus会达到事半功倍的效果。

好了, 废话不多说直接开整吧~

代码生成器

代码生成器是Mybatis-Plus的核心功能之一,它可以根据数据库表结构自动生成Java代码,比如EntityMapperServiceController等,这样就不需要我们自己去写这些代码了,直接使用Mybatis-Plus的代码生成器,就可以自动生成这些代码,省去了我们很多的时间,本节使用的生成器是新生成器(version: 3.5.3)。

核心配置

在实战之前,给大家过一遍生成器的一些核心配置,在了解了配置之后,大家可以根据自己的需求定制自己的代码生成器

数据库配置 & DataSourceConfig

new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
    .build();

Builder传入三个参数,分别是:

  • url    jdbc路径
  • username 数据库账号
  • password 数据库密码

它还有一些可选配置:

  • dbQuery(IDbQuery) 数据库查询
  • schema(String) 数据库 schema(部分数据库适用)
  • typeConvert(ITypeConvert) 数据库类型转换器
  • keyWordsHandler(IKeyWordsHandler) 数据库关键字处理器
  • typeConvertHandler(ITypeConvertHandler) 类型转换器(默认)
  • databaseQueryClass(AbstractDatabaseQuery) 数据库查询方式
new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456")
    .schema("mybatis-plus")
    .keyWordsHandler(new MySqlKeyWordsHandler())
    .build();

全局配置 & GlobalConfig

全局配置有以下:

  • disableOpenDir 禁止打开输出目录 默认值:true
  • outputDir(String) 指定输出目录 /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
  • author(String) 作者名 baomidou 默认值:作者
  • enableKotlin 开启 kotlin 模式 默认值:false
  • enableSwagger 开启 swagger 模式 默认值:false
  • dateType(DateType) 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
  • commentDate(String) 注释日期 默认值: yyyy-MM-dd
new GlobalConfig.Builder()
    .fileOverride()
    .outputDir("/opt/baomidou")
    .author("baomidou")
    .enableKotlin()
    .enableSwagger()
    .dateType(DateType.TIME_PACK)
    .commentDate("yyyy-MM-dd")
    .build();

包配置 & PackageConfig

  • parent(String) 父包名 默认值:com.baomidou
  • moduleName(String) 父包模块名 默认值:无
  • entity(String) Entity 包名 默认值:entity
  • service(String) Service 包名 默认值:service
  • serviceImpl(String) Service Impl 包名 默认值:service.impl
  • mapper(String) Mapper 包名 默认值:mapper
  • xml(String) Mapper XML 包名 默认值:mapper.xml
  • controller(String) Controller 包名 默认值:controller
  • other(String) 自定义文件包名 输出自定义文件时所用到的包名
  • pathInfo(Map<OutputFile, String>) 路径配置信息 Collections.singletonMap(OutputFile.mapperXml, "D://")
new PackageConfig.Builder()
    .parent("com.baomidou.mybatisplus.samples.generator")
    .moduleName("sys")
    .entity("po")
    .service("service")
    .serviceImpl("service.impl")
    .mapper("mapper")
    .xml("mapper.xml")
    .controller("controller")
    .other("other")
    .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://"))
    .build();

模板配置 & TemplateConfig

这个配置能够让我们自定义代码模版,生成符合项目预期的代码,同时也符合项目规范,默认不配置的情况下会使用默认的模版,该模版比较简单,只是单纯生成类,内部并没有定义任何方法或属性,MyBatisPlus默认使用的模版引擎是velocity

  • disable 禁用所有模板
  • disable(TemplateType...) 禁用模板,比如实体模版 TemplateType.ENTITY
  • entity(String) 设置实体模板路径(JAVA) /templates/entity.java
  • entityKt(String) 设置实体模板路径(kotlin) /templates/entity.java
  • service(String) 设置 service 模板路径 /templates/service.java
  • serviceImpl(String) 设置 serviceImpl 模板路径 /templates/serviceImpl.java
  • mapper(String) 设置 mapper 模板路径 /templates/mapper.java
  • controller(String) 设置 controller 模板路径 /templates/controller.java
new TemplateConfig.Builder()
    .disable(TemplateType.ENTITY)
    .entity("/templates/entity.java")
    .service("/templates/service.java")
    .serviceImpl("/templates/serviceImpl.java")
    .mapper("/templates/mapper.java")
    .controller("/templates/controller.java")
    .build();

注入配置 & InjectionConfig

  • beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>) 输出文件之前消费者
  • customMap(Map<String, Object>) 自定义配置 Map 对象,可以用于模版中的属性
  • customFile(Map<String, String>) 自定义配置模板文件
new InjectionConfig.Builder()
    .beforeOutputFile((tableInfo, objectMap) -> {
        System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
    })
    .customMap(Collections.singletonMap("test", "baomidou"))
    .customFile(Collections.singletonMap("test.txt", "/templates/test.vm"))
    .build();

策略配置 & StrategyConfig

  • enableCapitalMode 开启大写命名 默认值:false
  • enableSkipView 开启跳过视图 默认值:false
  • disableSqlFilter 禁用 sql 过滤 默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
  • enableSchema 启用 schema 默认值:false,多 schema 场景的时候打开
  • likeTable(LikeTable) 模糊表匹配(sql 过滤) likeTable 与 notLikeTable 只能配置一项
  • notLikeTable(LikeTable) 模糊表排除(sql 过滤) likeTable 与 notLikeTable 只能配置一项
  • addInclude(String...) 增加表匹配(内存过滤) include 与 exclude 只能配置一项 ,支持正则匹配、例如 ^t_.* 所有 t_ 开头的表名
  • addExclude(String...) 增加表排除匹配(内存过滤) include 与 exclude 只能配置一项 ,支持正则匹配、例如 .*st$ 所有 st 结尾的表名
  • addTablePrefix(String...) 增加过滤表前缀
  • addTableSuffix(String...) 增加过滤表后缀
  • addFieldPrefix(String...) 增加过滤字段前缀
  • addFieldSuffix(String...) 增加过滤字段后缀
  • outputFile 内置模板输出文件处理
  • entityBuilder 实体策略配置
  • controllerBuilder controller 策略配置
  • mapperBuilder mapper 策略配置
  • serviceBuilder service 策略配置
new StrategyConfig.Builder()
    .enableCapitalMode()
    .enableSkipView()
    .disableSqlFilter()
    .likeTable(new LikeTable("USER"))
    .addInclude("t_simple")
    .addTablePrefix("t_", "c_")
    .addFieldSuffix("_flag")
    .build();

下面,一起实现一个代码生成器~

定制代码生成器

首先,需要导入相关的包

 <dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3</version>
</dependency>

接着编写生成器代码:

package com.springboot.all.mybatisplus;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class MyBatisPlusGenerator {
    public Map<String, Object> getPackageInfo() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("packageName", "com.springboot.all.mybatisplus");
        map.put("upperClassName", "User");
        map.put("lowerClassName", "user");
        return map;
    }
    @Test
    public void generate() {
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&useUnicode=true&useSSL=false", "root", "qcl123456")
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("pkq") 
                            .commentDate("yyyy-MM-dd hh:mm:ss") 
                            .outputDir("./src/main/java") 
                            .disableOpenDir() 
                    ;
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.springboot.all.mybatisplus") 
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "./src/main/resources/mappers"));
                })
                // 模版配置
                .templateConfig(builder -> {
                    builder.disable(TemplateType.ENTITY).controller("/templates/controller.java").build();
                })
                // 注入配置
                .injectionConfig(builder -> {
                    builder.customMap(getPackageInfo()).build();
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("user") 
                            .addTablePrefix("sys_")
                            .entityBuilder()
                            .enableLombok() /
                            .enableFileOverride() 
                            .naming(NamingStrategy.underline_to_camel)  
                            .columnNaming(NamingStrategy.underline_to_camel) 
                            .mapperBuilder()
                            .enableFileOverride()
                            .serviceBuilder()
                            .enableFileOverride() 
                            .formatServiceFileName("%sService") 
                            .formatServiceImplFileName("%sServiceImpl") 
                            .controllerBuilder()
                            .enableFileOverride()
                    ;
                })
                .execute();
    }
}

接着我们编写controller模版文件,这里的模版大家可以自定义,比如加上swagger注解,统一的返回Result,统一的参数校验等等,可以自由发挥,这里给大家写一个简单的模版,模版内的属性${}就是注入进去的Map

// templates/controller.java
package ${packageName}.controller;
import ${packageName}.entity.${upperClassName};
import ${packageName}.service.${upperClassName}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/${lowerClassName}")
public class ${upperClassName}Controller {
    @Autowired
    private ${upperClassName}Service ${lowerClassName}Service;
    @GetMapping("/all")
    @ResponseBody
    public List<${upperClassName}> get${upperClassName}List() {
        return ${lowerClassName}Service.get${upperClassName}Info();
    }
}

点击运行generate(),可以看到生成的UserController类:

package com.springboot.all.mybatisplus.controller;
import com.springboot.all.mybatisplus.entity.User;
import com.springboot.all.mybatisplus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/all")
    @ResponseBody
    public List<User> getUserList() {
        return userService.getUserInfo();
    }
}

其它的Service,Entity也都是如此,这里就不一一给大家介绍了,运行之后的目录结构,自动帮我们生成了相关的类代码

├─springboot-mybatis-plus
│  ├─src
│  │  ├─main
│  │  │  ├─java
│  │  │  │  └─com
│  │  │  │      └─springboot
│  │  │  │          └─all
│  │  │  │              └─mybatisplus
│  │  │  │                  ├─config
│  │  │  │                  ├─controller
│  │  │  │                  ├─entity
│  │  │  │                  ├─mapper
│  │  │  │                  ├─model
│  │  │  │                  ├─service
│  │  │  │                  │  └─impl
│  │  │  │                  └─test
│  │  │  └─resources
│  │  │      ├─mappers
│  │  │      └─templates
│  │  └─test
│  │      └─java

大家可以根据自己的需求来定制代码生成器,需要提醒的是生成的代码可能会覆盖之前的类,所以大家要谨慎,可以生成到外部目录,把需要的代码复制进去,如果写一半不小心又被覆盖了,这就有点尴尬了,所以要查看下配置是否设置了覆盖模式

结束语

下节给大家讲解CRUD接口

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
2月前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
4月前
|
Java 数据库连接 测试技术
mybatis plus 获取新增实体的主键
mybatis plus 获取新增实体的主键
143 8
|
4月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
58 7
|
4月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
93 4
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
91 3
|
4月前
|
Java 数据库连接 数据库
mybatis plus 中增删改查及Wrapper的使用
mybatis plus 中增删改查及Wrapper的使用
216 3
|
4月前
|
算法 Java 数据库连接
mybatis plus 主键策略
mybatis plus 主键策略
56 2
|
4月前
Mybatis-Plus 代码生成器
Mybatis-Plus 代码生成器