高版本的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注解,不导入这两个注解会报错