Mybatis-Plus(简称MP)是我入行不久就接触过的一个简化持久层开发的工具,熟悉基本操作之后简直到了离不开的程度,这是它的官网:https://mp.baomidou.com/
在接触 MP 之前也用过 TK-Mapper(通用Mapper),功能和 MP 类似,没有具体比较过优劣,只是单从两个工具的官网来看MP 的 UI 风格赏心悦目,所以后面换成 MP 之后就一直用它,这里主要记录一下个人在配置 MP 代码生成器的一点心得。
关于代码生成器,在上家公司开始使用,当时是同事配置好在项目中供我们使用的,那会也没有细看他是如何配置的,只是觉得用起来很方便,现在换公司了,发现新的公司没有用 MP,同事们最基本是CRUD都还是在Mapper.xml里写的,这我可不能忍,强烈安利他们一波之后,剩下的活就是自己往项目里去配置了。
本文只是个人在学习时的一个记录,如有不足之处或者错误的地方,还请大佬帮我指出,多谢~
来到官网可以很容易找到代码生成器这一栏
其实在官网上也有快速配置的代码示例
但是官网的代码有些东西我一眼看过去还是不能很容易的看出他具体配置的是啥,而且点击详细配置里会发现有很多很多配置项,虽然很多配置是用不上的,但有点强迫证的我还是想尽量多弄懂一些东西,最好是每一项都能弄明白是怎么配置怎么使用,但是找了很多博客和教程包括官方的github,都没有详细到每一项都去讲解,无奈只能自己一个一个试。
那就从官方文档入手
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.4.1version>
dependency>
<dependency>
<groupId>org.apache.velocitygroupId>
<artifactId>velocity-engine-coreartifactId>
<version>2.3version>
dependency>
DataSourceConfig dataSourceConfig = new DataSourceConfig();
// 数据库类型
dataSourceConfig.setDbType(DbType.MYSQL)
.setUrl("jdbc:mysql://127.0.0.1:3306/XXX")
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("root")
.setPassword("root");
// 以下为非必填项,MP 自动配置
// 选择数据库信息查询类,默认由 dbType 类型决定选择对应数据库内置实现
// dataSourceConfig.setDbQuery(new MySqlQuery());
// 数据库 schema name,例如 PostgreSQL 可指定为 public
// dataSourceConfig.setSchemaName("public");
// 类型转换,默认由 dbType 类型决定选择对应数据库内置实现
// dataSourceConfig.setTypeConvert(new MySqlTypeConvert());
dbType、url、driverName、username、password 这几项都很容易明白
dbQuery:数据库信息查询类,官网的说法是会根据 dbType 的设置而选择对应的实现,点击源码可以看到
确实是对很多数据库有对应实现,包括国产的达梦和金仓等,虽然不知道居然这个类干嘛,但是工具自己回去配置那这个就过了。
SchemaName:数据库 schema name 例如 PostgreSQL 可指定为 public,个人的理解是设置表空间这么一个东西,mysql没有,那就不用设置
typeConvert:类型转换 官网的说法也是会根据 dbType 的设置而选择对应的实现
源码上也是看到了很多对应的实现类,那这个也不用配置,跳过
这样,数据源配置就算配置好了
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(false) // 是否大写命名,默认 false
.setSkipView(false) // 是否跳过视图,默认 false,我没有用到试图,使用默认
.setNaming(NamingStrategy.underline_to_camel) // 表名映射下划线转驼峰
.setColumnNaming(NamingStrategy.underline_to_camel) // 字段名映射下划线转驼峰
//.setTablePrefix("tb_") // 表前缀 设置之后生成的实体类可以去除前缀
//.setFieldPrefix("") // 字段前缀
//.setSuperEntityClass(Father.class.getName()) // 自定义继承的 Entity 类全称,带包名,就是让生成的实体都去继承一个父类,可以是自己写的也可以是源码自带的
//.setSuperEntityColumns("id","age") // 自定义基础的 Entity 类公共字段
//.setSuperMapperClass("") // 自定义继承的 Mapper 类全称,带包名
//.setSuperServiceClass("") // 自定义继承的 Service 类全称,带包名
//.setSuperServiceImplClass("") // 自定义继承的 ServiceImpl 类全称,带包名
//.setSuperControllerClass("") // 自定义继承的 Controller 类全称,带包名
//.setEnableSqlFilter(false) // 默认激活进行 sql 模糊表名匹配关闭之后 likeTable 与 notLikeTable 将失效,include 和 exclude 将使用内存过滤如果有 sql 语法兼容性问题的话,请手动设置为 false
.setInclude("user") // 需要包含的表名,当 enableSqlFilter 为 false 时,允许正则表达式(与 exclude 二选一配置)
//.setLikeTable(null) // 自 3.3.0 起,模糊匹配表名(与 notLikeTable 二选一配置)
//.setExclude("") // 需要排除的表名,当 enableSqlFilter 为 false 时,允许正则表达式
//.setNotLikeTable(null) // 自 3.3.0 起,模糊排除表名
//.setEntityColumnConstant(false) //是否生成字段常量(默认 false)
.setChainModel(true) //是否为链式模型(默认 false) 喜欢一直点点点方法
.setEntityLombokModel(true) // 【实体】是否为lombok模型(默认 false)3.3.2 以下版本默认生成了链式模型,3.3.2 以后,默认不生成,如有需要,请开启 chainModel
//.setEntityBooleanColumnRemoveIsPrefix(false) // Boolean 类型字段是否移除 is 前缀(默认 false)
.setRestControllerStyle(true) // 生成 @RestController 控制器
//.setControllerMappingHyphenStyle(false) // 驼峰转连字符
.setEntityTableFieldAnnotationEnable(true); // 是否生成实体时,生成字段注解
//.setVersionFieldName("version") // 乐观锁属性名称 会给乐观锁属性加上乐观锁注解
//.setLogicDeleteFieldName("deleted") // 逻辑删除属性名称 会给逻辑删除属性加上逻辑删除注解
//.setTableFillList(null); // 表填充字段
这个配置项就有很多了,简单的代码上已经附上的官方注释和个人的解释就不在详细赘述,个人觉得比较难理解的按照文档上的顺序:
setCapitalMode:是否大写命名,默认 false,在配置这一项的时候,我到目前为止没有搞清楚这是干嘛的,文档上只有这一句话:
我不明白这个大写命名指的是什么地方大写,我配置完所有之后把这一项分别设置true和false得到的结果都是一样的,还请明白的大佬给出指导~~~ 这项索性就先用默认值
setSuperEntityColumns:自定义基础的 Entity 类公共字段,这个属性在我设置数据库表中包含的字段时,生成的实体就会没有那个属性,比如我有一张表:
create table user(
id bigint not null comment '主键ID'
primary key,
name varchar(30) null comment '姓名',
age int null comment '年龄',
email varchar(50) null comment '邮箱'
);
我再配置中设置setSuperEntityClass(Father.class.getName()) setSuperEntityColumns(“id”,“age”),那我生成的实体类将会是这样
public class User extends Father {
/**
* 姓名
*/
@TableField("name")
private String name;
/**
* 邮箱
*/
@TableField("email")
private String email;
}
实体中就没用 id 和 age 中,我个人猜想是此时即便你的父类没有这两个属性,他默认认为你的父类中是包含 id 和 age 的,他也不给你生成你指定的这两个属性,所以,我也用不上这个,不设置。
setSuperMapperClass
setSuperServiceClass
setSuperServiceImplClass
setSuperControllerClass
这几个属性,设置生成的 Mapper Service 等需要继承哪个类
而源码中默认帮我指定了MP的BaseMapper、IService、ServiceImpl 我们使用MP最重要的不就是需要用这些东西吗,而controller一般都不继承啥东西,所以这几项都不配置使用他内置好的
setTableFillList:当需要使用比如乐观锁,逻辑删除时需要配置这个,由于我一般业务用不上乐观锁,逻辑删除我一般是手动将逻辑删除属性进行update操作,所以不需要配置,也没有深究如何配置,暂时不设置此项。
数据库表配置结束
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.fitminf.project.tailor"); // 父包名。如果为空,将下面子包名必须写全部,否则就只需写子包名
//packageConfig.setModuleName(""); // 父包模块名
// packageConfig.setEntity(""); // Entity 包名
// packageConfig.setService(""); // Service 包名
// packageConfig.setServiceImpl(""); // Service Impl 包名
// packageConfig.setMapper(""); // Mapper 包名
// packageConfig.setXml(""); // Mapper XML包名
// packageConfig.setController(""); // Controller 包名
// packageConfig.setPathInfo(); // 路径配置信息
这里比较简单,我配置一个父包名,其他用默认的,命名基本都是约定俗成,除了setEntity这一项,有的叫entity有的叫pojo有的叫domain等等,这个具体配置一个公司里使用的即可
包名配置结束
TemplateConfig injectionConfig
TemplateConfig 这个我默认使用MP自带的模板,也可以修改,但是好像需要会弄一些模板引擎的东西,我还不擅长那块,且自带的足够我使用。
injectionConfig 这个也是根据自己所需订制生成一些个性化的东西,好像也是和模板相关,后期再研究
所以这两个暂时用不上。。。
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); // 生成文件的输出目录
globalConfig.setFileOverride(false); // 是否覆盖已有文件
globalConfig.setOpen(false); // 是否打开输出目录
globalConfig.setEnableCache(false); // 是否在 xml 中添加二级缓存配置 缓存都用redis
globalConfig.setAuthor("Fitminf"); // 开发人员
//globalConfig.setKotlin(false); // 开启 Kotlin 模式 不需要
globalConfig.setSwagger2(true); // 开启 swagger2 模式 前提是要映入相关依赖
globalConfig.setActiveRecord(false); // 开启 ActiveRecord 模式 AR模式详见 MP 官方文档的AR说明
globalConfig.setBaseResultMap(true); // 开启 BaseResultMap mapper XML 文件 的ResultMap
globalConfig.setBaseColumnList(true); // 开启 baseColumnList mapper XML 文件 的BaseColumn
globalConfig.setDateType(DateType.ONLY_DATE); // 时间类型对应策略 默认值:TIME_PACK
//globalConfig.setEntityName(""); // 实体命名方式
//globalConfig.setMapperName(""); // mapper 命名方式
//globalConfig.setXmlName(""); // Mapper xml 命名方式
//globalConfig.setServiceName(""); // service 命名方式
//globalConfig.setServiceImplName(""); // service impl 命名方式
//globalConfig.setControllerName(""); // controller 命名方式 这几个命名使用默认即可
globalConfig.setIdType(IdType.ASSIGN_UUID); // 指定生成的主键的 ID 类型
全局配置结束
package com.fitminf.project.tailor.common.utils;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* GeneratorCodeUtil
*
* Mybatis-Plus 代码自动生成器
*
* @author Fitminf
* @version 1.0
* @since 2021-04-27 10:27
*/
public class GeneratorCodeUtil {
public static void main(String[] args) {
AutoGenerator generator = new AutoGenerator();
generator.setDataSource(getDataSourceConfig())
.setStrategy(getStrategyConfig())
.setPackageInfo(getPackageConfig())
.setGlobalConfig(getGlobalConfig());
generator.execute();
}
/**
* 基本配置:数据源配置
*/
private static DataSourceConfig getDataSourceConfig() {
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)
.setUrl("jdbc:mysql://127.0.0.1:3306/XXX")
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("root")
.setPassword("root");
return dataSourceConfig;
}
/**
* 数据库表配置
*/
private static StrategyConfig getStrategyConfig() {
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(false)
.setNaming(NamingStrategy.underline_to_camel)
.setColumnNaming(NamingStrategy.underline_to_camel)
.setInclude("user")
.setChainModel(true)
.setEntityLombokModel(true)
.setRestControllerStyle(true)
.setEntityTableFieldAnnotationEnable(true);
return strategyConfig;
}
/**
* 包名配置
*/
private static PackageConfig getPackageConfig() {
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.fitminf.project.tailor");
return packageConfig;
}
/**
* 全局策略配置
*/
private static GlobalConfig getGlobalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
globalConfig.setFileOverride(true);
globalConfig.setOpen(false);
globalConfig.setEnableCache(false);
globalConfig.setAuthor("Fitminf");
globalConfig.setSwagger2(true);
globalConfig.setActiveRecord(false);
globalConfig.setBaseResultMap(true);
globalConfig.setBaseColumnList(true);
globalConfig.setDateType(DateType.ONLY_DATE);
globalConfig.setIdType(IdType.ASSIGN_UUID);
return globalConfig;
}
}
到这里就大功告成了
在我配置过程中也发现了一些不明白的地方,在这里列举一下:
1、数据库表配置(策略配置)中的 setCapitalMode 是否大写命名 到底指的是哪里
2、下载依赖的时候我使用的是
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.4.1version>
dependency>
当前时间是 2021-04-30,官方已经出了 mybatis-plus-generator 3.4.2 的版本,但是在这个网站https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator
最新版只有3.4.1,我的maven仓库配置的是阿里仓库,是需要更换什么仓库才能下载最新的呢
还请大佬多多指教!!!
谢谢