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