druid table rewrite

import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;

class TableNameModifier extends MySqlASTVisitorAdapter{
    private String tableName;
    private String newTableName;

    public TableNameModifier(String tableName, String newTableName) {
        this.tableName = tableName;
        this.newTableName = newTableName;
    }

    @Override
    public boolean visit(SQLSelectStatement astNode) {
        astNode.getSelect().accept(this);
        return false;
    }
    @Override
    public boolean visit(SQLSelect x){
        x.getQuery().accept(this);
        return false;
    }
    @Override
    public boolean visit(SQLExprTableSource x){
        x.getExpr().accept(this);
        return false;
    }
    @Override
    public boolean visit(SQLIdentifierExpr x) {
    	if(x.getName().toLowerCase().trim().equals(tableName)){
    		x.setName(newTableName);
    	}
        return false;
    }
}

 

 

import java.text.MessageFormat;
import java.util.List;

import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat.Condition;


public class Sql {
	public static void main(String[] args) {
    	String tableName = "xx_comic_readrecord", column = "user_id";
    	String newTableFormater = "xx_comic_readrecord_{0}";
		String sqlInsert = "insert into xx_comic_readrecord(user_id, comic_id, image_ids, chapter_ids) values(4, 891,?,?)";
		String sqlSelect = "select user_id, comic_id, image_ids, chapter_ids from xx_comic_readrecord where user_id=4 and comic_id in (select comic_id from xx_comic where status=3)";
		String sqlUpdate = "update xx_comic_readrecord set image_ids=? where user_id=4 and comic_id=891";
		String sqlDelete = "delete from xx_comic_readrecord where user_id=4 and comic_id=891";
		MySqlOutputVisitor output = new MySqlOutputVisitor(new StringBuilder());
		
		MySqlStatementParser parser = new MySqlStatementParser(sqlUpdate);
		MySqlSchemaStatVisitor schema = new MySqlSchemaStatVisitor();
		List<SQLStatement> sqlStatements = parser.parseStatementList();
		for(SQLStatement sqlStatement:sqlStatements){
			sqlStatement.accept(schema);
			
//			if(schema.containsTable(tableName)){
//				TableNameModifier tnm = new TableNameModifier(tableName,"xx_comic_readrecord_4");
// sqlStatement.accept(tnm);
//			}
//			
			
			if(schema.getColumn(tableName, column)!=null){
				for(Condition c:schema.getConditions()){
					if(c.getColumn().getName().equals(column) && c.getOperator().equals("=")){
						Integer userId = (Integer) c.getValues().get(0);
						String newTableName =MessageFormat.format(newTableFormater, userId);
						TableNameModifier tnm = new TableNameModifier(tableName,newTableName);
						sqlStatement.accept(tnm);
					}
				}
			}
			
			sqlStatement.accept(output);
		}
		
		System.out.println(output.getAppender().toString().replaceAll("\n"," ").replaceAll("\t"," "));
	}
}

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326993017&siteId=291194637