sql 語法分析的得到表名,字段名,條件

使用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)));
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章