创建protobuf自动生成共有类及自定义规则

1,共有类:

package com.cn.pb.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * Created by lizhihao on 2019/4/6 18:30
 */
public class CommonUtil {
    public static final String INFO = "";
    public static final String REQ = "Req";
    public static final String RES = "Res";
    public static String FORMAT_8 = "yyyy-MM-dd";
    public static boolean stringsHelp(String[] args){
        return args != null && args.length>0;
    }
    //将字符串首字母小写
    public static String stringFirstToLower(String s) {
        String firstString = s.substring(0, 1);
        return s.replaceFirst(firstString,firstString.toLowerCase())+INFO;
    }
    //将字符串首字母大写
    public static String stringFirstToUpper(String s) {
        String firstString = s.substring(0, 1);
        return s.replaceFirst(firstString,firstString.toUpperCase())+INFO;
    }
    //8位时间戳字符串
    public static String getStringTime8() {
        return getStringTime(FORMAT_8);
    }
    public static String getStringTime(String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = new Date();
        return sdf.format(date);
    }
    //自动生成文件
    public static void generationFiles(String s, StringBuffer content,String folderName) {
        //定义文件名及文件路径
        String filePath = folderName+"/"+s+".java";
        BufferedWriter out = null;
        try{
            File file = new File(filePath);
            if(!file.exists()) file.createNewFile();
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
            out.write(content==null ? "" : content.toString());
            out.newLine();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(out != null){
                try{
                    out.flush();
                    out.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
    //Flow文件自动导包内容
    public static void automaticGuideFlowContent(StringBuffer sb) {
        sb.append("import com.saicmobility.common.bpe.FlowReq;").append("\r\n");
        sb.append("import com.saicmobility.common.bpe.FlowRes;").append("\r\n");
        sb.append("import com.saicmobility.common.bpe.SyncFlow;").append("\r\n");
        sb.append("import com.saicmobility.common.bpe.annotations.Flow;").append("\r\n");
    }
    //Dao文件自动导包内容
    public static void automaticGuideDaoContent(StringBuffer sb) {
        sb.append("import com.saicmobility.common.bpe.FlowReq;").append("\r\n");
        sb.append("import com.saicmobility.common.bpe.FlowRes;").append("\r\n");
        sb.append("import com.saicmobility.common.bpe.annotations.Auto;").append("\r\n");
        sb.append("import com.saicmobility.common.bpe.annotations.Mapping;").append("\r\n");
    }
}

 

2,pb自动生成规则类:

package com.cn.pb.util;
import com.mysql.cj.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Created by lizhihao on 2019/4/5 22:22
 */
public class RoleUtil {
    /**
     * 表名将_去掉,并采用驼峰命名,去掉第一个_之前的字母
     */
    public static String convertTableName(String tableName){
        if(StringUtils.isNullOrEmpty(tableName)) return "";
        Matcher matcher = getMatcher(tableName);
        int count = 0;
        while(matcher.find()){
            String str = matcher.group();
            String s = getReplaceString(str);
            tableName = tableName.replaceFirst(str,s);
            if(count ==0) tableName = tableName.substring(tableName.indexOf(s));
            count++;
        }
        return tableName;
    }
    private static String getReplaceString(String str) {
        return str.toUpperCase().replaceAll("_", "");
    }
    private static Matcher getMatcher(String name) {
        //主要针对 _字母或_数字格式  如_c,_9等
        Pattern p = Pattern.compile("_([a-z]|[0-9]){1}");
        return p.matcher(name);
    }
    //pb的实体对象 表名+Info
    public static String convertTableNameInfo(String tableName){
        return convertTableName(tableName)+CommonUtil.INFO;
    }
    //pb的实体对象 表名+Info且首字母小写
    public static String convertTableNameInfoLower(String tableName){
        String convertTableNameInfo = convertTableNameInfo(tableName);
        return CommonUtil.stringFirstToLower(convertTableNameInfo);
    }
    //pb的入参对象  表名+Req
    public static String convertTableNameReq(String tableName){
        return convertTableName(tableName)+CommonUtil.REQ;
    }
    //pb的入参对象  首字母大写表名+Req
    public static String convertTableNameUpperReq(String interfaceName){
        return CommonUtil.stringFirstToUpper(convertTableName(interfaceName))+CommonUtil.REQ;
    }
    //pb的出参对象 表名+Res
    public static String convertTableNameRes(String tableName){
        return convertTableName(tableName)+CommonUtil.RES;
    }
    //pb的出参对象 首字母大写表名+Res
    public static String convertTableNameUpperRes(String interfaceName){
        return CommonUtil.stringFirstToUpper(convertTableName(interfaceName))+CommonUtil.RES;
    }
    //不同字段类型与pb文件类型匹配
    public static String convertColumnTypeToPb(String typeName){
        switch(typeName.toUpperCase()){
            case "INT":
                typeName = "int32";
                break;
            case "VARCHAR":
                typeName = "string";
                break;
            case "DECIMAL":
                typeName = "double";
                break;
            case "DOUBLE":
                typeName = "double";
                break;
            case "FLOAT":
                typeName = "float";
                break;
            case "DATETIME":
                typeName = "string";
                break;
            case "BIGINT":
                typeName = "int64";
                break;
            case "TINYINT":
                typeName = "int32";
                break;
            case "DATE":
                typeName = "string";
                break;
        }
        return typeName;
    }
    //字段去掉_并将_后面的字母大写,即采用驼峰命名
    public static String convertColumnName(String columnName){
        if(StringUtils.isNullOrEmpty(columnName)) return null;
        Matcher matcher = getMatcher(columnName);
        while (matcher.find()){
            String str = matcher.group();
            String s = getReplaceString(str);
            columnName = columnName.replaceAll(str,s);
        }
        return columnName;
    }
    public static void main(String[] args) {
//        System.out.println(convertTableName("t_cfg_interest_rate"));
//        System.out.println(convertColumnTypeToPb("varchar"));
//        System.out.println(convertColumnName("rate_type"));
        System.out.println(convertTableNameInfoLower("CfgAdditionPriceInfo"));
    }
}

3,pb代码生成类:

package com.cn.pb.util;
import com.mysql.cj.util.StringUtils;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * Created by lizhihao on 2019/4/7 15:41
 */
public class PrintPbUtil {
    static final String TABLE_NAMES = "tablenames";
    static final String INTERFACE_REQ = "interfaceReq";
    public static final String PRIMARY_KEY = "primaryKey";
    public static final String INTERFACE_NAMES = "interfaceName";
    //指定表入参、出参输出pb
    public static void printOneTableToPbReqAndRes(String tableName,String prefix,boolean isReturnPrimaryKey,String...args){
        if(StringUtils.isNullOrEmpty(tableName)) return;
        printOneTableToPbReq(tableName, prefix);
        printOneTableToPbRes(tableName, prefix, isReturnPrimaryKey,false,false);
    }
    //指定表所有字段为入参字段
    private static void printOneTableToPbReq(String tableName, String prefix) {
        printOneTableToPbReq(tableName,prefix,RoleUtil.convertTableNameInfo(tableName));
    }
    //指定接口入参字段
    private static void printOneTableToPbReq(String tableName, String prefix,String inputColumn) {
        System.out.printf("%s %s %s","message",prefix+ RoleUtil.convertTableNameReq(tableName),"{").println();
        System.out.printf("  %s %s %s",inputColumn,CommonUtil.stringFirstToLower(inputColumn),"=1;").println();
        System.out.printf("%s","}").println();
    }
    //对于自定义接口,打印空入参对象
    public static void printCustomReq(String interfaceName,String reqObjectName){
        System.out.printf("%s %s %s","message",RoleUtil.convertTableNameUpperReq(interfaceName),"{").println();
        if(!StringUtils.isNullOrEmpty(reqObjectName)){
            System.out.printf("  %s %s %s",reqObjectName,"current"+ reqObjectName,"=1;").println();
        }
        System.out.printf("%s","}").println();
    }
    //对于自定义接口,打印出参对象
    public static void printCustomRes(String interfaceName){
        System.out.printf("%s %s %s","message",RoleUtil.convertTableNameUpperRes(interfaceName),"{").println();
        System.out.printf("  %s %s %s","int32","retCode","=100;").println();
        System.out.printf("  %s %s %s","string","retMsg","=101;").println();
        System.out.printf("%s","}").println();
    }

    public static void printOneTableToPbRes(String tableName, String prefix, boolean isReturnList) {
        printOneTableToPbRes(tableName,prefix,false,isReturnList,false);
    }
    public static void printOneTableToPbRes(String tableName, String prefix
            , boolean isReturnPrimaryKey,boolean isReturnList,boolean isReturnObject) {
        System.out.printf("%s %s %s","message",prefix+ RoleUtil.convertTableNameRes(tableName),"{").println();
        if(isReturnPrimaryKey){
            System.out.printf("  %s %s %s %s","int32","id","=1;","//主键id").println();
        }
        if(isReturnList){//返回表实体对象列表
            System.out.printf("  %s %s %s %s","repeated",RoleUtil.convertTableNameInfo(tableName),
                    RoleUtil.convertTableNameInfoLower(tableName),"=1;").println();
        }
        if(isReturnObject)//返回表实体对象
            System.out.printf("  %s %s %s",RoleUtil.convertTableNameInfo(tableName),
                    RoleUtil.convertTableNameInfoLower(tableName),"=1;").println();
        System.out.printf("  %s %s %s","int32","retCode","=100;").println();
        System.out.printf("  %s %s %s","string","retMsg","=101;").println();
        System.out.printf("%s","}").println();
    }
    //获取配置文件中的表信息
    public static String[] getPropertiesTableNames() {
        return getPropertiesStrings(TABLE_NAMES,",");
    }
    //获取配置文件中的接口名信息
    public static String[] getPropertiesInterfaceNames() {
        return getPropertiesStrings(INTERFACE_NAMES,",");
    }
    //获取配置文件中的需要生成的字段
    public static String[] getPropertiesColumnNames(String pattern){
        return getPropertiesStrings(INTERFACE_REQ,pattern);
    }
    public static String[] getPropertiesStrings(String s,String pattern) {
        String name = PropertiesUtil.getPbPropertyValue(s);
        return getStrings(pattern, name);
    }

    public static String[] getStrings(String pattern, String name) {
        String[] names = null;
        if (!StringUtils.isNullOrEmpty(name)) {
            names = name.split(pattern);
        }
        return names;
    }
    //列表查询,指定实体字段名生成pb
    public static void printListQueryInfo(String interfaceReq){
        String[] interfaceReqs = getPropertiesColumnNames(";");
        if(!CommonUtil.stringsHelp(interfaceReqs)){
            System.out.printf("%s","message "+ interfaceReq+"{}").println();
            return;
        }
        for (String req : interfaceReqs) {
            String[] propertiesColumnNames = getStrings(",", req);
            if(!CommonUtil.stringsHelp(propertiesColumnNames)){
                System.out.printf("%s","message "+ interfaceReq+"{}").println();
                return;
            }
            System.out.printf("%s","message "+ interfaceReq+"{").println();
            int count = 1;
            for (String propertiesColumnName : propertiesColumnNames) {
                printOneColumn(count, propertiesColumnName);
                count++;
            }
            System.out.printf("%s","}").println();
        }
    }
    public static void printOneColumn(int count, String propertiesColumnName) {
        String[] split = propertiesColumnName.split(":");
        if(CommonUtil.stringsHelp(split) && split.length>1){
            String columnName = split[0];
            String typeName = split[1];
            System.out.printf("  %s %s %s", RoleUtil.convertColumnTypeToPb(typeName)
                    ,RoleUtil.convertColumnName(columnName),"="+count+";").println();
            count++;
        }
    }
    //针对删除、查询详情等传入主键来作为入参的情况
    public static void printPrimaryKeyInfo(String interfaceReq,String inputColumn){
        System.out.printf("%s","message "+ interfaceReq+"{").println();
        printOneColumn(1,inputColumn);
        System.out.printf("%s","}").println();
    }
    //指定表实体对象的pb输出
    public static void printOneTableToPbInfo(String tableName,boolean printPb,boolean printJson){
        //获取数据库连接
        Connection connection = JdbcConnectionUtil.getConnection();
        if(connection == null) return;
        try {
            //获取元数据信息
            DatabaseMetaData metaData = connection.getMetaData();
            //提取指定表的字段、类型、长度、注释等信息
            ResultSet resultSet = metaData.getColumns(null, "%", tableName, "%");
            operatorTable(tableName, printPb, printJson, resultSet);
        } catch (SQLException e) {
            System.out.println("数据库操作异常:"+e.getMessage());
        }finally {
            JdbcConnectionUtil.close();
        }
    }
    private static void operatorTable(String tableName, boolean printPb, boolean printJson, ResultSet resultSet) throws SQLException {
        int count = 1;
        StringBuffer sb = new StringBuffer();
        while(resultSet.next()){
            if(resultSet.isFirst()){
                if(printPb) System.out.printf("%s","message "+ RoleUtil.convertTableNameInfo(tableName)+"{").println();
                //另一种写法
                if(printJson) sb.append("\""+RoleUtil.convertTableNameInfoLower(tableName)+"\" : {").append("\r\n");
            }
            String columnName = resultSet.getString("COLUMN_NAME");//字段名
            String typeName = resultSet.getString("TYPE_NAME");//类型 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
            String columnComment = resultSet.getString("REMARKS");//注释说明
            String s = RoleUtil.convertColumnName(columnName);//转换后的对象字段(驼峰命名)
            //生成实体对象
            if(printPb) System.out.printf("  %s %s %s%s%s",RoleUtil.convertColumnTypeToPb(typeName),s,"="+count,";//",columnComment).println();
            if(printJson) sb.append("  \"").append(s).append("\" : \"").append(setStringValueDefault(typeName)).append("\"")
                    .append(resultSet.isLast() ? "" : ",").append("\r\n");
            count++;
            if(resultSet.isLast()){
                if(printPb) System.out.printf("}").println();
                if(printJson){
                    sb.append("}").append("\r\n");
                    System.out.printf("%s",sb.toString());
                }
            }
        }
    }
    //根据字段类型给定默认值,时间类型的给定当前时间8位
    public static String setStringValueDefault(String typeName){
        if(StringUtils.isNullOrEmpty(typeName)) return null;
        if("DATETIME".equals(typeName.toUpperCase()) ||
            "DATE".equals(typeName.toUpperCase()) || "TIMESTAMP".equals(typeName.toUpperCase()))
            return CommonUtil.getStringTime8();
        return "1";
    }
    //打印接口
    public static void printInterfacePb(String interfaceName,String interfaceReq,String interfaceRes,int msgId){
        System.out.printf("%s %s %s","rpc",interfaceName,"("+interfaceReq+")").println();
        System.out.printf("  %s %s %s","returns","("+interfaceRes+")","{ option(krpc.msgId)="+msgId+";};").println();
    }
}

 

完整项目GitHub地址:https://github.com/thinkersOne/aotoProtobuf

你可能感兴趣的:(创建protobuf自动生成共有类及自定义规则)