MyBatisPlus代码生成器

前言

一般情况下,在 SpringBoot 中,生成的代码默认在 resources 目录下,Mapper.xml 的路径也是固定的。

当前路径不建议修改,因为在打包时,Mapper.xmlMapper.class 是在一个文件夹下的。

代码

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.OracleTypeConvert;
import com.baomidou.mybatisplus.generator.config.converts.PostgreSqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
* 代码生成器
* <p>当前使用 freemarker 引擎需要 pom 依赖</p>
*
* @author maxzhao
* @date 2021-04-08
*/
public class CodeGenerator {
/**
* 文件存放位置
* <p>当前为当前项目位置</p>
*/
private static final String PROJECT_PATH = System.getProperty("user.dir");
/**
* 包的起始路径
*/
private static final String PACKAGE_PARENT = "boot";
/**
* 模块名
*/
private static final String MODULE_NAME = "chats";
/**
* 文件注释下的 auther 名称
*/
public static final String AUTHOR = "maxzhao";
/**
* 表名
*/
private static final String[] TABLE_NAMES = "chat_group,chat_group_user,chat_history,chat_history_status,chat_session,chat_user,chat_user_grouping,chat_user_grouping_user".split(",");

/**
* 连接地址
* oracle = "jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true";
* postgresql = "jdbc:postgresql://127.0.0.1:5432/postgres?charSet=utf8&currentSchema=pg_schema";
* mysql8 = "jdbc:oracle:thin:@32.1.6.219:1521/orcl";
*/
private static final String DS_URL = "jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true";
/**
* 驱动
* oracle = "oracle.jdbc.driver.OracleDriver";
* postgresql = "org.postgresql.Driver";
* mysql8 = "com.mysql.cj.jdbc.Driver";
*/
private static final String DS_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
private static final String DS_USERNAME = "root";
private static final String DS_PASSWORD = "maxzhao";

/**
* PostgreSql 的 schema(其它数据库不需要)
*/
public static final String POSTGRESQL_SCHEMA = "pg_schema";

/**
* RUN
*/
public static void main(String[] args) {
codeGenerate();
}

/**
* 代码生成器
*/
private static void codeGenerate() {
/*代码生成器*/
AutoGenerator mpg = new AutoGenerator();
/*全局配置*/
mpg.setGlobalConfig(getGlobalConfig());
/*数据源配置*/
mpg.setDataSource(getDataSourceConfig());
/*跟包相关的配置项*/
mpg.setPackageInfo(getPackageConfig());
/*自定义配置*/
mpg.setCfg(getInjectionConfig());
mpg.setTemplate(new TemplateConfig().setXml(null));
/*策略配置*/
mpg.setStrategy(getStrategyConfig());
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}

/**
* 全局配置
*/
private static GlobalConfig getGlobalConfig() {
GlobalConfig gc = new GlobalConfig();
/*生成文件的输出目录【默认 D 盘根目录】*/
gc.setOutputDir(PROJECT_PATH + File.separator + "src" + File.separator + "main" + File.separator + "java");
/*是否覆盖已有文件*/
gc.setFileOverride(false);
/*是否打开输出目录*/
gc.setOpen(false);
gc.setAuthor(AUTHOR);
gc.setSwagger2(true);
return gc;
}

/**
* 数据库配置
*/
private static DataSourceConfig getDataSourceConfig() {
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(DS_URL);
dsc.setDriverName(DS_DRIVER_NAME);
dsc.setUsername(DS_USERNAME);
dsc.setPassword(DS_PASSWORD);
if (DS_DRIVER_NAME.contains("postgresql")) {
initPGSqlDataSourceConfig(dsc);
} else if (DS_DRIVER_NAME.contains("mysql")) {
} else if (DS_DRIVER_NAME.contains("oracle")) {
initOracleDataSourceConfig(dsc);
}
return dsc;
}

/**
* PostgreSQL数据库连接
*/
private static void initPGSqlDataSourceConfig(DataSourceConfig dsc) {
dsc.setSchemaName(POSTGRESQL_SCHEMA);
dsc.setTypeConvert(new PostgreSqlTypeConvert());
}

/**
* ORACLE 数据库连接
*/
private static void initOracleDataSourceConfig(DataSourceConfig dsc) {
dsc.setTypeConvert(new OracleTypeConvert() {
@Override
public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
/*可以参考 super.processTypeConvert*/
return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
}
});
}

/**
* 跟包相关的配置项
*/
private static PackageConfig getPackageConfig() {
PackageConfig pc = new PackageConfig();
/*父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名*/
pc.setParent(PACKAGE_PARENT);
/*父包模块名*/
pc.setModuleName(MODULE_NAME);
/*Entity包名*/
pc.setEntity("model.entity");
/*Controller包名*/
pc.setController("api");
return pc;
}

/**
* 自定义配置
*/
private static InjectionConfig getInjectionConfig() {
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> focList = new ArrayList<>();
/*配置 Mapper.xml的生成位置*/
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return PROJECT_PATH + File.separator +
"src" + File.separator +
"main" + File.separator +
"resources" + File.separator +
PACKAGE_PARENT.replace(".", File.separator) +
File.separator +
MODULE_NAME.replace(".", File.separator) +
File.separator + "mapper" + File.separator +
tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
return cfg;
}

/**
* 策略配置
*/
private static StrategyConfig getStrategyConfig() {
StrategyConfig strategy = new StrategyConfig();
/*数据库表映射到实体的命名策略,下划线转驼峰*/
strategy.setNaming(NamingStrategy.underline_to_camel);
/*数据库表字段映射到实体的命名策略,未指定按照 naming 执行*/
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
/*表前缀*/
strategy.setTablePrefix("t_", "sys_", "p_");
/*字段前缀*/
strategy.setFieldPrefix("is", "has");
/*需要包含的表名,允许正则表达式(与exclude二选一配置)*/
strategy.setInclude(TABLE_NAMES);
/*实体是否生成 serialVersionUID*/
strategy.setEntitySerialVersionUID(true);
/*【实体】是否为lombok模型(默认 false)*/
strategy.setEntityLombokModel(true);
/*Boolean类型字段是否移除is前缀(默认 false) 比如 : 数据库字段名称 : 'is_xxx',类型为 : tinyint.
在映射实体的时候则会去掉is,在实体类中映射最终结果为 xxx*/
strategy.setEntityBooleanColumnRemoveIsPrefix(true);
/*是否生成实体时,生成字段注解*/
strategy.setEntityTableFieldAnnotationEnable(true);
/*生成 @RestController 控制器*/
strategy.setRestControllerStyle(true);
/*驼峰转连字符*/
strategy.setControllerMappingHyphenStyle(false);
/*是否生成实体时,生成字段注解*/
strategy.setEntityTableFieldAnnotationEnable(true);
return strategy;
}
}

本文地址: https://github.com/maxzhao-it/blog/post/49279/