Bootstrap

mybatis-plus generator3.5.9 自动生成类(entity, mapper, controller, service, serviceImpl, xxMapper.xml)

高版本的mybatis-plus-generator因为AutoGenerator, GlobalConfig等等一系列类的构造函数改为了private修饰,所以再使用 new关键字声明对象时会提示

‘AutoGenerator()’ has private access in ‘com.baomidou.mybatisplus.generator.AutoGenerator’

‘GlobalConfig()’ has private access in ‘com.baomidou.mybatisplus.generator.config.GlobalConfig’

解决方法:

一是 将mybatis-plus-generator版本改低一点。

二是 使用Builder创建对象Builder, 再xxx.Builder.build()创建对象。

代码:

需要导入依赖 pom.xml

<?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 http://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>3.4.1</version>
    </parent>

    <groupId>com.ls</groupId>
    <artifactId>mybatis-and-plus-generator</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!--添加模板引擎依赖,MyBatis-Plus支持Velocity(默认)、Freemarker、Beetl,
        可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.17.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>
package com.ls;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.Collections;


public class MybatisPlusAutomatic {

    public static void main(String[] args) {

        //1、全局配置
        String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        GlobalConfig globalConfig = new GlobalConfig.Builder()
                .outputDir(projectPath + "/src/main/java/") //生成路径
                .author("shan") //设置作者
                .disableOpenDir() //禁止打开输出目录
                .dateType(DateType.ONLY_DATE)//设置日期为Date
                //.enableSwagger() //启用swagger
                .build();
        //2、数据源配置,修改为自己的数据库
        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(
                "jdbc:mysql://localhost:3306/big_event?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"
                , "root", "root")
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .build();
        // 3、包配置
        PackageConfig packageConfig = new PackageConfig.Builder()
                .moduleName("")
                .parent("com.ls") //设置父包
                .entity("pojo") //设置实体类包名,默认entity
                .service("service")//设置service包名
                .mapper("mapper")//设置mapper包名
                .serviceImpl("service.impl")//设置serviceImpl包名
                .controller("controller")//设置controller包名
                //.xml("/resources/mapper") //设置xml文件路径
                //自定以xxMapper.xml文件路径
                .pathInfo(Collections.singletonMap(OutputFile.xml,
                        System.getProperty("user.dir") + "/src/main/resources/mapper"))
                .build();


        //List<String> tables = new ArrayList<>();
        //tables.add("article");
        //tables.add("user");
        //tables.add("category");
        // 4、策略配置
        StrategyConfig strategy = new StrategyConfig.Builder()
                //.addInclude("event_user","event_article")//设置表名称,不设置读数据库所有表,设置可以是单表名,也可以是多表名逗号隔开,或者是集合列表
                //.addExclude("system_user")//增加表排除匹配(内存过滤)	include 与 exclude 只能配置一项
                .addTablePrefix("event_")//设置表前缀过滤,如event_user,设置以后生成的实体类名会是User
                .mapperBuilder()
                .enableMapperAnnotation()//开启mapper注解
                .enableBaseResultMap()//启用xml文件中的BaseResultMap 生成
                .enableBaseColumnList()//启用xml文件中的BaseColumnList
                .formatMapperFileName("%sMapper")//格式化mapper类名称
                .formatXmlFileName("%sMapper")//格式化xml文件名称
                //.enableFileOverride()//mapper文件夹中覆盖已有文件
                .serviceBuilder()
                .formatServiceFileName("%sService")//格式化 service 接口文件名称
                .formatServiceImplFileName("%sServiceImpl")//格式化 service 接口文件名称
                //.enableFileOverride()//service文件夹中覆盖已有文件
                .controllerBuilder()
                .enableRestStyle()
                //.enableFileOverride()//controller文件夹中覆盖已有文件
                .entityBuilder()
                .naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略
                .enableLombok()//使用lombok
                //.enableFileOverride()//entity文件夹中覆盖已有文件
                .build();
        // 5、模板配置
        TemplateConfig templateConfig = new TemplateConfig.Builder()
                .controller("com.ls.controller")
                .xml(System.getProperty("user.dir") + "/src/main/resources/mapper")
                .build();
        ConfigBuilder configBuilder = new ConfigBuilder(
                packageConfig,
                dataSourceConfig,
                strategy,
                templateConfig,
                globalConfig,
                null
        );

        AutoGenerator autoGenerator = new AutoGenerator(dataSourceConfig).config(configBuilder);
        //6、执行
        autoGenerator.execute();

    }
}


最终生成效果: 

代码中几个点需要注意:

1、数据源配置 DataSourceConfig,需要改成自己项目对应的database和用户名、密码
2、包配置 PackageConfig中,设置xxMapper.xml的路径
    2.1 方式一:使用.xml("/resources/mapper"),
        会自动在src/main/java包下创建一个resources.mapper的包,xml文件在这个包里。
    2.2 方式二:使用
        .pathInfo(Collections.singletonMap(OutputFile.xml,
        System.getProperty("user.dir") + "/src/main/resources/mapper"))
        会自动直接生成在/src/main/resources/mapper包下
3、策略配置 StrategyConfig,
    3.1  .addInclude("event_user")设置表名称,如果不设置这一项就对所有的表都生成对应的类,
        设置了就只针对设置的几张表生成对应的类。参数可以是一个表名,也可以是多个(逗号隔开),
        也可以是一个集合列表
    3.2 .addTablePrefix("event_")设置表前缀过滤,意思是在生产实体类的时候会将表的前缀
        event_去掉,如event_user,设置以后生成的实体类名会是User,
        如果不设置生成的实体名是EventUser
    3.3 .enableFileOverride()开启覆盖已有文件,
        个人感觉这一项使用的时候要注意一下,如果项目中有很多已经实现好的xxMapper.xml, 
        service, controller等等了,最好就别开启了,万一忘记配addInclude,或者addInclude
        表名忘改或写成之前已经实现好的表,一覆盖已有文件 那之前的代码不就白写了么!!!
-------------------------------------------------------------------------------        

要特别注意导包问题和版本号问题:

1、不导入spring-boot-starter-web依赖【如果你的项目不是web项目就不需要导入这个依赖,也不需要生成controller】,因为需要生成controller,上面就会涉及到注解

@RestController
@RequestMapping("/article")

不导入spring-boot-starter-web报错

\controller\ArticleController.java:3:47
java: package org.springframework.web.bind.annotation does not exist

2、不导入mybatis-plus-boot-starter【别导入成mybatis-plus-spring-boot-starter了!!】,报错

Caused by: java.lang.ClassNotFoundException: com.baomidou.mybatisplus.core.toolkit.StringUtils
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)

如果报以下提示一般就是包的版本号不对

Caused by: java.lang.ClassNotFoundException: com.baomidou.mybatisplus.core.handlers.AnnotationHandler

不导入commons-lang3依赖,运行时会提示NoSuchMethodError错误:

不导入lombok 依赖的话,由于在策略设置时设置了.enableLombok()//使用lombok,所以在实体类上会用到@Setter和@Getter注解,不导入这两个注解会报错

;