开始正题,本次为大家介绍的代码生成器是MyBatis-Plus中的AutoGenerator。
初识 AutoGenerator。
相信使用过的代码生成器小伙伴对此都感觉很爽,刷刷刷的基础代码就已经开发完成了。在Java开始过程中有一款经常使用的代码生成器AutoGenerator。AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速生成 Entity、Mapper、Mapper XML、Service、Controller等各个模块的代码,极大的提升了开发效率,减少了基础代码重复编写的工作。
快速开始
添加依赖
MyBatis-Plus 从 3.0.3
之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:本文针对Java开发者,使用Maven引入依赖包信息。
<!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.29</version> </dependency> <!-- mybatis-plus -->
基本配置
在使用AutoGenerator代码生成器中,需要对相关参数进行配置,以便生成相关代码。主要配置包含:数据源配置、数据库表配置、包名配置、模板配置、全局策略配置、注入配置等。下面具体介绍各个配置的参数及其作用。
数据源配置
数据源配置DataSourceConfig,其默认值:null,通过该配置,指定需要生成代码的具体数据库。
参数类型 | 描述 | 备注 |
dbQuery | 数据库信息查询类 | 默认由 dbType 类型决定选择对应数据库内置实现 |
dbType | 数据库类型 | 该类内置了常用的数据库类型【必须】 |
schemaName | 数据库 schema name | 例如 PostgreSQL 可指定为 public |
typeConvert | 类型转换 | 默认由 dbType 类型决定选择对应数据库内置实现 |
url | 驱动连接的URL | 数据库的链接地址 |
driverName | 驱动名称 | 例如:com.mysql.cj.jdbc.Driver |
username | 数据库连接用户名 | 数据库连接用户名 |
password | 数据库连接密码 | 数据库连接密码 |
数据库表配置
数据库表配置StrategyConfig,其默认值:null,通过该配置,可指定需要生成哪些表或者排除哪些表。
参数类型 | 描述 | 备注与默认值 |
isCapitalMode | 是否大写命名 | false |
skipView | 是否跳过视图 | false |
naming | 数据库表映射到实体的命名策略 | |
columnNaming | 数据库表字段映射到实体的命名策略, 未指定按照 naming 执行 | null |
tablePrefix | 表前缀 | |
fieldPrefix | 字段前缀 | |
superEntityClass | 自定义继承的Entity类全称,带包名 | |
superEntityColumns | 自定义基础的Entity类,公共字段 | |
superMapperClass | 自定义继承的Mapper类全称,带包名 | String SUPER_MAPPER_CLASS = "com.baomidou.mybatisplus.core.mapper.BaseMapper"; |
superServiceClass | 自定义继承的Service类全称,带包名 | String SUPER_SERVICE_CLASS = "com.baomidou.mybatisplus.extension.service.IService"; |
superServiceImplClass | 自定义继承的ServiceImpl类全称,带包名 | |
superControllerClass | 自定义继承的Controller类全称,带包名 | |
enableSqlFilter | 默认激活进行sql模糊表名匹配,关闭之后likeTable与notLikeTable将失,include和exclude将使用内存过滤,如果有sql语法兼容性问题的话,请手动设置为false | |
include | 需要包含的表名,当enableSqlFilter为false时,允许正则表达式(与exclude二选一配置 | null |
likeTable | 自3.3.0起,模糊匹配表名(与notLikeTable二选一配置) | likeTable |
exclude | 需要排除的表名,当enableSqlFilter为false时,允许正则表达式 | null |
notLikeTable | 自3.3.0起,模糊排除表名 | null |
entityColumnConstant | 【实体】是否生成字段常量(默认 false) | false |
chainMode | 【实体】是否为构建者模型(默认 false)3.3.2开始 | 原来版本是 entityBuilderModel |
entityLombokModel | 【实体】是否为lombok模型(默认 false) | 3.3.2以下版本默认生成了链式模型,3.3.2以后, |
entityBooleanColumnRemoveIsPrefix | Boolean类型字段是否移除is前缀(默认 false) | false |
restControllerStyle | 生成 @RestController 控制器 | false |
controllerMappingHyphenStyle | 驼峰转连字符 | false |
entityTableFieldAnnotationEnable | 是否生成实体时,生成字段注解 | false |
versionFieldName | 乐观锁属性名称 | |
logicDeleteFieldName | 逻辑删除属性名称 | is_del |
tableFillList | 表填充字段 |
包名配置
包名配置PackageConfig,其默认值:null,通过该配置,指定生成代码的包路径。
参数类型 | 描述 | 默认值 |
parent | 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名 | com.baomidou |
moduleName | 父包模块名 | null |
entity | Entity包名 | entity |
service | Service包名 | service |
serviceImpl | Service Impl包名 | service.impl |
mapper | Mapper | mapper |
xml | Mapper XML包名 | mapper.xml |
controller | Controller包名 | controller |
pathInfo | 路径配置信息 |
模板配置
模板配置TemplateConfig,其默认值:null,可自定义代码生成的模板,实现个性化操作。
参数类型 | 描述 | 备注 |
entity | Java 实体类模板 | /templates/entity.java |
entityKt | Kotin 实体类模板 | /templates/entity.kt |
service | Service 类模板 | /templates/service.java |
serviceImpl | Service impl 实现类模板 | /templates/serviceImpl.java |
mapper | mapper 模板 | /templates/mapper.java |
xml | mapper xml 模板 | /templates/mapper.xml |
controller | controller 控制器模板 | /templates/controller.java |
全局策略配置
全局策略配置GlobalConfig,其默认值:null。
参数类型 | 描述 | 备注 |
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 |
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,其默认值:null,通过该配置,可注入自定义参数等操作以实现个性化操作。
参数类型 | 描述 | 备注 |
map | 自定义返回配置 Map 对象 | 该对象可以传递到模板引擎通过 cfg.xxx 引用 |
fileOutConfigList | 自定义输出文件 | 配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的 |
fileCreate | 自定义判断是否创建文件 | 实现 IFileCreate 接口 |
initMap | 注入自定义 Map 对象(注意需要setMap放进去) |
通过上述介绍的配置信息,MyBatis-Plus 的AutoGenerator代码生成器提供了大量的自定义参数,能够满足绝大部分人的使用需求。下面针对上述配置进行编写代码。其实就是针对DataSourceConfig、StrategyConfig、PackageConfig、TemplateConfig、GlobalConfig、InjectionConfig这些实体类赋值即可。
示例
设置常量
/** * 需要生成的表名 * */ private static final String[] TABLE_NAMES = new String[]{"z_seo"}; /** * 文件路径 * */ public static final String PROJECT_PATH = "E:\\bootproject\\BootDemo\\"; // /** * 项目名 * */ public static final String PROJECT_NAME = "18BootAutoGenerator"; /** * 模块名称 * */ public static final String MODULE_NAME =""; /** * 数据源配置 * */ public static final String DATA_SOURCE_URL ="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior" + "=convertToNull"; public static final String DATA_SOURCE_USERNAME ="test"; public static final String DATA_SOURCE_PASSWORD ="123456"; public static final String DATA_SOURCE_DRIVERNAME ="com.mysql.cj.jdbc.Driver";
初始化代码生成器
/** * @MethodName: main * @Description: 代码生成器 * @Return: * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2021/9/8 **/ public static void main(String[] args) { // 代码生成器 AutoGenerator autoGenerator = new AutoGenerator(); autoGenerator.setDataSource(getDataSourceConfigInfo()); autoGenerator.setGlobalConfig(getGlobalConfigInfo()); autoGenerator.setPackageInfo(getPackageConfigInfo()); autoGenerator.setStrategy(getStrategyConfigInfo(TABLE_NAMES)); autoGenerator.setTemplate(new TemplateConfig().setXml(null)); autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine()); autoGenerator.setCfg(getInjectionConfigInfo()); autoGenerator.execute(); }
数据源配置
/** * @MethodName: getDataSourceConfigInfo * @Description: 数据源配置 * @Return: DataSourceConfig * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2021/9/8 **/ public static DataSourceConfig getDataSourceConfigInfo() { DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull"); dataSourceConfig.setUsername("test"); dataSourceConfig.setPassword("123456"); dataSourceConfig.setDbType(DbType.MYSQL); dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); return dataSourceConfig; }
全局配置
/** * @MethodName: getGlobalConfigInfo * @Description: 全局配置 * @Return: GlobalConfig * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2021/9/8 **/ public static GlobalConfig getGlobalConfigInfo() { // 全局配置 GlobalConfig globalConfig = new GlobalConfig(); // String projectPath = System.getProperty("user.dir"); globalConfig.setOutputDir(PROJECT_PATH + PROJECT_NAME + "/src/main/java/"); globalConfig.setAuthor("JavaZhan"); globalConfig.setOpen(false); globalConfig.setSwagger2(true); globalConfig.setBaseColumnList(true); globalConfig.setBaseResultMap(true); globalConfig.setActiveRecord(false); globalConfig.setFileOverride(true); globalConfig.setServiceName("%sService"); return globalConfig; }
包配置
/** * @MethodName: getPackageConfigInfo * @Description: 包配置 * @Return: PackageConfig * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2021/9/8 **/ public static PackageConfig getPackageConfigInfo() { PackageConfig packageConfig = new PackageConfig(); packageConfig.setParent("com.example.demo"); packageConfig.setModuleName("test"); packageConfig.setEntity("module"); return packageConfig; }
策略配置
/** * @MethodName: getStrategyConfigInfo * @Description: 策略配置 * @Return: StrategyConfig * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2021/9/8 **/ public static StrategyConfig getStrategyConfigInfo(String... tableNames) { StrategyConfig strategyConfigInfo = new StrategyConfig(); strategyConfigInfo.setCapitalMode(true); strategyConfigInfo.setNaming(NamingStrategy.underline_to_camel); //下划线转驼峰命名 strategyConfigInfo.setColumnNaming(NamingStrategy.underline_to_camel); //需要生成的的表名,多个表名传数组 strategyConfigInfo.setInclude(tableNames); //设置逻辑删除字段 strategyConfigInfo.setLogicDeleteFieldName("data_state"); //使用lombok strategyConfigInfo.setEntityLombokModel(true); //设置表格前缀 strategyConfigInfo.setTablePrefix(""); //rest风格 strategyConfigInfo.setRestControllerStyle(true); return strategyConfigInfo; }
抽象的对外接口
/** * @MethodName: getInjectionConfigInfo * @Description: 抽象的对外接口 * @Return: InjectionConfig * @Author: JavaZhan @公众号:Java全栈架构师 * @Date: 2021/9/8 **/ public static InjectionConfig getInjectionConfigInfo(){ InjectionConfig injectionConfig = new InjectionConfig() { @Override public void initMap() { } }; List<FileOutConfig> focList = new ArrayList<FileOutConfig>(); focList.add(new FileOutConfig("/templates/mapper.xml.ftl") { @Override public String outputFile(TableInfo tableInfo) { // 输出xml return PROJECT_PATH + PROJECT_NAME + "/src/main/resources/mapper/" + MODULE_NAME + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); injectionConfig.setFileOutConfigList(focList); return injectionConfig; }
执行
在项目中执行初始化main方法,出现如下图中日志,包含module、service、impl、mapper、xml等相关文件。
如下图,生成的自动生成的文件相关文件目录结构,把我们需要的基本文件都已经生成了。
如下图中是我们生成的实体对象信息,其中包含了lombok和swagger2的相关注解,如果不需要这些,可以在GlobalConfig全局配置文件中进行配置。
好了,本文基于Spring Boot集成AutoGenerator代码生成器的相关功能已经介绍完了,并针对配置进行了Demo演示。大家可以根据项目中具体的需要,进行更加详实的参数配置,以满足个性化的需求。
结语
本次基于Spring Boot集成AutoGenerator代码生成器的项目就完成了,粗枝大叶的建立了一个快速代码生成的框架,当然还有更深入的配置参数去满足个性化的需求。本文主要针对新手入门练习使用,也作为基础查询手册使用,希望本文可以帮助到你。感谢阅读。