代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

环境准备

创建一个employee表

1
2
3
4
5
6
7
8
9
10
11
12
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` bigint(20) NOT NULL COMMENT 'ID',
`name` varchar(255) DEFAULT NULL COMMENT '用户名',
`gender` varchar(255) DEFAULT NULL COMMENT '性别',
`version` int(10) DEFAULT '1' COMMENT '乐观锁',
`deleted` int(1) DEFAULT '0' COMMENT '逻辑删除',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

image-20200421215211023

创建一个SpringBoot项目。配置Swagger,数据库驱动,MyBatisPlus,Web,lombok依赖。

代码生成器需要添加一下依赖

image-20200421221240066

image-20200421220931266

完整的pom.xml依赖代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<dependencies>
<dependency>
<!--swagger2-->
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--解决进入swagger页面报类型转换错误,排除2.9.2中的引用,手动增加1.5.21版本-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
<!--swagger-ui-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!--代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus mybatis-plus自己开发的,非官方的-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

配置SpringBoot配置文件

image-20200421221515499

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 配置数据库
spring.datasource.username=root
spring.datasource.password=kylin
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 配置日志 控制台输出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl



#配置逻辑删除 默认为0 逻辑删除后为1
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0


#设置开发环境
spring.profiles.active=dev


#关闭MybatisPlus的驼峰命名
#mybatis-plus.configuration.map-underscore-to-camel-case=false

由于测试中要使用MyBatisPlus的乐观锁,Sql性能分析,自动填充功能,填充策略。所以我们要配置MyBatisPlus的配置类,和处理器。详情见博客的MyBatis-Plus的CRUD及其扩展文章。同时还使用Swagger,所以也要配置Swagger配置类。详情见博客文章SpringBoot集成Swagger

image-20200421222101194

MybatisPlusConfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//@MapperScan("com.kylin.mapper")//扫描mapper文件夹
@EnableTransactionManagement//自动管理事务
@Configuration//配置类
public class MybatisPlusConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}

//注册分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}

//逻辑删除组件
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
//性能分析插件
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启,保证我们的效率
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(100);//运行时间超过1毫秒,就不执行。
//performanceInterceptor.setFormat(true);//是否格式化代码
return performanceInterceptor;
}
}

MyMetaObjectHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

@Slf4j
@Component//一定不要忘记把处理器添加到Spring的IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
//其中方法参数中第一个是前面自动填充所对应的字段,第二个是要自动填充的值。第三个是指定实体类的对象
log.info("start insert fill.....");
this.setFieldValByName("createTime",new Date(),metaObject);//插入数据时给createTime插入一个时间
this.setFieldValByName("updateTime",new Date(),metaObject);
}

//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);//更新数据时给updateTime插入一个时间
}
}

SwaggerConfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Configuration//配置类
@EnableSwagger2//开启swagger2
public class SwaggerConfig {

//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(Environment environment) {
//设置要显示的Swagger环境
Profiles profiles = Profiles.of("dev", "test");
//通过environment.acceptProfiles判断是否处在自己设定的环境中
boolean flag = environment.acceptsProfiles(profiles);
System.out.println(flag);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//enable:是否启动swagger 为false 不能浏览器中访问
.enable(flag)
.groupName("Kylin")
.select()
//RequestHandlerSelectors 配置要扫描接口的方式
//basePackage():指定要扫描的包
//any():扫描全部
//none():不扫描
//withClassAnnotation():扫描类上的注解 参数是一个注解的反射对象
//withMethodAnnotation():扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.kylin.controller"))
//paths()过滤什么路径
//.paths(PathSelectors.ant("/kylin/**"))
.build();
}

//配置Swagger信息 apiInfo
private ApiInfo apiInfo() {
Contact contact = new Contact("Kylin", "https://www.kylin.show", "zhang171346168@qq.com");
return new ApiInfo(
"Kylin的SwaggerAPI文档",//标题
"学习不易,努力努力~",//描述
"v1.0",//版本
"https://www.kylin.show",//组织链接
contact,//联系人信息
"Apache 2.0",//许可
"http://www.apache.org/licenses/LINCENSE-2.0",//许可链接
new ArrayList());
}
}

到此为之环境搭建完成!

编写配置

在项目中的test文件下新建一个类。名字任意取。本文取名为KylinCode

image-20200421223140827

编写一个main方法。首先需要构建一个代码生成器对象AutoGenerator

image-20200421223242951

配置策略,全局配置创建一个GlobalConfig

image-20200421223333382

设置数据源DataSourceConfig

image-20200421223447794

设置生成代码的包路径PackageConfig

image-20200421223623305

策略配置StrategyConfig

image-20200421223842976

执行代码mpg.execute();

image-20200421223921503

KylinCode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//代码生成器
public class KylinCode {
public static void main(String[] args) {

//需要构建一个代码生成器对象
AutoGenerator mpg = new AutoGenerator();

//配置策略
//1.全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");//获取当前项目的目录
System.out.println(projectPath);
gc.setOutputDir(projectPath + "/src/main/java");//输出到当前目录下的src/main/java
gc.setAuthor("Kylin");//设置作者
gc.setOpen(false);//生成后是否打开windows的资源管理器
gc.setFileOverride(false);//是否覆盖
gc.setServiceName("%sService");//去掉Service的I前缀
gc.setIdType(IdType.ID_WORKER);//设置主键生成策略
gc.setDateType(DateType.ONLY_DATE);//设置日期类型
gc.setSwagger2(true);//开启Swagger

mpg.setGlobalConfig(gc);

//2.设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUsername("root");
dsc.setPassword("kylin");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
dsc.setDbType(DbType.MYSQL);

mpg.setDataSource(dsc);

//3.设置包
PackageConfig pc = new PackageConfig();
//pc.setModuleName("mpg");
pc.setParent("com.kylin");//com.kylin.mpg
pc.setEntity("entity");//实体类
pc.setMapper("mapper");//mapper
pc.setService("service");//service
pc.setController("controller");//controller
mpg.setPackageInfo(pc);

mpg.setPackageInfo(pc);

//4.策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("employee"); // 设置要映射的表名
strategy.setNaming(NamingStrategy.underline_to_camel);//字段的驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//列的驼峰命名
strategy.setEntityLombokModel(true); // 自动lombok;
strategy.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名

//自动填充策略
TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);

ArrayList<TableFill> tableFills= new ArrayList<>();
tableFills.add(createTime);
tableFills.add(updateTime);//转成list
strategy.setTableFillList(tableFills);//参数为list
//乐观锁
strategy.setVersionFieldName("version");//设置乐观锁字段名

strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2
mpg.setStrategy(strategy);

mpg.execute();//执行代码
}
}

数据库配置,包名要配置成自己的!

代码生成器测试

点击运行

GIF2242

成功在我们设置的目录下生成了 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码。

EmployeeController

image-20200421224702758

Employee

image-20200421224754756

EmployeeMapper

image-20200421224837194

EmployeeMapper.xml

image-20200421224858679

EmployeeService

image-20200421224931591

EmployeeServiceImpl

image-20200421224944751

这就是自动生成实体类,Service,Controller的所以代码了~

MyBatisPlus的CRUD测试

首先我们要在我们的Mapper接口中加上@Mapper(或者启动类上加上@MapperScan)和@Repository注解

image-20200421225352797

本文就只简单的测试一下插入操作。在测试类中进行测试。

由于我们配置了主键的生成策略id,自动填充功能create_time,update_time,而version又是乐观锁,deleted为逻辑删除。所以我们只要给name,gender赋值就可以了。

image-20200421225444550

点击运行,查看运行结果

image-20200421225847969

成功执行。查看数据库中的数据

image-20200421225918894

测试成功!

Swagger测试

由于我们在代码生成器中配置了Swagger,MyBatisPlus自动帮我们配置文档注解,所以我们来看看Swagger的效果怎么样。

首先我们要在启动类上配置@EnableSwagger2注解开启Swagger

image-20200421230212198

接着如果想要看到Model则需要配置Controller返回一个Model实体类对象

image-20200421230823067

点击运行项目。由于我配置了Swagger配置类,所以按照我配置对Swagger页面进行了定制localhost:8080/swagger-ui.html访问SwaggerUi

image-20200421231023375

GIF2313

测试成功!

源代码下载

MyBatisPlus所有源代码下载https://gitee.com/kylincw/MyBatisPlus