likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 5

前言

目前正在出一个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接口

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

MybatisPlus教程相关文章

往期Nginx教程相关文章

往期Docker教程相关文章

往前Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)