利用 druid 解析器解析SQL

本文介绍了如何利用Druid解析器解析SQL,重点关注了insert、update和alter语句的解析过程。通过示例代码展示了如何获取SQL的不同组成部分,如insert的列名、values,update的where条件,以及alter的相关信息,为SQL的拦截和改写提供基础。
摘要由CSDN通过智能技术生成

最近参与一个开源项目,一个功能的实现,用到了 druid 解析器来解析SQL,记录下如果使用 druid 来解析SQL,实现对SQL的拦截改写。

1. 对 insert 语句进行解析:

	private static String convertInsertSQL(String sql){
		try{
			MySqlStatementParser parser = new MySqlStatementParser(sql);	 
			SQLStatement statement = parser.parseStatement();
			MySqlInsertStatement insert = (MySqlInsertStatement)statement; 
	        String tableName = StringUtil.removeBackquote(insert.getTableName().getSimpleName());
	        if(!isGlobalTable(tableName))
				return sql;
	        if(!isInnerColExist(tableName))
	        	return sql;
	        	
	        List<SQLExpr> columns = insert.getColumns();
	        if(columns == null || columns.size() <= 0)
	        	return sql;
		
	        if(insert.getQuery() != null)	// insert into tab select 
	        	return sql;
	        	
	    	StringBuilder sb = new StringBuilder(200)	// 指定初始容量可以提高性能
	    				.append("insert into ")
					.append(tableName).append("(");
			int idx = -1;
			for(int i = 0; i < columns.size(); i++) {
				if(i < columns.size() - 1)
					sb.append(columns.get(i).toString()).append(",");
				else
					sb.append(columns.get(i).toString());
				String column = StringUtil.removeBackquote(insert.getColumns().get(i).toString());
				if(column.equalsIgnoreCase(GLOBAL_TABLE_MYCAT_COLUMN))
					idx = i;
			}
			if(idx <= -1)
			sb.append(",").append(GLOBAL_TABLE_MYCAT_COLUMN);
			sb.append(")");
			
			sb.append(" values");
			List<ValuesClause> vcl = insert.getValuesList();
			if(vcl != null && vcl.size() > 1){	// 批量insert
				for(int j=0; j<vcl.size(); j++){
				   if(j != vcl.size() - 1)
					   appendValues(vcl.get(j).getValues(), sb, idx).append(",");
				   else
					   appendValues(vcl.get(j).getValues(), sb, idx);
				}
			}else{	// 非批量 insert
				List<SQLExpr> valuse = insert.getValues().getValues();
				appendValues(valuse, sb, idx);
			}
			
			List<SQLExpr> dku =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值