MybatisPlus中代码生成器教程详解(mybatis代码自动生成器)
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。因此本文章介绍如何使用 MyBatis-Plus的代码生成器如何使用。
基于Spring整合Mybatis-Plus代码生成器
创建Spring项目并导入依赖
<dependencies> <!--mp核心依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> </dependencies> 复制代码
在test文件下创建CodeGeneratorTest文件
public class CodeGeneratorTest { /** * <p> * 读取控制台内容 * </p> */ @Test public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); //获取当前系统目录 String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("author"); //生成作者注释 gc.setOpen(false); //生成后是否打开资源管理器 gc.setFileOverride(false); //重新生成时文件是否覆盖 gc.setServiceName("%sService"); //去掉Service接口的首字母I gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型 gc.setSwagger2(false);//开启Swagger2模式 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8"); // dsc.setSchemaName("public"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); //数据库类型 dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName("test"); //模块名,可以不设置 //放在哪个包下,父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名 pc.setParent("com.mybatis"); pc.setController("controller"); pc.setEntity("entity"); pc.setService("service"); pc.setMapper("mapper"); mpg.setPackageInfo(pc); // 自定义包配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; // 如果模板引擎是 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) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); 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); //数据库表字段映射到实体的命名策略, 未指定按照 naming 执行 strategy.setColumnNaming(NamingStrategy.underline_to_camel); //自定义继承的Entity类全称,带包名 strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!"); //是否为lombok模型(默认 false) strategy.setEntityLombokModel(true); //生成 @RestController 控制器 strategy.setRestControllerStyle(true); // 公共父类 strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!"); // 写于父类中的公共字段 strategy.setSuperEntityColumns("id"); strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); } } 复制代码
打开目录就可以看到生成的文件
基于SpringBoot整合Mybatis-Plus代码生成器
创建SpringBoot项目
引入依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.lagou</groupId> <artifactId>springBoot-mp-generator</artifactId> <version>0.0.1-SNAPSHOT</version> <name>mp-generator</name> <description>Demo project for Spring Boot</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--mybatis-plus的springboot支持--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 复制代码
在test文件下创建CodeGeneratorTest文件
public class CodeGenerator { /** * <p> * 读取控制台内容 * </p> */ public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotEmpty(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } /** * RUN THIS */ public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); final String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("author"); gc.setOpen(false); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8"); // dsc.setSchemaName("public"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); mpg.setDataSource(dsc); // 包配置 final PackageConfig pc = new PackageConfig(); pc.setModuleName(scanner("模块名")); pc.setParent("com.mybatis.mp.generator"); mpg.setPackageInfo(pc); // 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; List<FileOutConfig> focList = new ArrayList<FileOutConfig>(); focList.add(new FileOutConfig("/templates/mapper.xml.ftl") { @Override public String outputFile(TableInfo tableInfo) { // 自定义输入文件名称 return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); mpg.setTemplate(new TemplateConfig().setXml(null)); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); // strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity"); strategy.setEntityLombokModel(true); // strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController"); strategy.setInclude(scanner("表名")); strategy.setSuperEntityColumns("id"); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有! mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); } } 复制代码
测试并验证
代码生成器常用配置
数据源 dataSourceConfig 配置
dbQuery
数据库信息查询类 默认由 dbType 类型决定选择对应数据库内置实现 实现 IDbQuery 接口自定义数据库查询 SQL 语句 定制化返回自己需要的内容
dbType
数据库类型 该类内置了常用的数据库类型【必须】
schemaName
数据库 schema name 例如 PostgreSQL 可指定为 public
typeConvert
类型转换 默认由 dbType 类型决定选择对应数据库内置实现 实现 ITypeConvert 接口自定义数据库 字段类型 转换为自己需要的 java 类型,内置转换类型无法满足可实现 IColumnType 接口自定义
url
驱动连接的URL
driverName
驱动名称
username
数据库连接用户名
password
数据库连接密码
数据库表配置
isCapitalMode
是否大写命名
skipView
是否跳过视图
naming
数据库表映射到实体的命名策略
columnNaming
数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
tablePrefix
表前缀
fieldPrefix
字段前缀
superEntityClass
自定义继承的Entity类全称,带包名
superEntityColumns
自定义基础的Entity类,公共字段
superMapperClass
自定义继承的Mapper类全称,带包名
superServiceClass
自定义继承的Service类全称,带包名
superServiceImplClass
自定义继承的ServiceImpl类全称,带包名
superControllerClass
自定义继承的Controller类全称,带包名
enableSqlFilter(since 3.3.1)
默认激活进行sql模糊表名匹配关闭之后likeTable与notLikeTable将失效,include和exclude将使用内存过滤 如果有sql语法兼容性问题的话,请手动设置为false 已知无法使用:MyCat中间件, 支持情况传送门(opens new window)
include
需要包含的表名,当enableSqlFilter为false时,允许正则表达式(与exclude二选一配置)
likeTable
自3.3.0起,模糊匹配表名(与notLikeTable二选一配置)
exclude
需要排除的表名,当enableSqlFilter为false时,允许正则表达式
notLikeTable
自3.3.0起,模糊排除表名
entityColumnConstant
【实体】是否生成字段常量(默认 false)
entityBuilderModel
【实体】是否为构建者模型(默认 false),自3.3.2开始更名为 chainModel
chainModel(since 3.3.2)
【实体】是否为链式模型(默认 false)
entityLombokModel
【实体】是否为lombok模型(默认 false)
3.3.2以下版本默认生成了链式模型,3.3.2以后,默认不生成,如有需要,请开启 chainModel
entityBooleanColumnRemoveIsPrefix
Boolean类型字段是否移除is前缀(默认 false)
restControllerStyle
生成 @RestController 控制器
controllerMappingHyphenStyle
驼峰转连字符
entityTableFieldAnnotationEnable
是否生成实体时,生成字段注解
versionFieldName
乐观锁属性名称
#logicDeleteFieldName 逻辑删除属性名称
tableFillList
表填充字段
包名配置
parent
父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
moduleName
父包模块名
entity
Entity包名
service
Service包名
serviceImpl
Service Impl包名
mapper
Mapper包名
xml
Mapper XML包名
controller
Controller包名
pathInfo
路径配置信息
模板配置
entity
Java 实体类模板
entityKt
Kotin 实体类模板
service
Service 类模板
serviceImpl
Service impl 实现类模板
mapper
mapper 模板
xml
mapper xml 模板
controller
controller 控制器模板
全局策略 globalConfig 配置
outputDir
生成文件的输出目录 默认值:D 盘根目录
fileOverride
是否覆盖已有文件 默认值:false
open
是否打开输出目录 默认值:true #enableCache 是否在xml中添加二级缓存配置 默认值:false
author
开发人员 默认值:null
kotlin
开启 Kotlin 模式 默认值:false
swagger2
开启 swagger2 模式 默认值:false
activeRecord
开启 ActiveRecord 模式 默认值:false
baseResultMap
开启 BaseResultMap 默认值:false
baseColumnList
开启 baseColumnList 默认值:false
dateType
时间类型对应策略 默认值:TIME_PACK 注意事项: 如下配置 %s 为占位符
entityName
实体命名方式 默认值:null 例如:%sEntity 生成 UserEntity
mapperName
mapper 命名方式 默认值:null 例如:%sDao 生成 UserDao
xmlName
Mapper xml 命名方式 默认值:null 例如:%sDao 生成 UserDao.xml
serviceName
service 命名方式 默认值:null 例如:%sBusiness 生成 UserBusiness
serviceImplName
service impl 命名方式 默认值:null 例如:%sBusinessImpl 生成 UserBusinessImpl
controllerName
controller 命名方式 默认值:null 例如:%sAction 生成 UserAction
idType
指定生成的主键的ID类型 默认值:null
注入 injectionConfig 配置
map
自定义返回配置 Map 对象 该对象可以传递到模板引擎通过 cfg.xxx 引用
fileOutConfigList
自定义输出文件 配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的
fileCreate
自定义判断是否创建文件 实现 IFileCreate 接口 该配置用于判断某个类是否需要覆盖创建,当然你可以自己实现差异算法 merge 文件
initMap
注入自定义 Map 对象(注意需要setMap放进去)
作者:努力的IT小胖子
链接:https://juejin.cn/post/7036666129221320740