前言
目前正在出一个Mybatis Plus
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
之前给大家讲过Mybatis
教程,而MyBatis-Plus
是一个 MyBatis
的增强工具,在MyBatis
的基础上只做增强不做改变,为简化开发、提高效率而生。大家需要注意的是它只是一个工具,大家需要掌握和重点学习的依然是Mybatis
,在熟练掌握基础的情况下使用MyBatis-Plus
会达到事半功倍的效果。
好了, 废话不多说直接开整吧~
代码生成器
代码生成器是Mybatis-Plus
的核心功能之一,它可以根据数据库表结构自动生成Java
代码,比如Entity
、Mapper
、Service
、Controller
等,这样就不需要我们自己去写这些代码了,直接使用Mybatis-Plus
的代码生成器,就可以自动生成这些代码,省去了我们很多的时间,本节使用的生成器是新生成器(version: 3.5.3)。
核心配置
在实战之前,给大家过一遍生成器的一些核心配置,在了解了配置之后,大家可以根据自己的需求定制自己的代码生成器
数据库配置 & DataSourceConfig
java
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) 数据库查询方式
java
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
java
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://")
java
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
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>) 自定义配置模板文件
java
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 策略配置
java
new StrategyConfig.Builder()
.enableCapitalMode()
.enableSkipView()
.disableSqlFilter()
.likeTable(new LikeTable("USER"))
.addInclude("t_simple")
.addTablePrefix("t_", "c_")
.addFieldSuffix("_flag")
.build();
下面,一起实现一个代码生成器~
定制代码生成器
首先,需要导入相关的包
xml
<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>
接着编写生成器代码:
java
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
java
// 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
类:
java
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
也都是如此,这里就不一一给大家介绍了,运行之后的目录结构,自动帮我们生成了相关的类代码
css
├─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脚本编程相关文章
- 一起来学Shell脚本编程(一)
- 一起来学Shell脚本编程(二)
- 一起来学Shell脚本编程(三)
- 一起来学Shell脚本编程(四)
- 一起来学Shell脚本编程(五)
- 一起来学Shell脚本编程(六)
- 一起来学Shell脚本编程(七)
往期Linux相关文章
- 一起来学Linux命令(一)
- 一起来学Linux命令(二)
- 一起来学Linux命令(三)
- 一起来学Linux命令(四)
- 一起来学Linux命令(五)
- 一起来学Linux命令(六)
- 一起来学Linux命令(七)
- 一起来学Linux命令(八)
- 一起来学Linux命令(九)
- 一起来学Linux命令(十)
往期面试题相关文章
- 查漏补缺第一期(Redis相关)
- 查漏补缺第二期(synchronized & 锁升级)
- 查漏补缺第三期(分布式事务相关)
- 查漏补缺第四期(Mysql相关)
- 查漏补缺第五期(HashMap & ConcurrentHashMap)
- 查漏补缺第六期(京东一面)
- 查漏补缺第七期(美团到店一面)
- 查漏补缺第八期(阿里一面)
- 查漏补缺第九期(阿里二面)
- 查漏补缺第十期(网易实习一面)
- 查漏补缺第十一期(网易实习二面)
- 查漏补缺第十二期(网易实习三面)
- 查漏补缺第十三期(滴滴实习一面)
- 查漏补缺第十四期(滴滴实习二面)
- 查漏补缺第十五期(华为一面)
- 查漏补缺第十六期(华为二面)
- 查漏补缺第十七期(华为三面)
- 查漏补缺第十八期(你了解class文件吗)
项目源码(源码已更新 欢迎star⭐️)
往期设计模式相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
- 一起来学设计模式之状态模式
- 一起来学设计模式之策略模式
- 一起来学设计模式之模板方法模式
- 一起来学设计模式之访问者模式
- 一起来学设计模式之依赖注入模式
设计模式项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看