网站首页 > 开源技术 正文
收藏等于学会,赶紧关注吧!
前言
代码自动生成是根据我们的数据表,逆向生成Controller、Service、Mapper接口以及Mapper的xml文件的代码,不用再手动创建文件写通用的注解等,以此来提高开发效率,当然你也可以通过Mybatis-Plus的代码生成器封装进自己的系统中来二次实现,加入前端实现可视化的代码生成,我们这里实现一个在控制台操作的代码生成器
一、什么是代码生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,而且对单表都有默认实现,极大提升开发效率。
二、怎么用
2.1、使用步骤
- 引入mybatis-plus、generator、velocity、mysql、spring-boot-starter-web、swagger【非必要】、lombok【非必要】依赖
- 创建代码生成器类,并完成代码生成的相关配置
- 配置多张表,批量生成模块代码
2.2、项目引入依赖
特别说明:MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:
我这里使用maven搭建的spring-boot项目,项目名为 buye-test 相关依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 依赖自己的父工程 -->
<parent>
<artifactId>buye</artifactId>
<groupId>com.buye</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>buye-test</artifactId>
<dependencies>
<!--springboot-web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis-plus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- mybatis-plus代码生成依赖 MyBatis-Plus从 3.0.3 之后移除了 代码生成器与模板引擎的默认依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<!-- 模板引擎依赖,当然您也可以使用Freemarker或者Beetl -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
父工程中主要定义依赖了版本,下边贴出父工程的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.buye</groupId>
<artifactId>buye</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>buye-test</module>
</modules>
<properties>
<buye.version>1.0.0</buye.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<swagger.version>3.0.0</swagger.version>
<mybatis-plus.version>3.4.3.4</mybatis-plus.version>
<mp-generator.version>3.4.1</mp-generator.version>
<velocity.version>2.3</velocity.version>
<lombok.version>1.18.22</lombok.version>
</properties>
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- MP的代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mp-generator.version}</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
</project>
这里您可以根据自己的需求来创建项目,只需要将这些依赖引入即可,具体依赖见 buye-test 工程,没有引入任何多余依赖
2.2.1、模板引擎依赖
这里我引入的模板引擎是 Velocity(默认也就是无需做配置),MyBatis-Plus还支持Freemarker、Beetl,您可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎,如果您也是用 Velocity 引擎则无需引入以下依赖,如果您使用其他模板引擎,请将上文的maven依赖中的 Velocity 依赖替换掉。
Freemarker 依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>版本可以通过mavne中央仓库查询,选择您想用的版本</version>
</dependency>
Beetl依赖:
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>版本可以通过mavne中央仓库查询,选择您想用的版本</version>
</dependency>
2.3、创建代码生成器类
您在项目创建一个类即可,代码中的注释值得详细看一下,所有的代码解释都在其中,如果还有哪里不明白的评论区见,如果您觉得非常清晰,请给个赞吧。代码如下:
package com.buye.gen;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* 整个流程分为6部分
* 1、创建AutoGenerator 代码生成器对象
* 2、做全局配置
* 3、数据源配置
* 4、包配置
* 5、策略配置
* 6、执行代码生成
* @Date 2021/11/27 11:18
* @Created 添甄
*/
public class BuyeCodeGenerator {
public static void main(String[] args) {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
/*
* 2、创建全局配置对象
* 1)、可以通过该对象配置生成文件的输出位置,类上的@Author注解等
* 2)、在下边我们会使用一些常用的配置
*/
GlobalConfig gc = new GlobalConfig();
// 获取本项目的项目路径,不过该路径在有些情况下会出现问题,所以一般在设置文件输出路径时我会写绝对路径
String projectPath = System.getProperty("user.dir");
System.out.println(projectPath);
// 设置生成文件的输出路径,这里前部分使用的一个绝对路径,后部分是一个mavne项目的目录结构
// 当然您也可以 D:\code\buye\buye-test\src\main\java 这样的一个完整绝对路径
gc.setOutputDir("D:\\code\\buye\\buye-test" + "/src/main/java");
// 设置生成文件(也就是类)上方的@Author注解
gc.setAuthor("添甄");
//生成后是否打开资源管理器
gc.setOpen(false);
//重新生成时文件是否覆盖
gc.setFileOverride(false);
// mp生成service层代码,默认接口名称第一个字母有I,去掉Service接口的首字母I
gc.setServiceName("%sService");
// 主键策略,这里的策略和您的实际项目需要设置
// 在 https://blog.csdn.net/qq_36386908/article/details/121465444 文章中讲过主键策略了
gc.setIdType(IdType.ASSIGN_ID);
// 定义生成的实体类中日期类型
gc.setDateType(DateType.ONLY_DATE);
//开启Swagger2模式
gc.setSwagger2(true);
// 将配置加入到代码生成器中
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/buye?serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setDbType(DbType.MYSQL);
// 将数据源设置仅代码生成器中
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
// 模块名
pc.setModuleName("mp");
pc.setParent("com.buye");
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
// 将包配置设置进代码生成器中
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
// 设置表名,根据数据库表生成实体类和其他文件
strategy.setInclude("sys_user");
//数据库表映射到实体的命名策略
strategy.setNaming(NamingStrategy.underline_to_camel);
//生成实体时去掉表前缀
strategy.setTablePrefix(pc.getModuleName() + "_");
//数据库表字段映射到实体的命名策略
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setEntityLombokModel(true);
//restful api风格控制器
strategy.setRestControllerStyle(true);
//url中驼峰转连字符
strategy.setControllerMappingHyphenStyle(true);
// 将策略设置仅代码生成器
mpg.setStrategy(strategy);
// 6、执行
mpg.execute();
}
}
2.3.1、执行测试
其中有数据表如下:
运行代码:
上边我们仅仅是实现了单表,我们一般的项目也在几十张,甚至百张以上的表,一个一个生成起步很慢,我们只需要将代码生成类中的策略配置中的 strategy.setInclude("sys_user","sys_dept");配置需要生成代码的表。
setInclude(String... include)这个函数的参数是一个可变参数,并且将数据存储到一个Set集合中筛选掉用户不小心传入的重复数据。
注意:这里并不是是说一次性生成所有的表,我们还配置了模块记得吗?根据模块去生成就可以啦
以上就是我们的代码生成的具体操作,在项目中如果能用就用,毕竟可以省略掉很多重复的工作。无论是单表还是多表都给您介绍到。我们没有结束,接下来再翻一翻生成的代码深入理解一下。
三、深挖生成的代码
注意:这里代码生成与代码生成类中的配置息息相关。
3.1、公共部分
每个类上都有的公共部分
2.4、使用其他模板引擎
如果您要使用其他模板引擎:
- 请替换模板引擎依赖
- 在代码生成类中配置模板引擎
默认的就够用啦,别瞎折腾了
// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());
// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());
3.2、实体类
知道为什么引入 lombok 和 swagger了吧
3.3、Mapper接口
3.4、mapper的xml文件
这个文件空空如也,仅仅有一个namespace配置
3.5、Service接口
这里仅仅继承了IService接口,该接口是MyBatis-Plus的,稍后会和 BaseMapper、以及Service实现类中继承的 ServiceImpl 一起介绍
3.6、Service实现类
之前我们的实现类也就是实现接口,但是这里他还帮我们继承了一个 ServiceImpl 类
3.7、Controller
四、MyBatis-Plus基础接口
mybatis-plus中的源码都是中文注释,阅读门槛较低,推荐您阅读一遍,因篇幅问题,以下仅贴出部分代码
4.1、BaseMapper
这个是每个Mapper接口都继承的接口,里边拥有单表的所有CRUD实现、批量操作以及分页查询,部分代码截图如下:
4.2、IService接口
该接口为Service的顶级接口,进一步封装 CRUD 采用 get 【查询单行 】remove 【删除】 list 【查询集合】 page 【分页】的前缀命名方式区分 Mapper 层避免混淆
4.3、ServiceImpl实现类
该实现类接受两个泛型
- 对应模块的Mapper接口
- 对应模块的实现类
可以将Mapper直接进行注入,并且提供getBaseMapper方法提供mapper的获取,方便别的service层调用,并且对sqlSession、单表的CRUD操作做了默认实现,酸爽无比。
五、测试代码
接下来在Controller中写一个添加供您参考,其余的操作都一样
package com.buye.mp.controller;
import com.buye.mp.entity.SysUser;
import com.buye.mp.service.SysUserService;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* 用户信息表 前端控制器
* </p>
*
* @author 添甄
*/
@RestController
@RequestMapping("/mp/sys/user")
public class SysUserController {
@Autowired
private SysUserService userService;
/**
* 添加用户
* @param sysUser
* @return
*/
@PostMapping
public Map<String,Object> addUser(@RequestBody SysUser sysUser) {
// 添加,直接调用service,因为有默认实现,所以其他地方就不用写代码了
boolean saveCount = userService.save(sysUser);
Map<String, Object> map = new HashMap<>();
if(saveCount) {
map.put("code",200);
map.put("message","添加用户成功");
}else {
map.put("code",500);
map.put("message","添加用户失败");
}
return map;
}
}
注意:别忘记添加Mapper扫描
因为从Service到Mapper都已经有了默认实现,我们在单表操作时仅编写Controller即可,如果需要条件查询做判断,可以使用Wrapper是吧!
总结
不知不觉写了一万三千多字,本篇主要介绍了:
- MyBatis-Plus代码生成器的配置和开发,并且实现单量和批量的代码生成
- 讲解了生成代码的结构,和引入依赖的说明
- 通过翻阅生成的代码,为您讲解MyBatis-Plus的常见接口以及它的实现原理
- 通过一个添加案例实现MyBatis-Plus生成代码的具体应用。
如果觉得不错记得关注,点赞哦!!持续更新编程文章
猜你喜欢
- 2024-10-19 Spring 太肥、太慢?你受不了?那 Solon Java Framework 就是你的西施
- 2024-10-19 ActFramework 1.8.32 发布 - 高质量的 Java Web 应用框架
- 2024-10-19 脱离 Spring 苦海,Solon v2.3.0 发布
- 2024-10-19 爱了!阿里巴巴内部出品“SpringBoot+微服务指南”,理论与实战
- 2024-10-19 国企项目就用国产的 Solon Java Framework,v2.5.12 发布
- 2024-10-19 sorms 1.0.10 发布,简易ORM框架(soar框架)
- 2024-10-19 对标 Spring Boot & Cloud,轻量框架 Solon 1.5.8 发布
- 2024-10-19 这三大Java编程码云送给你们,值得一看!
- 2024-10-19 beego Vs Springboot,Java与Golang的性能对决,谁能赢?
- 2024-10-19 Spring Boot教程第5篇:beatsql(spring boot bean)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)