SpringCloudAlibaba云商场-架构学习和环境准备(三)

104 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 文件。针对以上的步骤,大家可以评论交流一下。