最近要做sql标准化,要求所有的表名,字段名大写,我总不能把代码给改一边把,于是找到druid,使用语法分析,拿到sql,把表名改为大写。
package com.topnet.dao.util;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
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;
import com.alibaba.druid.util.JdbcConstants;
/**
* @author lpf 把sql语句改为大写
*/
public class SqlUpperUtil {
public static void main(String[] args) {
String sql =
" select * from ( select a.id from quick_datasource a, quick_auto b where a.id =b.AUTO_DATASOURCE_ID and a.id='2') as abc ";
System.out.println(upper(sql));
}
/**
* sql语句改为大写,给fastDao调用
*
* @param sql
* @return
*/
public static String upper(String sql) {
String dbType = JdbcConstants.MYSQL;
SQLStatement stmt = SQLUtils.parseSingleStatement(sql, dbType);
TableNameModifier m = new TableNameModifier();
stmt.accept(m);
return stmt.toString();
}
public static StringBuilder upper(StringBuilder sql) {
return new StringBuilder(upper(sql.toString()));
}
private static class TableNameModifier extends MySqlASTVisitorAdapter {
public TableNameModifier() {}
@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) {
if (x.getAlias() != null) {
x.setAlias(x.getAlias().toUpperCase());
}
x.getExpr().accept(this);
return false;
}
@Override
public boolean visit(SQLIdentifierExpr x) {
x.setName(x.getName().toUpperCase());
return false;
}
}
}
来源:oschina
链接:https://my.oschina.net/internetafei/blog/4314878