MyBatis-Plus——代码生成器(3.5.1+版本)

7,416 阅读8分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战


MyBatis-Plus 官方文档:mp.baomidou.com/guide/gener…

image-20211121150529787

这是官网上的文档,从官方文档中给快速生成代码中,可以看出代码生成器的配置结构为:


    //1、配置数据源
    FastAutoGenerator.create("url", "username", "password")
        //2、全局配置
        .globalConfig(...)
        //3、包配置
        .packageConfig(...)
        //4、策略配置
        .strategyConfig(...)
        //5、模板引擎配置
        .templateEngine(...)
        //6、执行
        .execute();

我们只需要通过填空的方式去配置数据源(DataSource),全局配置(GlobalConfig),包配置(PackageConfig),策略配置(StrategyConfig)和模板引擎配置(TemplateEngine)即可。

官方文档上也给出了对于每一个配置我们可以进行什么操作。

配置

数据源配置(DataSource)

属性说明示例
urljdbc路径jdbc:mysql://127.0.0.1:3306/mybatis-plus
username数据库账号root
password数据库密码123456
dbQuery(IDbQuery)数据库查询new MySqlQuery()
schema(String)数据库schema(部分数据库适用)mybatis-plus
typeConvert(ITypeConvert)数据库类型转换器new MySqlTypeConvert()
keyWordsHandler(IKeyWordsHandler)数据库关键字处理器new MySqlKeyWordsHandler()

全局配置(GlobalConfig)

方法说明示例
fileOverride覆盖已生成文件默认值:false
disableOpenDir禁止打开输出目录默认值:true
outputDir(String)指定输出目录/opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
author(String)作者名baomidou 默认值:作者
enableKotlin开启 kotlin 模式默认值:false
enableSwagger开启 swagger 模式默认值:false
dateType(DateType)时间策略DateType.ONLY_DATE=Date 默认值: DateType.TIME_PACK=LocalDateTime
commentDate(String)注释日期默认值: yyyy-MM-dd

包配置(PackageConfig)

方法说明示例
parent(String)父包名默认值:com.baomidou
moduleName(String)父包模块名默认值:无
entity(String)Entity 包名默认值:entity
service(String)Service 包名默认值:service
serviceImpl(String)Service Impl 包名默认值:service.impl
mapper(String)Mapper 包名默认值:mapper
mapperXml(String)Mapper XML 包名默认值:mapper.xml
controller(String)Controller 包名默认值:controller
other(String)自定义文件包名输出自定义文件时所用到的包名
pathInfo(Map<OutputFile, String>)路径配置信息Collections.singletonMap(OutputFile.mapperXml, "D://")

策略配置(StrategyConfig)

方法说明示例
enableCapitalMode开启大写命名默认值:false
enableSkipView开启跳过视图默认值:false
disableSqlFilter禁用 sql 过滤默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
enableSchema启用 schema默认值:false,多 schema 场景的时候打开
likeTable(LikeTable)模糊表匹配(sql 过滤)likeTable 与 notLikeTable 只能配置一项
notLikeTable(LikeTable)模糊表排除(sql 过滤)likeTable 与 notLikeTable 只能配置一项
addInclude(String...)增加表匹配(内存过滤)include 与 exclude 只能配置一项
addExclude(String...)增加表排除匹配(内存过滤)include 与 exclude 只能配置一项
addTablePrefix(String...)增加过滤表前缀
addTableSuffix(String...)增加过滤表后缀
addFieldPrefix(String...)增加过滤字段前缀
addFieldSuffix(String...)增加过滤字段后缀
entityBuilder实体策略配置
controllerBuildercontroller 策略配置
mapperBuildermapper 策略配置
serviceBuilderservice 策略配置

模板引擎配置(TemplateEngine)

默认 Velocity ;可选模板引擎 Beetl 或 Freemarker。

模板引擎代码
Velocity默认.templateEngine(new VelocityTemplateEngine())
Freemarker可选.templateEngine(new FreemarkerTemplateEngine())
Beetl可选.templateEngine(new BeetlTemplateEngine())

代码生成器测试样例

那么知道配置之后我们可以自己写一个操作一下。

步骤:

1、创建测试数据库 mp

CREATE DATABASE mp;

USE `mp`;

/*Table structure for table `student` */

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `score` double DEFAULT NULL COMMENT '成绩',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Table structure for table `user` */

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(50) DEFAULT NULL COMMENT '密码',
  `create_time` date DEFAULT NULL COMMENT '创建时间',
  `modify_time` date DEFAULT NULL COMMENT '最后一次修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
FieldTypeComment
idint用户id
usernamevarchar(50)用户名
passwordvarchar(50)密码
create_timedate创建时间
modify_timedate最后一次修改时间
FieldTypeComment
idint学号
namevarchar(50)名字
scoredouble成绩

2、创建一个 Spring-Boot 项目

image-20211121144541404

3、在 pom.xml 中导入相关依赖

<!--spring-boot-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBootTest-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!--swagger-->
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.6.3</version>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--mysql 驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.4</version>
</dependency>
<!--mybatis-plus-generator 生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>
<!--velocity-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>
<!--freemarker-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>
<!--beetl 模板-->
<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.8.1.RELEASE</version>
</dependency>

注:模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker,实际使用中只导入使用模板对应的依赖即可,不用全部导入。

4、编写一个mian方法,加上框架

public static void main(String[] args) {
    //1、配置数据源
    FastAutoGenerator.create("url", "username", "password")
        //2、全局配置
        .globalConfig(...)
        //3、包配置
        .packageConfig(...)
        //4、策略配置
        .strategyConfig(...)
        //5、模板引擎配置
        .templateEngine(...)
        //6、执行
        .execute();
}

5、进行数据源配置

public static void main(String[] args) {
    //1、配置数据源
    FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp", "root", "123456")
        //2、全局配置
        .globalConfig(...)
        //3、包配置
        .packageConfig(...)
        //4、策略配置
        .strategyConfig(...)
        //5、模板引擎配置
        .templateEngine(...)
        //6、执行
        .execute();
}

6、进行全局配置

注:3.5.1+版本开始支持 lambda 表达式

	//2、全局配置
	.globalConfig(builder -> {
    	builder.author("Jie") // 设置作者名
        	.outputDir(System.getProperty("user.dir") + "/src/main/java")   //设置输出路径
        	.commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
        	.dateType(DateType.ONLY_DATE)   //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
        	.fileOverride()   //覆盖之前的文件
        	.enableSwagger()   //开启 swagger 模式
        	.disableOpenDir();   //禁止打开输出目录,默认打开
	});

7、进行 包配置

	//3、包配置
	.packageConfig(builder -> {
    	builder.parent("com") // 设置父包名
        	.moduleName("mp")   //设置模块包名
        	.entity("entity")   //pojo 实体类包名
        	.service("service") //Service 包名
        	.serviceImpl("serviceImpl") // ***ServiceImpl 包名
        	.mapper("mapper")   //Mapper 包名
        	.xml("mapper")  //Mapper XML 包名
        	.controller("controller") //Controller 包名
        	.other("utils") //自定义文件包名
        	.pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper"))    //配置 **Mapper.xml 路径信息:项目的 resources 目录的 Mapper 目录下
	});

8、策略配置

策略配置中需要对 Mapper,Service,Entity,Controller 类的生成策略进行单独的配置。

	//4、策略配置
	.strategyConfig(builder -> {
    	builder.addInclude("user", "student") // 设置需要生成的数据表名
        	.addTablePrefix("t_", "c_") // 设置过滤表前缀

            //4.1、Mapper策略配置
        	.mapperBuilder()
        	.superClass(BaseMapper.class)   //设置父类
        	.formatMapperFileName("%sMapper")   //格式化 mapper 文件名称
        	.enableMapperAnnotation()       //开启 @Mapper 注解
        	.formatXmlFileName("%sXml"); //格式化 Xml 文件名称
        
        	//4.2、service 策略配置
        	.serviceBuilder()
        	.formatServiceFileName("%sService") //格式化 service 接口文件名称,%s进行匹配表名,如 UserService
        	.formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl

        	//4.3、实体类策略配置
        	.entityBuilder()
        	.enableLombok() //开启 Lombok
        	.disableSerialVersionUID()  //不实现 Serializable 接口,不生产 SerialVersionUID
        	.logicDeleteColumnName("deleted")   //逻辑删除字段名
        	.naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
        	.columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
        	.addTableFills(
        		new Column("create_time", FieldFill.INSERT),
        		new Column("modify_time", FieldFill.INSERT_UPDATE)
    		)   //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
        	.enableTableFieldAnnotation()       // 开启生成实体时生成字段注解

        	//4.4、Controller策略配置
        	.controllerBuilder()
        	.formatFileName("%sController") //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
        	.enableRestStyle()  //开启生成 @RestController 控制器
        	
})

9、模板引擎配置

	//5、模板引擎
	.templateEngine(new VelocityTemplateEngine())	//默认
    /*
    .templateEngine(new FreemarkerTemplateEngine())
    .templateEngine(new BeetlTemplateEngine())
    */

10、执行

	//6、执行
	.execute();

执行效果演示:

注:这里使用的是附2的交互式生成,两者源码几乎没有区别。

代码自动生成效果

image-20211121162318620

附1:快速生成样例代码


public static void main(String[] args) {
    //1、配置数据源
    FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp", "root", "123456")
        //2、全局配置
        .globalConfig(builder -> {
            builder.author("Jie") // 设置作者名
                .outputDir(System.getProperty("user.dir") + "/src/main/java")   //设置输出路径:项目的 java 目录下
                .commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
                .dateType(DateType.ONLY_DATE)   //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
                .fileOverride()   //覆盖之前的文件
                .enableSwagger()   //开启 swagger 模式
                .disableOpenDir();   //禁止打开输出目录,默认打开
        })
        //3、包配置
        .packageConfig(builder -> {
            builder.parent("com") // 设置父包名
                .moduleName("mp")   //设置模块包名
                .entity("entity")   //pojo 实体类包名
                .service("service") //Service 包名
                .serviceImpl("serviceImpl") // ***ServiceImpl 包名
                .mapper("mapper")   //Mapper 包名
                .xml("mapper")  //Mapper XML 包名
                .controller("controller") //Controller 包名
                .other("utils") //自定义文件包名
                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper"))    //配置 mapper.xml 路径信息:项目的 resources 目录下
        })
        //4、策略配置
        .strategyConfig(builder -> {
            builder.addInclude("user", "student") // 设置需要生成的数据表名
                .addTablePrefix("t_", "c_") // 设置过滤表前缀

                //4.1、Mapper策略配置
                .mapperBuilder()
                .superClass(BaseMapper.class)   //设置父类
                .formatMapperFileName("%sMapper")   //格式化 mapper 文件名称
                .enableMapperAnnotation()       //开启 @Mapper 注解
                .formatXmlFileName("%sXml"); //格式化 Xml 文件名称

            	//4.2、service 策略配置
            	.serviceBuilder()
                .formatServiceFileName("%sService") //格式化 service 接口文件名称,%s进行匹配表名,如 UserService
                .formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl

                //4.3、实体类策略配置
                .entityBuilder()
                .enableLombok() //开启 Lombok
                .disableSerialVersionUID()  //不实现 Serializable 接口,不生产 SerialVersionUID
                .logicDeleteColumnName("deleted")   //逻辑删除字段名
                .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
                .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
                .addTableFills(
                new Column("create_time", FieldFill.INSERT),
                new Column("modify_time", FieldFill.INSERT_UPDATE)
            )   //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
                .enableTableFieldAnnotation()       // 开启生成实体时生成字段注解

                //4.4、Controller策略配置
                .controllerBuilder()
                .formatFileName("%sController") //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
                .enableRestStyle()  //开启生成 @RestController 控制器
        })
        //5、模板
        .templateEngine(new VelocityTemplateEngine())
        /*
                .templateEngine(new FreemarkerTemplateEngine())
                .templateEngine(new BeetlTemplateEngine())
                */
        //6、执行
        .execute();
}

附2:交互式生成样例代码

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("=====================数据库配置=======================");
    System.out.println("请输入 URL");
    String url = scan.next();
    System.out.println("请输入 username");
    String username = scan.next();
    System.out.println("请输入 password");
    String password = scan.next();

    FastAutoGenerator.create(url, username, password)
        // 全局配置
        .globalConfig((scanner, builder) -> builder.author(scanner.apply("=====================全局配置=======================\n请输入作者名称?"))
                      .outputDir(System.getProperty("user.dir") + "/src/main/java")
                      .commentDate("yyyy-MM-dd hh:mm:ss")
                      .dateType(DateType.TIME_PACK)
                      .enableSwagger()
                      .fileOverride()
                      .enableSwagger()
                      .disableOpenDir()
                     )
        // 包配置
        .packageConfig((scanner, builder) -> builder.parent(scanner.apply("=====================包配置=======================\n请输入包名?"))
                       .moduleName(scanner.apply("请输入父包模块名?"))
                       .entity("entity")
                       .service("service")
                       .serviceImpl("serviceImpl")
                       .mapper("mapper")
                       .xml("mapper")
                       .other("utils")
                       .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper"))
                      )
        // 策略配置
        .strategyConfig((scanner, builder) -> {
            builder.addInclude(getTables(scanner.apply("=====================策略配置=======================\n请输入表名,多个英文逗号分隔?所有输入 all")))
                .serviceBuilder()
                .formatServiceFileName("%sService")
                .formatServiceImplFileName("%sServiceImpl")
                .entityBuilder()        //实体类策略配置
                .enableLombok()         //开启 Lombok
                .disableSerialVersionUID()
                .logicDeleteColumnName("deleted")        //逻辑删除字段
                .naming(NamingStrategy.underline_to_camel)
                .columnNaming(NamingStrategy.underline_to_camel)
                .addTableFills(new Column("create_time", FieldFill.INSERT), new Column("modify_time", FieldFill.INSERT_UPDATE))
                .enableTableFieldAnnotation()       // 开启生成实体时生成字段注解
                .controllerBuilder()
                .formatFileName("%sController")
                .enableRestStyle()
                .mapperBuilder()
                .superClass(BaseMapper.class)
                .formatMapperFileName("%sMapper")
                .enableMapperAnnotation()       //@mapper
                .formatXmlFileName("%sMapper");
        })
        /*
        模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
        .templateEngine(new BeetlTemplateEngine())
        .templateEngine(new FreemarkerTemplateEngine())
                     */
        .execute();
}

// 处理 all 情况
protected static List<String> getTables(String tables) {
    return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}