Java SQL语句解析——Jsqlparser开源项目

Java SQL语句解析——Jsqlparser开源项目

项目需要解析SQL语句获得表名以及where中的字段,自认为自己写代码来解析比较复杂也就在网上找相关的资料,最后找到这个开源项目JSqlparser.

jar包

jsqlparser-0.9.1.jar

github项目

jsqlparser-github

sourceforge上项目介绍

jsqlparser-sourceforge

相关资料准备完成,具体代码如下:

java代码

package com.primeton.sqlparser;

import java.io.StringReader;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.update.Update;


/** 
 * @ClassName: JsqlparserDemo 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author yuechang yuechang5@hotmail.com 
 * @date 201592日 上午11:40:59 
 */
public class JsqlparserDemo {


    public static void main(String[] args) throws JSQLParserException {
        demo();
    }

    public static void demo() throws JSQLParserException{
        CCJSqlParserManager pm = new CCJSqlParserManager();

        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("update ac_operator op ");
        stringBuffer.append("set op.errcount=(");
        stringBuffer.append("(select case when op1.errcount is null then 0 else op1.errcount end as errcount ");
        stringBuffer.append("from ac_operator op1 ");
        stringBuffer.append("where op1.loginname = '中国' )+1");
        stringBuffer.append("),lastlogin='中国' ");
        stringBuffer.append("where PROCESS_ID=");
        stringBuffer.append("(select distinct g.id from tempTable g where g.ID='中国')");
        stringBuffer.append("and columnName2 = '890' and columnName3 = '678' and columnName4 = '456'");

        Statement statement = pm.parse(new StringReader(stringBuffer.toString()));

        if (statement instanceof Update) {
            //获得Update对象
            Update updateStatement = (Update) statement;
            //获得表名
            System.out.println("table:"+updateStatement.getTable().getName());
            //获得where条件表达式
            Expression where = updateStatement.getWhere();
            //初始化接收获得到的字段信息
            StringBuffer allColumnNames = new StringBuffer();
            //BinaryExpression包括了整个where条件,
            //例如:AndExpression/LikeExpression/OldOracleJoinBinaryExpression
            if(where instanceof BinaryExpression){
                allColumnNames = getColumnName((BinaryExpression)(where),allColumnNames);
                System.out.println("allColumnNames:"+allColumnNames.toString());
            }
        }
    }

    /**
     * 获得where条件字段中列名,以及对应的操作符
     * @Title: getColumnName 
     * @Description: TODO(这里用一句话描述这个方法的作用) 
     * @param @param expression 
     * @param @param allColumnNames
     * @param @return 设定文件 
     * @return StringBuffer 返回类型 
     * @throws
     */
    private static StringBuffer getColumnName(Expression expression,StringBuffer allColumnNames) {

        String columnName = null;
        if(expression instanceof BinaryExpression){
            //获得左边表达式
            Expression leftExpression = ((BinaryExpression) expression).getLeftExpression();
            //如果左边表达式为Column对象,则直接获得列名
            if(leftExpression  instanceof Column){
                //获得列名
                columnName = ((Column) leftExpression).getColumnName();
                allColumnNames.append(columnName);
                allColumnNames.append(":");
                //拼接操作符
                allColumnNames.append(((BinaryExpression) expression).getStringExpression());
                //allColumnNames.append("-");
            }
            //否则,进行迭代
            else if(leftExpression instanceof BinaryExpression){
                getColumnName((BinaryExpression)leftExpression,allColumnNames);
            }

            //获得右边表达式,并分解
            Expression rightExpression = ((BinaryExpression) expression).getRightExpression();
            if(rightExpression instanceof BinaryExpression){
                Expression leftExpression2 = ((BinaryExpression) rightExpression).getLeftExpression();
                if(leftExpression2 instanceof Column){
                    //获得列名
                    columnName = ((Column) leftExpression2).getColumnName();
                    allColumnNames.append("-");
                    allColumnNames.append(columnName);
                    allColumnNames.append(":");
                    //获得操作符
                    allColumnNames.append(((BinaryExpression) rightExpression).getStringExpression());
                }
            }
        }
        return allColumnNames;
    }
}

运行结果

tableName:ac_operator
allColumnNames:PROCESS_ID:=-columnName2:=-columnName3:=-columnName4:=
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值