小白开发报表工具(解析SQL语句)

此方法中将sql语句中的基础“select”与“from”之间的展示字段解析出来
public List<Map<String, String>> analysisSQLCreatFieldsReturnMap(String sqlString) {
// 替换sql语句中的()部分为@-*-@,替换下来的部分储存至map中,解析完成的sql中select与from之间的语句储存至map中key为@@。from之后的语句key为@@-
Map<String, String> strings = checkOutsqlBetweenSelectAndFrom(sqlString);
1.1解析SQL语句中的展示字段的编码。
List<Map<String, String>> mapFields = new ArrayList<Map<String, String>>();
String[] newstrs = strings.get("@@").split(",");
List<String> names = new ArrayList<String>();
for (int i = 0; i < newstrs.length; i++) {
Map<String, String> map = new HashMap<String, String>();
String sqlFidle = newstrs[i];
if (sqlFidle.toLowerCase().contains(" as ")) {
sqlFidle = goBackFields(sqlFidle, strings);
// 将条件中的关键字as替换成小写
sqlFidle = sqlFidle.replaceAll(" AS ", " as ");
sqlFidle = sqlFidle.replaceAll(" As ", " as ");
sqlFidle = sqlFidle.replaceAll(" aS ", " as ");
// 去除替换后的别名字符串
String fieldAlias = sqlFidle.split(" as ")[1].trim();
// 去除别名中的双引号影响
if (fieldAlias.startsWith("\"") && fieldAlias.endsWith("\"")) {
fieldAlias = fieldAlias.substring(1,
fieldAlias.length() - 1);
}
// 将别名字符串还原
fieldAlias = goBackFields(fieldAlias, strings);
map.put("alias", fieldAlias);
names.add(fieldAlias);
map.put("fieldsCode", goBackFields(sqlFidle.toLowerCase()
.split(" as ")[0], strings));
} else {
map.put("alias", creatNewName(names));
names.add(creatNewName(names));
map.put("fieldsCode", goBackFields(sqlFidle, strings));
}
mapFields.add(map);
}
return mapFields;

}

private Map<String, String> checkOutsqlBetweenSelectAndFrom(String sqlString) {
String sqlToCheck = sqlString.trim();
Map<String, String> strings = new HashMap<String, String>();
int index = 0;
while (sqlToCheck.contains(")")) {
int endindex = sqlToCheck.indexOf(")") + 1;
int startindex = sqlToCheck.lastIndexOf("(", endindex);
strings.put("@-" + index + "-@", sqlToCheck.substring(startindex,
endindex).trim());
sqlToCheck = sqlToCheck.replace(sqlToCheck.substring(startindex,
endindex), " @-" + index + "-@ ");
index++;
}
String string = sqlToCheck.substring(sqlToCheck.toLowerCase().indexOf(
"select") + 6, sqlToCheck.toLowerCase().indexOf(" from "));
if(string.trim().toLowerCase().startsWith("distinct")){
string=string.trim().substring(8);
strings.put("@@-","select distinct @*@ "+ sqlToCheck.substring(sqlToCheck.toLowerCase()
.indexOf("from"), sqlToCheck.length()));
}else{
strings.put("@@-","select  @*@"+ sqlToCheck.substring(sqlToCheck.toLowerCase()
.indexOf("from"), sqlToCheck.length()));
}
strings.put("@@", string);

return strings;
}

此方法中能将所有的sql语句的展示字段解析出来。
注:基础“select”与“from”即:去除所有的子查询后的第一个“select”和第一个“from”
方法中的checkOutsqlBetweenSelectAndFrom()方法就是去除子查询对于查找“select”和“from”的影响。带解析完成后在还原语句中的替换部分。

//还原方法;将被改造的sql语句还原。

private String goBackFields(String sqlFidle, Map<String, String> strings) {
if (sqlFidle.contains("@-") && sqlFidle.contains("-@")) {
String str = sqlFidle.substring(sqlFidle.indexOf("@-"),
sqlFidle.indexOf("-@") + 2).trim();
sqlFidle = sqlFidle.replace(str, strings.get(str));
sqlFidle = goBackFields(sqlFidle, strings);
}
return sqlFidle;


}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值