前言
进修者还清晰的记得,刚开始工作的时候,自己完全就是一个小白。在公司中总能听到前辈们互相吹嘘,说自己效率有多么的高。A前辈说:“我很会划水,一般闲聊30分钟,敲代码10分钟”。 B前辈也不甘示弱:“我一般先玩个40分钟,敲代码5分钟”。我当时心想:都这么牛批的吗?是真的牛批还是在吹牛皮。
自从使用了Mybatis Plus,我相信前辈们的话可能是真的。Mybatis Plus提供了代码生成的功能,让我们写代码变得如此简单!
正文
在开始分享前,进修者先给大家准备2道Mybatis的面试题,每天积累一点点面试经验。
1、Mybatis中#和$的区别?
2、Mybatis的原理是什么?
问题分析:面试官主要考察面试人员有没有实际开发经验,还有学习的深度。
答案:这里暂时不公布,大家先想想怎么回答。稍后会在评论区中给答案!
一、MyBatis-Plus简介
MyBatis-Plus(简称 MP),它在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,是一个 MyBatis的增强工具和最好的搭档。
二、 新建项目
新建项目,可以使用IDEA快速生成Spring Boot项目或使用MyEclipse创建。这里不做说明。创建好的项目目录如下图所示:
三、 添加相关依赖
在项目目录中找到pom.xml文件,打开文件并配置相关依赖,如:MyBatis-Plus、模板引擎、数据库等依赖。
添加Mybatis Plus相关依赖
Spring Boot整合MyBatis Plus,需要在配置文件中,添加上MyBatis Plus的依赖项。为使用MyBatis Plus的代码生成器功能,还要添加它的代码生成器的依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
添加模板引擎依赖
MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl模板引擎。如果都不满足您的要求,也可以采用自定义模板引擎。这里进修者采用Freemarker模板引擎。
<!-- 添加模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
完整pom.xml配置
项目会包含其他框架的依赖,这里不做一一说明,直接给出完整的配置。
<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.training</groupId>
<artifactId>mybatisplus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.22.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!-- 添加模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
四、 编写执行代码
实现代码也是我们代码生成器实现的重要部分,大家要认真阅读,进修者已经把整体拆开来方便大家学习。代码生成器主要包含:全局配置、数据源配置、包配置、自定义配置和策略配置。
全局配置
全局配置也是公有的配置,可以设置项目输出路径、作者、主键策略、是否开启Swagger2模式等。部分代码如下:
// 全局配置
GlobalConfig globalConfig = new GlobalConfig();
final String projectPath = System.getProperty("user.dir");
globalConfig.setOutputDir(projectPath + "/src/main/java");
//System.out.println("项目路径:"+projectPath);
globalConfig.setAuthor("training");
globalConfig.setOpen(false);
// gc.setSwagger2(true); // 实体属性 Swagger2 注解
globalConfig.setServiceName("%sService");
mpg.setGlobalConfig(globalConfig);
数据源配置
数据源配置是说明使用哪种数据库来存储数据的,根据自己目前的需要进行配置,并已经在数据库中创建了对应的表。部分代码如下:
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/userssm?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
包配置
项目包配置用于生成业务类、控制器类、存储类、实体类等包。不进行设置包名称将会按照默认包名生成。部分代码如下:
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(null);
pc.setParent("com.training");
mpg.setPackageInfo(pc);
自定义模板
自定义模板可以将Mapper.xml文件生成到我们指定的地方。如果我们想要将其放到resources目录下面就可以通过自定义模板来完成。部分代码如下:
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// blank
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// TODO Auto-generated method stub
return projectPath + "/src/main/resources/mapper/"
+ "/" + tableInfo.getEntityName() + "Mapper" + ConstVal.XML_SUFFIX;
}
});
策略配置
策略配置主要用来对实体类和相关类的生成规则进行设置,部分代码如下:
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(setTables().split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix("m_");
完整代码
这里是整个项目的所有代码,整合了上面的所有功能代码片段。完整代码如下:
package com.training.generator;
import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.ConstVal;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
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.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
/**
* 代码生成器
* <p>Copyright: training</p>
* @author 进修者
* @version 1.0 create time:2023-4-4
*/
public class CodeGenerator {
// 设置表名称,多个表用逗号隔开
public static String setTables() {
return "user";
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig globalConfig = new GlobalConfig();
final String projectPath = System.getProperty("user.dir");
globalConfig.setOutputDir(projectPath + "/src/main/java");
//System.out.println("项目路径:"+projectPath);
globalConfig.setAuthor("training");
globalConfig.setOpen(false);
// gc.setSwagger2(true); // 实体属性 Swagger2 注解
globalConfig.setServiceName("%sService");
mpg.setGlobalConfig(globalConfig);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/userssm?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(null);
pc.setParent("com.training");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// blank
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// TODO Auto-generated method stub
return projectPath + "/src/main/resources/mapper/"
+ "/" + tableInfo.getEntityName() + "Mapper" + ConstVal.XML_SUFFIX;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(setTables().split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix("m_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
五、 结果展示
执行代码,然后查看项目目录,就会有相应包和代码生成。如下图所示:
小结
Spring Boot整合MyBatis-Plus非常简单。使用它的代码生成器功能,能够快速生成代码,提高了我们的工作效率。现在进修者也可以像当时的前辈那样吹嘘:“我也变得牛批了!哈哈哈,我可用不了5分钟哦”!
感谢您读完了进修者的内容分享,欢迎留言区一起聊聊天,聊聊关于您对MyBatis-Plus代码生成有什么更好的想法!
我是进修者,期待与您肩并肩,一起进化成长!