使用druid 的sql解析器
package com.abc.topre;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitorAdapter;
public class MyVisitor extends PGASTVisitorAdapter{
List<String> field=new ArrayList<>();
List<String> table=new ArrayList<>();
List<Map<String, String>> conditionS=new ArrayList<Map<String, String>>();
@Override
public void endVisit(SQLBinaryOpExpr x) {
if (x.getOperator() == x.getOperator().Equality ) {
String val = x.getRight().toString();
Pattern p = Pattern.compile("\\$\\{(.*)\\}");
Matcher m = p.matcher(val);
if(m.find()) {
conditionS.add(new HashMap() {{
put("field", x.getLeft().toString());put("param", m.group(1).trim());}});
}
}
super.endVisit(x);
}
@Override
public boolean visit(SQLSelectItem x) {
field.add( computeSelectColumns(x) );
return super.visit(x);
}
protected String computeSelectColumns(SQLSelectItem item ) {
String alias = item.getAlias();
if (alias==null) {
if (item.getExpr() instanceof SQLIdentifierExpr) {
SQLIdentifierExpr expr = (SQLIdentifierExpr) item.getExpr();
alias= expr.getName();
} else if (item.getExpr() instanceof SQLAllColumnExpr) {
SQLAllColumnExpr expr = (SQLAllColumnExpr) item.getExpr();
alias= expr.toString();
} else if (item.getExpr() instanceof SQLMethodInvokeExpr) {
SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) item.getExpr();
alias= expr.toString();
} else if (item.getExpr() instanceof SQLPropertyExpr) {
SQLPropertyExpr expr = (SQLPropertyExpr) item.getExpr();
alias= expr.getName();
}
}
return alias;
}
@Override
public boolean visit(SQLExprTableSource x) {
table.add( x.getExpr().toString() );
return super.visit(x);
}
public Map<String, Object> get(){
Map<String, Object> res = new HashMap<String, Object>();
res.put("fieldArr", field);
res.put("table_arr", table);
res.put("condition_json", conditionS);
return res;
}
}
package com.abc.topre;
import java.util.Map;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser;
import com.alibaba.fastjson.JSON;
/**
* 規則引擎工具類
* @author lpf
*
*/
public class SqlParserUtils {
/**
* sql 解析工具
* @param sql
* @return {"fieldArr":["project_name","unit_name","total_amount"],"table_arr":["gov_ocr_record_Certificate"],"condition_json":[{"field":"id","param":"id"}]}
*/
public static Map<String, Object> sqlParser(String sql) {
PGSQLStatementParser parser = new PGSQLStatementParser(sql);
SQLStatement statement = parser.parseStatement();
MyVisitor visitor = new MyVisitor();
statement.accept(visitor);
return visitor.get();
}
public static void main(String[] args) {
String sql=" select coalesce(first_party, '') first_party , a.project_name, b.project_id, b.project_type from gov_ocr_contract a,gov_submitted_materials b where a.material_id =b.id and a.material_type = 'construction_contract' and a.row_state = '01' and a.material_id = '${materialId}'";
System.out.println(JSON.toJSONString( sqlParser(sql)));
}
}