Druid 入门Demo

import com.alibaba.druid.sql.ast.SQLCommentHint;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.util.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * 对一条SQL 语句进行解析.获取这条SQL 的字段.条件.聚合函数.以及条数
 * Created by Think on 2017/3/22.
 */
public class AnalyzeSQL {

    private static String SQL = "SELECT oilwear_avg,sum(oilwear_avg) as oilConsumption,count(id) " +
            "FROM DBName.tableName as ted WHERE filed1 LIKE '123456%' AND filed2 >= 0 " +
            "AND filed3 = \"abcdefg\" AND filed4_ms " +
            "between 1483200000000 and 1488297600000 group by filed5,filed6 order by filed7 LIMIT 1";

    public static void analyzeSQL(String sql) {
        MySqlStatementParser parse = new MySqlStatementParser(sql);
        SQLStatement statement = parse.parseStatement();

        if (statement instanceof SQLSelectStatement) {
            SQLSelectStatement selectStatement = (SQLSelectStatement) statement;
            SQLSelect select = selectStatement.getSelect();
            SQLSelectQuery selectQuery = select.getQuery();

            if (selectQuery instanceof MySqlSelectQueryBlock) {
                MySqlSelectQueryBlock mysqlSQB = (MySqlSelectQueryBlock) selectQuery;

                SQLTableSource tableSource = mysqlSQB.getFrom();

                if (tableSource instanceof SQLExprTableSource) {
                    SQLExprTableSource exprTableSource = (SQLExprTableSource) tableSource;
                    SQLExpr tableNameExpr = exprTableSource.getExpr();

                    if (tableNameExpr instanceof SQLIdentifierExpr) {
                        SQLIdentifierExpr tableNameIdentifier = (SQLIdentifierExpr) tableNameExpr;
                        printTableName(tableNameIdentifier.getName(),tableNameIdentifier.getSimpleName(),tableNameIdentifier.getLowerName());
                    }else if (tableNameExpr instanceof SQLPropertyExpr) {
                        SQLPropertyExpr tableNamePropertyExpr = (SQLPropertyExpr) tableNameExpr;

                        SQLIdentifierExpr owner = (SQLIdentifierExpr) tableNamePropertyExpr.getOwner();

                        printTableName(tableNamePropertyExpr.getName(),tableNamePropertyExpr.getSimpleName(),null);
                        printOutFile("DBName : "+owner.getName());
                    }
                }
                printOutFile("tableName alias : "+tableSource.getAlias());

                SQLSelectGroupByClause sqlGroupBy = mysqlSQB.getGroupBy();
                if (sqlGroupBy instanceof SQLSelectGroupByClause){
                    List<SQLExpr> items = sqlGroupBy.getItems();
                    printGroupFileds(items);
                }

                printSelectFileds(mysqlSQB.getSelectList());

                SQLOrderBy sqlOrderBy = mysqlSQB.getOrderBy();
                printOrderFileds(sqlOrderBy.getItems());

                SQLExprTableSource tableSource1 = mysqlSQB.getInto();
                if (null != tableSource1){

                }

                List<SQLCommentHint> hints = mysqlSQB.getHints();
                if (hints.size()!= 0) {

                }
            }
        }
    }

    public static void printOrderFileds(List<SQLSelectOrderByItem> list){
        StringBuffer sb = new StringBuffer("Select Order By fileds : ");
        for (int i = 0; i < list.size() -1 ; i++) {
            SQLSelectOrderByItem item = list.get(i);
            bufferAddExpr(item.getExpr(),sb);
            sb.append(", ");
        }
        bufferAddExpr(list.get(list.size()-1).getExpr(),sb);

        printOutFile(sb.toString());
    }

    public static void forEachMap(Map<String, Object> map) {

        for (Map.Entry entry : map.entrySet()
                ) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
    }

    public static void printSelectFileds(List<SQLSelectItem> list){
        StringBuffer sb = new StringBuffer("Select fileds : ");
        for (int i = 0; i < list.size()-1; i++) {
            SQLExpr expr = list.get(i).getExpr();
            mergeSelectItem(expr,sb);
            sb.append(", ");
        }
        SQLExpr expr = list.get(list.size() - 1).getExpr();
        mergeSelectItem(expr,sb);

        printOutFile(sb.toString());
    }

    public static void mergeSelectItem(SQLExpr expr,StringBuffer sb){

        if (expr instanceof SQLIdentifierExpr) {
            bufferAddExpr(expr,sb);
        }else if (expr instanceof SQLAggregateExpr){
            SQLAggregateExpr expr1 = (SQLAggregateExpr)expr;
            String methodName = expr1.getMethodName();
            List<SQLExpr> arguments = expr1.getArguments();
            for (int j = 0; j < arguments.size(); j++) {
                SQLIdentifierExpr expr2 = (SQLIdentifierExpr) arguments.get(j);
                sb.append(methodName+"("+expr2.getName()+")");
            }
        }
    }

    public static void printGroupFileds(List<SQLExpr> list){
        StringBuffer sb = new StringBuffer("Group By fileds : ");

        for (int i = 0; i < list.size()-1; i++) {
            if (list.get(i) instanceof SQLIdentifierExpr) {
                bufferAddExpr(list.get(i),sb);
                sb.append(", ");
            }
        }
        bufferAddExpr(list.get(list.size()-1),sb);

        printOutFile(sb.toString());
    }

    public static void bufferAddExpr(SQLExpr expr,StringBuffer sb){
        SQLIdentifierExpr IdentiExpr = (SQLIdentifierExpr)expr;
        sb.append(IdentiExpr.getName());
    }

    public static void printTableName(String tableName,String simpleName,String lowerName){
        StringBuffer sb = new StringBuffer("tableName : ");
        if (!StringUtils.isEmpty(tableName)){
            sb.append(tableName);
        }
        if (!StringUtils.isEmpty(simpleName)){
            sb.append(" , ").append("simpleName : ").append(simpleName);
        }
        if (!StringUtils.isEmpty(lowerName)){
            sb.append(" , ").append("lowerName : ").append(lowerName);
        }
        sb.append(".");
        printCutOffRule();
        printOutFile(sb.toString());
    }


    public static void printCutOffRule(){
        System.out.println("================================================");
    }

    public static void printOutFile(String outString){
        System.out.println(outString);
        printCutOffRule();
    }

    public static void main(String[] args) {
        analyzeSQL(SQL);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一种用于构建Java应用程序的框架,而Druid是一种开源的Java数据库连接池。MyBatis Plus是MyBatis的增强工具,可以简化数据库操作。将这三者整合在一起,可以提高开发效率和代码的易读性。 首先,我们需要在项目的pom.xml文件中添加引用依赖。可以通过Maven或Gradle来管理依赖项。在pom.xml中添加Spring Boot、Druid和MyBatis Plus的相关依赖。 接下来,在application.yml或application.properties文件中配置数据库连接信息和Druid的相关配置。包括数据库的URL、用户名、密码以及Druid的一些监控和性能统计配置。 然后,创建一个DataSourceConfig类,用于配置Druid数据源,并使用@Configuration和@Bean注解将它声明为一个Bean。在该类中,可以设置连接池的一些属性,例如最小连接数、最大连接数、初始连接数等。 接着,创建一个MyBatisConfig类,用于配置MyBatis Plus。在该类中,可以配置MyBatis的类型别名、Mapper扫描路径和拦截器等。 最后,创建一个启动类,并使用@SpringBootApplication注解将其声明为Spring Boot应用程序的入口。在启动类中,可以使用@MapperScan注解指定MyBatis的Mapper接口所在的包路径,并在main方法中调用SpringApplication的run方法来启动应用程序。 通过以上步骤,我们就完成了Spring Boot、Druid和MyBatis Plus的整合。现在可以在项目中编写Mapper接口和对应的XML文件,用于定义数据库的增删改查操作。并使用@Service或@Repository注解将Mapper接口声明为Spring组件,从而可以在其他地方直接使用@Autowired注解进行自动注入。 除此之外,还可以利用MyBatis Plus的一些特性,如自动生成代码、分页查询、多数据源配置等,进一步提高开发效率。 总结起来,Spring Boot、Druid和MyBatis Plus的整合可以简化数据库操作,并提供了一些方便的特性和工具,让开发变得更加高效和简单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值