本人是非开发岗转岗开发的,后续又接手了后端开发的工作,在工作过程中发现,中文互联网的教程往往默认读者是有编程基础的,但实际上,对最初学习编程的我来说,如何启动项目都是需要查阅资料的程度,所以我写的文章,尽量浅显易懂,假设您零基础,赶鸭子上架直接上了项目,不得不写代码。
MyBatis Plus是一个基于MyBatis的增强框架,它为MyBatis提供了更多的实用功能和便捷性。MyBatis是一个流行的Java持久层框架,主要用于与关系型数据库进行交互。MyBatis Plus在MyBatis的基础上,提供了一些额外的功能,帮助开发者更高效地进行数据库操作。
MyBatis Plus的主要特点和功能包括:
- 代码生成器:MyBatis Plus提供了一个代码生成器,可以自动生成实体类、映射器(Mapper)、服务接口(Service)以及服务实现类(ServiceImpl),从而减少了开发人员手动编写这些代码的工作量。
- 通用CRUD操作:MyBatis Plus提供了一系列通用的增删改查(CRUD)方法,简化了开发者对数据库进行基本操作的代码编写。
- 条件构造器:MyBatis Plus提供了一个强大的条件构造器,方便开发者构建复杂的查询条件,无需手动拼接SQL语句。
- 分页插件:MyBatis Plus提供了一个简单易用的分页插件,开发者可以快速实现分页查询功能。
- 性能分析插件:MyBatis Plus提供了性能分析插件,可以监控和分析SQL执行性能,帮助开发者找到潜在的性能问题。
- 多租户支持:MyBatis Plus支持多租户功能,方便开发者实现基于租户的数据隔离。
- 乐观锁插件:MyBatis Plus提供了乐观锁插件,用于解决多线程并发下的数据一致性问题。
- 支持lambda表达式:MyBatis Plus支持Java 8的lambda表达式,可以让开发者编写更简洁的代码。
总之,MyBatis Plus作为一个增强框架,提供了许多实用的功能,使得开发者在使用MyBatis进行数据库操作时更加高效和便捷。
代码生成
本文介绍的就是MyBatis Plus提供的代码生成器。如我上述所介绍,通过代码生成器可以自动生成实体类、映射器、服务接口、服务实现类等,可以极大的减少您的工作量。这里简单介绍一下实体类、映射器(Mapper)、服务接口(Service)、服务实现类(ServiceImpl)等。
生成了哪些文件?
生成的这些文件,简单来说包含直接操作数据库的mapper.xml文件,以及映射器(mapper),服务实现类(impl.java)、服务接口(service.java)以及前端控制器(controller.java),前端控制器(controller.java)文件需要你编写供前端使用的接口,mapper.xml文件用来操作数据库,而服务实现类(impl.java)文件,顾名思义,你的业务逻辑需要在这里实现。
引入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency>
在config文件夹下创建MybatisGenerator.java文件
导入包
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
import java.util.List;
代码生成器
/**
* 代码生成
*
* @author 朝来试看青枝上
* @date 2023-04-13
*/
public class MybatisGenerator {
public static void main(String[] args) {
generator("***",//作者信息
"jdbc:postgresql:",//这里键入你的数据库信息
"org.postgresql.Driver",//数据库驱动器
"*****",//数据库账号
"********",//数据库密码
"com.***",//项目包名
"",
"",
"*****",//数据库表名称
"",
new String[]{});
}
/**
* 代码生成器
*
* @param author 作者
* @param url url,不需要带问号
* @param driverName 驱动名称
* @param username 用户名
* @param password 密码
* @param parent 父级类名,com.zjugis.xxx
* @param projectModule 子模块名称,存在maven父子项目时填写子模块名称
* @param functionModule 功能模块,用于包分类
* @param tableName 表名,多个表名用逗号分隔
* @author 朝来试看青枝上
* @date 2023/04/13
*/
public static void generator(String author,
String url,
String driverName,
String username,
String password,
String parent,
String projectModule,
String functionModule,
String tableName,
String parentEntityClass,
String[] parentEntityColumns) {
AutoGenerator mpg = new AutoGenerator();
mpg.setGlobalConfig(globalConfig(author, projectModule));
mpg.setDataSource(dataSourceConfig(url, driverName, username, password));
mpg.setPackageInfo(packageConfig(parent, functionModule));
mpg.setCfg(injectionConfig(functionModule, projectModule));
mpg.setTemplate(templateConfig());
mpg.setStrategy(strategyConfig(tableName, parentEntityClass, parentEntityColumns));
mpg.execute();
}
/**
* 全局配置
*
* @param author 作者
* @param projectModule 项目模块
* @return com.baomidou.mybatisplus.generator.config.GlobalConfig
* @author 朝来试看青枝上
* @date 2023/04/13
*/
private static GlobalConfig globalConfig(String author, String projectModule) {
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
if (!"".equals(projectModule)) {
//多模块工程路径设置
gc.setOutputDir(projectPath + "/" + projectModule + "/src/main/java");
} else {
gc.setOutputDir(projectPath + "/src/main/java");
}
gc.setAuthor(author);
gc.setOpen(false);
//实体属性 Swagger2 注解
gc.setSwagger2(true);
return gc;
}
/**
* 数据源设置
*
* @param url 驱动连接的URL
* @param driverName 驱动名称
* @param username 数据库连接用户名
* @param password 数据库连接密码
* @return DataSourceConfig
*/
private static DataSourceConfig dataSourceConfig(String url,
String driverName,
String username,
String password) {
DataSourceConfig dsc = new DataSourceConfig();
// if (url.contains("?")) {
dsc.setUrl(url);
// } else {
// dsc.setUrl(url + "?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
// }
dsc.setDriverName(driverName);
dsc.setUsername(username);
dsc.setPassword(password);
return dsc;
}
/**
* 包配置
*
* @param parent 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
* @param functionModule 功能模块包名
* @return PackageConfig
*/
private static PackageConfig packageConfig(String parent, String functionModule) {
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(parent);
if (!"".equals(functionModule)) {
packageConfig.setEntity("entity." + functionModule);
packageConfig.setService("service." + functionModule);
packageConfig.setServiceImpl("service.impl." + functionModule);
packageConfig.setMapper("mapper." + functionModule);
packageConfig.setController("controller." + functionModule);
} else {
packageConfig.setParent(parent);
}
return packageConfig;
}
/**
* 自定义配置,设置xml文件路径以及输出格式
*
* @param functionModule 功能模块名称
* @return com.baomidou.mybatisplus.generator.InjectionConfig
* @author 朝来试看青枝上
* @date 2023/04/13
*/
private static InjectionConfig injectionConfig(String functionModule, String projectModule) {
String projectPath = System.getProperty("user.dir");
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
if (!"".equals(projectModule)) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + projectModule + "/src/main/resources/mapper/" + functionModule
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
} else {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + functionModule
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
}
});
cfg.setFileOutConfigList(focList);
return cfg;
}
/**
* 模板路径配置项
*
* @return com.baomidou.mybatisplus.generator.config.TemplateConfig
* @author 朝来试看青枝上
* @date 2023/04/13
*/
private static TemplateConfig templateConfig() {
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
return templateConfig;
}
private static StrategyConfig strategyConfig(String tableName, String parentEntityClass, String[] parentEntityColumns) {
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
if (parentEntityClass != null
&& !"".equals(parentEntityClass)
&& parentEntityColumns != null
&& parentEntityColumns.length > 0) {
// 公共父类
strategy.setSuperEntityClass(parentEntityClass);
// 写于父类中的公共字段
strategy.setSuperEntityColumns(parentEntityColumns);
}
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
if (!"".equals(tableName)) {
strategy.setInclude(tableName.split(","));
}
strategy.setControllerMappingHyphenStyle(true);
// strategy.setTablePrefix(pc.getModuleName() + "_");
return strategy;
}
}