#yyds干货盘点# MyBatis-Plus——代码生成器(3.5.1+版本)

Posted ZS_Jie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# MyBatis-Plus——代码生成器(3.5.1+版本)相关的知识,希望对你有一定的参考价值。

MyBatis-Plus 官方文档:https://mp.baomidou.com/guide/generator-new.html

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


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

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

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

配置

数据源配置(DataSource)

属性 说明 示例
url jdbc路径 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 实体策略配置
controllerBuilder controller 策略配置
mapperBuilder mapper 策略配置
serviceBuilder service 策略配置

模板引擎配置(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;
Field Type Comment
id int 用户id
username varchar(50) 用户名
password varchar(50) 密码
create_time date 创建时间
modify_time date 最后一次修改时间
Field Type Comment
id int 学号
name varchar(50) 名字
score double 成绩

2、创建一个 Spring-Boot 项目

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的交互式生成,两者源码几乎没有区别。

附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(","));
}

以上是关于#yyds干货盘点# MyBatis-Plus——代码生成器(3.5.1+版本)的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#mybatis-plus学习与实践逻辑删除

#yyds干货盘点# MyBatis-Plus——代码生成器(3.5.1+版本)

#yyds干货盘点#mybatis-plus学习与实践代码生成器整合swagger2生成CRUD接口

#yyds干货盘点# 泛型通配符

#yyds干货盘点#linux命令--uname

#yyds干货盘点#linux命令--hdparm