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"," "));
}
}