欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何使用MyBatis-Plus代码生成器(逆向工程)一键生成代码

程序员文章站 2022-06-21 21:43:14
简介MyBatis-Plus 提供了功能强大的的代码生成器, 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。官方入门案例: MyBatis-Plus代码生成器效果演示1. 创建3张测试表: t_user、people、t_product2. 执行MyBatis-Plus代码生成器的代码3. 代码生成完成详细步骤(可以全程复制, 需要改动的地方会有说明)1. 引入依赖(SpringBoot工程...

简介

MyBatis-Plus 提供了功能强大的的代码生成器, 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

官方入门案例: MyBatis-Plus代码生成器

效果演示

1. 创建3张测试表: t_user、people、t_product

如何使用MyBatis-Plus代码生成器(逆向工程)一键生成代码

2. 执行MyBatis-Plus代码生成器的代码

如何使用MyBatis-Plus代码生成器(逆向工程)一键生成代码

3. 代码生成完成

如何使用MyBatis-Plus代码生成器(逆向工程)一键生成代码

详细步骤(可以全程复制, 需要改动的地方会有说明)

1. 引入依赖(SpringBoot工程)

如果还需要自动生成Swagger相关的注解, 自行引入Swagger相关依赖即可

<!--SpringBoot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--lombok, 自动生成的时候需要lombok中的注解--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--mybatis-plus, 注意引入了此依赖就无需再引入mybatis相关依赖, 否则可能冲突--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.0</version> </dependency> <!--mybatis-plus代码生成器--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.0</version> </dependency> <!--默认模板引擎velocity, 还支持Freemarker、Beetl, 都需要引入依赖(使用其他引擎详情见官网)--> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency> <!--springmvc start, 会自动生成Controller相关注解--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> 
2. 编写MyBatis-Plus代码生成器代码

一般情况需要改动的地方笔者已在注释中写出, 复制粘贴稍加改动即可, 其余代码配置也有较为详细的注释, 可根据需要自行修改

如果此案例并不能满足需要, 详情配置参考官网: MyBatis-Plus代码生成器详细配置

package com.youxuepai.demo.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; 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.TableFill; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import java.util.ArrayList; import java.util.List; /**
 * 一般情况, 需要改动的地方:
 * 34行: 作者, 38行: 主键类型, 41行: 是否使用Swagger注解, 44行: 数据源相关, 56行: 生成的代码路径, 65行: 需要映射的表名
 * 71、72行: 逻辑删除和版本号字段, 76、77行: 插入和更新时间的字段, 103行: *Mapper.xml文件生成路径和命名方式
 */ public class CodeGenerator { 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("ChenJunlin"); gc.setOpen(false); // 是否打开生成的目录 gc.setFileOverride(false); // 是否覆盖已有文件, 默认false gc.setServiceName("%sService"); // 自动生成的Service类前面会自动加前缀I, 取消I前缀 gc.setIdType(IdType.AUTO); // 生成主键得id类型 gc.setDateType(DateType.ONLY_DATE); // 数据库中的时间类型对应的java类, 此设置表示Date类, 默认是java8的时间类 // gc.setSwagger2(true); 实体属性 Swagger2 注解 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/test?serverTimezone=GMT"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); dsc.setDbType(DbType.MYSQL); // 设置数据库连接的类型 mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName(null); // 模块路径(子路径) pc.setParent("com.youxuepai.demo"); // 生存的代码的父路径 pc.setEntity("entity"); // 生存实体类所在的包名 pc.setMapper("mapper"); pc.setService("service"); pc.setController("controller"); mpg.setPackageInfo(pc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("t_user","people","t_product"); // 要生成的表在数据库中的名称, 每张表名以英文逗号隔开 strategy.setNaming(NamingStrategy.underline_to_camel); // 表名转换方式: 数据库中的下划线转成java驼峰 strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 列名转换方式 strategy.setEntityLombokModel(true); // 自动加上lombok注解 strategy.setRestControllerStyle(true); // 加上@RestController注解 strategy.setEntityTableFieldAnnotationEnable(true); // 为实体类的类上加@TableName, 所有字段上加注解 strategy.setControllerMappingHyphenStyle(false); // RequestMapping种的驼峰是否转成用"-"连接, 默认是false strategy.setTablePrefix("t_"); // 按照表名生成实体类时去掉表名前面的"t_"前缀 // strategy.setLogicDeleteFieldName("deleted"); // 数据库中表示逻辑删除的字段名 // strategy.setVersionFieldName("version"); // 数据库中表示乐观锁版本号的字段名 // 自动填充配置: 插入时间, 最后一次更新时间 ArrayList<TableFill> tableFills = new ArrayList<>(); TableFill gmtCreate = new TableFill("created", FieldFill.INSERT); // 插入时改变的时间纪录, created为表的字段名 TableFill gmtModified = new TableFill("updated", FieldFill.INSERT_UPDATE); // 最后一次更新时updated表字段的时间记录 tableFills.add(gmtCreate); tableFills.add(gmtModified); strategy.setTableFillList(tableFills); mpg.setStrategy(strategy); // 自定义配置, 将Mapper.xml文件生成到resources目录下 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) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + "/src/main/resources/mapper/" + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setXml(null); mpg.setTemplate(templateConfig); mpg.execute(); } } 
3. 执行代码即可一键生成代码

原创作者: 笔记狂魔

本文地址:https://blog.csdn.net/FutureArchitect/article/details/107713425