携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
1、讲解Swagger代码生成器
1.1模板构建——①获取数据库连接
//配置文件
private static Properties props = new Properties();
//数据库账号
public static String UNAME;
//项目路径
public static String PROJECT_PATH;
//是否使用
swaggerpublic static Boolean SWAGGER=true;
//生成的文件名字
public static String FILENAME="swagger.json";
//swagger-ui路径
public static String SWAGGERUI_PATH;
//响应封装对象名字
public static String RESP_BEAN="RespResult";
//搜索方法
public static String MAPPING_SEARCH="/search";
public static String MAPPING_PAGESEARCH="/search/{page}/{size}";
static {
try {
//加载配置文件
InputStream is = TemplateBuilder.class.getClassLoader().getResourceAsStream("application.properties");
//创建Properties对象
props.load(is);
//获取对应的配置信息
UNAME = props.getProperty("uname");
SWAGGERUI_PATH = props.getProperty("swaggerpath");
RESP_BEAN = (props.getProperty("respbean")==null || props.getProperty("respbean").equals(""))? RESP_BEAN:props.getProperty("respbean");
MAPPING_SEARCH = (props.getProperty("search")==null || props.getProperty("search").equals(""))? MAPPING_SEARCH:props.getProperty("search");
MAPPING_PAGESEARCH = (props.getProperty("pagesearch")==null || props.getProperty("pagesearch").equals(""))? MAPPING_PAGESEARCH:props.getProperty("pagesearch");
//生成的文件名字
FILENAME = (props.getProperty("filename")==null || props.getProperty("filename").equals(""))? FILENAME:props.getProperty("filename");
//工程路径
PROJECT_PATH=TemplateBuilder.class.getClassLoader().getResource("").getPath().replace("/target/classes/","")+"/src/main/java/";
//加载数据库驱动
Class.forName(props.getProperty("driver"));
} catch (Exception e) {
e.printStackTrace();
}
}
//获取数据库连接
Connection conn = DriverManager.getConnection(props.getProperty("url"),props.getProperty("uname"),props.getProperty("pwd"));
1.2模板构建——②获取数据库类型
DatabaseMetaData metaData = conn.getMetaData();
MySQLString databaseType = metaData.getDatabaseProductName();
1.3模板构建——③针对MySQL数据库类型进行相关操作,最终生成Swagger json 文件
获取所有表结构
ResultSet tableResultSet = metaData.getTables(null, "%", "%", new String[]{"TABLE"});
获取数据库的名字
String database = conn.getCatalog();
定义Swagger信息集合
List<SwaggerModel> swaggerModels = new ArrayList<SwaggerModel>(); //Model
List<SwaggerPath> swaggerPathList = new ArrayList<SwaggerPath>(); //Method
public class SwaggerModel {
//名字
private String name;
//类型
private String type;
//字段集合
private List<SwaggerModelProperties> properties;
//描述
private String description;
public SwaggerModel() {
}
public SwaggerModel(String name, String type, List<SwaggerModelProperties> properties, String description) {
this.name = name;
this.type = type;
this.properties = properties;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<SwaggerModelProperties> getProperties() {
return properties;
}
public void setProperties(List<SwaggerModelProperties> properties) {
this.properties = properties;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
public class SwaggerPath {
//请求路径
private String path;
//方法配置
private List<SwaggerMethod> methods;
//对象
private String model;
//对象-首字母小写
private String table;
public SwaggerPath(String Table, String table) {
this.model = Table;
this.table = table;
}
public SwaggerPath() {
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public List<SwaggerMethod> getMethods() {
return methods;
}
public void setMethods(List<SwaggerMethod> methods) {
this.methods = methods;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
}
循环所有表信息,把数据库表中的字段跟Swagger所有的字段做一个对应
while (tableResultSet.next()){
//获取表名
String tableName=tableResultSet.getString("TABLE_NAME");
//名字操作,去掉tab_,tb_,去掉_并转驼峰
String table = StringUtils.replace_(StringUtils.replaceTab(tableName));
//大写对象
String Table =StringUtils.firstUpper(table);
//需要生成的Pojo属性集合
List<ModelInfo> models = new ArrayList<ModelInfo>();
//所有需要导包的类型
Set<String> typeSet = new HashSet<String>();
//获取表所有的列
ResultSet cloumnsSet = metaData.getColumns(database, UNAME, tableName, null);
//获取主键
ResultSet keySet = metaData.getPrimaryKeys(database, UNAME, tableName);
String key ="",keyType="";
while (keySet.next()){
key=keySet.getString(4);
}
//构建SwaggerModel对象
SwaggerModel swaggerModel = new SwaggerModel();
swaggerModel.setName(Table);
swaggerModel.setType("object");
swaggerModel.setDescription(Table);
//属性集合
List<SwaggerModelProperties> swaggerModelProperties = new ArrayList<SwaggerModelProperties>();
while (cloumnsSet.next()){
//列的描述
String remarks = cloumnsSet.getString("REMARKS");
//获取列名
String columnName = cloumnsSet.getString("COLUMN_NAME");
//处理列名
String propertyName = StringUtils.replace_(columnName);
//获取类型,并转成JavaType
String javaType = JavaTypes.getType(cloumnsSet.getInt("DATA_TYPE"));
//需要导包的类型
typeSet.add(javaType);
//主键类型
if(columnName.equals(key)){
keyType=JavaTypes.simpleName(javaType);
}
//SwaggerModelProperties创建
SwaggerModelProperties modelProperties = new SwaggerModelProperties();
modelProperties.setName(propertyName);
modelProperties.setType(JavaTypes.simpleNameLowerFirst(javaType));
if(modelProperties.getType().equals("integer")){
modelProperties.setFormat("int32");
}
modelProperties.setDescription(remarks);
swaggerModelProperties.add(modelProperties);
}
//属性集合
swaggerModel.setProperties(swaggerModelProperties);
swaggerModels.add(swaggerModel);
//创建该表的JavaBean
Map<String,Object> modelMap = new HashMap<String,Object>();
modelMap.put("table",table);
modelMap.put("Table",Table);
modelMap.put("swagger",SWAGGER);
//主键操作
modelMap.put("keySetMethod","set"+StringUtils.firstUpper(StringUtils.replace_(key)));
modelMap.put("keyType",keyType);
//添加swagger路径映射
String format="string";
if(keyType.equalsIgnoreCase("integer") || keyType.equalsIgnoreCase("long")){
format="int64";
}
swaggerPathList.addAll(swaggerMethodInit(Table,table,StringUtils.firstLower(keyType),format));
}
/***
* 初始化方法信息
* @param Table
* @param type
主键ID类型
* @param format
* @return
*/
public static List<SwaggerPath> swaggerMethodInit(String Table,String table,String type,String format){
//集合存储
List<SwaggerPath> swaggerPaths = new ArrayList<SwaggerPath>();
//1.add findAll 方法
SwaggerPath addAndFindAllPath = new SwaggerPath(Table,table);
addAndFindAllPath.setPath("/"+table);//设置请求路径
//初始化方法
List<SwaggerMethod> swaggerMethods = addAndFindAll(Table, table);
addAndFindAllPath.setMethods(swaggerMethods);
swaggerPaths.add(addAndFindAllPath);
//2.delete update findById 方法
SwaggerPath handlerByIdPath = new SwaggerPath(Table,table);
handlerByIdPath.setPath("/"+table+"/{id}");//设置请求路径
//初始化方法
List<SwaggerMethod> handlerByIdMethods = handlerById(Table, table,type,format);
handlerByIdPath.setMethods(handlerByIdMethods);
swaggerPaths.add(handlerByIdPath);
//3.搜索 方法
MAPPING_PAGESEARCH SwaggerPath searchPath = new SwaggerPath(Table,table);
searchPath.setPath("/"+table+MAPPING_SEARCH);//设置请求路径
//初始化方法
List<SwaggerMethod> searchMethods = searchMethod(Table, table);
searchPath.setMethods(searchMethods);
swaggerPaths.add(searchPath);
//4.分页条件搜索 方法
SwaggerPath pageSearchPath = new SwaggerPath(Table,table);
pageSearchPath.setPath("/"+table+MAPPING_PAGESEARCH);//设置请求路径
//初始化方法
List<SwaggerMethod> pageSearchMethods =searchPage(Table,table);
pageSearchPath.setMethods(pageSearchMethods);
swaggerPaths.add(pageSearchPath);
return swaggerPaths;
}
构建Swagger文档数据——JSON数据
Map<String,Object> swaggerModelMap = new HashMap<String,Object>();、
swaggerModelMap.put("swaggerModels",swaggerModels);
swaggerModelMap.put("swaggerPathList",swaggerPathList);
swaggerModelMap.put("respbean",RESP_BEAN);
swaggerModelMap.put("filename",FILENAME);
生成Swagger文件
SwaggerBuilder.builder(swaggerModelMap);
public class SwaggerBuilder {
/***
* ServiceImpl构建
* @param modelMap
*/
public static void builder(Map<String,Object> modelMap){
//swagger的文件名字
modelMap.put("Table","swagger");
//生成ServiceImpl层文件
BuilderFactory.builder(modelMap,
"/template/swagger",
"swagger.json",
TemplateBuilder.SWAGGERUI_PATH,
".json");
}
}
public class BuilderFactory {
/***
* 构建Controller
* @param modelMap
*/
public static void builder(Map<String,Object> modelMap,//数据模型
String templatePath, //模板路径
String templateFile, //模板文件
String storePath, //存储路径
String suffix){ //生成文件后缀名字
try {
//获取模板对象
Template template = TemplateUtil.loadTemplate(BuilderFactory.class.getResource(templatePath).getPath(), templateFile);
//创建文件夹
String path = TemplateBuilder.PROJECT_PATH+storePath.replace(".","/");
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
//创建文件
TemplateUtil.writer(template,modelMap,path+"/"+modelMap.get("filename"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出文件
public static void writer(Template template,Map dataModel,String file) throws Exception{
// 创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
Writer out = new FileWriter(new File(file));
// 调用模板对象的process方法输出文件。
template.process(dataModel, out);
// 关闭流。
out.close();
}
}
总结:本篇文章是讲了Swagger代码生成器的模板构建三步骤:1)连接数据库 2)获取数据库数据类型 3)针对MySQL数据库类型进行相关操作,最终生成Swagger json 文件。针对以上的步骤,大家可以评论交流一下。