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)
全局配置(GlobalConfig)
包配置(PackageConfig)
策略配置(StrategyConfig)
模板引擎配置(TemplateEngine)
默认 Velocity ;可选模板引擎 Beetl 或 Freemarker。
代码生成器测试样例
那么知道配置之后我们可以自己写一个操作一下。
步骤:
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;
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方法,加上框架
publicstaticvoidmain(String[] args) {
FastAutoGenerator.create("url", "username", "password")
.globalConfig(...)
.packageConfig(...)
.strategyConfig(...)
.templateEngine(...)
.execute();
}
5、进行数据源配置
publicstaticvoidmain(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp", "root", "123456")
.globalConfig(...)
.packageConfig(...)
.strategyConfig(...)
.templateEngine(...)
.execute();
}
6、进行全局配置
注:3.5.1+版本开始支持 lambda 表达式
.globalConfig(builder-> {
builder.author("Jie") .outputDir(System.getProperty("user.dir") +"/src/main/java") .commentDate("yyyy-MM-dd hh:mm:ss") .dateType(DateType.ONLY_DATE) .fileOverride() .enableSwagger() .disableOpenDir(); });
7、进行 包配置
.packageConfig(builder-> {
builder.parent("com") .moduleName("mp") .entity("entity") .service("service") .serviceImpl("serviceImpl") .mapper("mapper") .xml("mapper") .controller("controller") .other("utils") .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir")+"/src/main/resources/mapper")) });
8、策略配置
策略配置中需要对 Mapper,Service,Entity,Controller 类的生成策略进行单独的配置。
.strategyConfig(builder-> {
builder.addInclude("user", "student") .addTablePrefix("t_", "c_") .mapperBuilder()
.superClass(BaseMapper.class) .formatMapperFileName("%sMapper") .enableMapperAnnotation() .formatXmlFileName("%sXml"); .serviceBuilder()
.formatServiceFileName("%sService") .formatServiceImplFileName("%sServiceImpl") .entityBuilder()
.enableLombok() .disableSerialVersionUID() .logicDeleteColumnName("deleted") .naming(NamingStrategy.underline_to_camel) .columnNaming(NamingStrategy.underline_to_camel) .addTableFills(
newColumn("create_time", FieldFill.INSERT),
newColumn("modify_time", FieldFill.INSERT_UPDATE)
) .enableTableFieldAnnotation() .controllerBuilder()
.formatFileName("%sController") .enableRestStyle() })
9、模板引擎配置
.templateEngine(newVelocityTemplateEngine())
10、执行
执行效果演示:
注:这里使用的是附2的交互式生成,两者源码几乎没有区别。
附1:快速生成样例代码
publicclassGenerator {
publicstaticvoidmain(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/yeb", "root", "123456")
.globalConfig(builder-> {
builder.author("Jie") .outputDir(System.getProperty("user.dir") +"/src/main/java") .commentDate("yyyy-MM-dd hh:mm:ss") .dateType(DateType.ONLY_DATE) .fileOverride() .enableSwagger() .disableOpenDir(); })
.packageConfig(builder-> {
builder.parent("com") .moduleName("mp") .entity("pojo") .service("service") .serviceImpl("serviceImpl") .mapper("mapper") .xml("mapper") .controller("controller") .other("utils") .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") +"/src/main/resources/mapper")); })
.strategyConfig(builder-> {
builder.addInclude("user", "student") .addTablePrefix("t_", "c_") .mapperBuilder()
.superClass(BaseMapper.class) .formatMapperFileName("%sMapper") .enableMapperAnnotation() .formatXmlFileName("%sXml") .serviceBuilder()
.formatServiceFileName("%sService") .formatServiceImplFileName("%sServiceImpl") .entityBuilder()
.enableLombok() .disableSerialVersionUID() .logicDeleteColumnName("deleted") .naming(NamingStrategy.underline_to_camel) .columnNaming(NamingStrategy.underline_to_camel) .addTableFills(
newColumn("create_time", FieldFill.INSERT),
newColumn("modify_time", FieldFill.INSERT_UPDATE)
) .enableTableFieldAnnotation() .controllerBuilder()
.formatFileName("%sController") .enableRestStyle(); })
.templateEngine(newVelocityTemplateEngine())
.execute();
}
}
附2:交互式生成样例代码
publicstaticvoidmain(String[] args) {
Scannerscan=newScanner(System.in);
System.out.println("=====================数据库配置=======================");
System.out.println("请输入 URL");
Stringurl=scan.next();
System.out.println("请输入 username");
Stringusername=scan.next();
System.out.println("请输入 password");
Stringpassword=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() .disableSerialVersionUID()
.logicDeleteColumnName("deleted") .naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel)
.addTableFills(newColumn("create_time", FieldFill.INSERT), newColumn("modify_time", FieldFill.INSERT_UPDATE))
.enableTableFieldAnnotation() .controllerBuilder()
.formatFileName("%sController")
.enableRestStyle()
.mapperBuilder()
.superClass(BaseMapper.class)
.formatMapperFileName("%sMapper")
.enableMapperAnnotation() .formatXmlFileName("%sMapper");
})
.execute();
}
protectedstaticList<String>getTables(Stringtables) {
return"all".equals(tables) ?Collections.emptyList() : Arrays.asList(tables.split(","));
}