前言
目前正在出一个Mybatis Plus
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
之前给大家讲过Mybatis
教程,而MyBatis-Plus
是一个 MyBatis
的增强工具,在MyBatis
的基础上只做增强不做改变,为简化开发、提高效率而生。大家需要注意的是它只是一个工具,大家需要掌握和重点学习的依然是Mybatis
,在熟练掌握基础的情况下使用MyBatis-Plus
会达到事半功倍的效果。
好了, 废话不多说直接开整吧~
代码生成器
代码生成器是Mybatis-Plus
的核心功能之一,它可以根据数据库表结构自动生成Java
代码,比如Entity
、Mapper
、Service
、Controller
等,这样就不需要我们自己去写这些代码了,直接使用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
接口
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~