mysql 把表名自动改为大写

ぐ巨炮叔叔 提交于 2020-08-05 22:18:07

最近要做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;
    }
  }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!