WEB开发网
开发学院数据库MSSQL Server 单句SQL语句的解析方案 阅读

单句SQL语句的解析方案

 2009-02-05 10:20:54 来源:WEB开发网   
核心提示: 之所以不直接使用String的split方法是因为分隔符存在多种形式,使用split方法后将无从知晓以前的劈分符是什么,单句SQL语句的解析方案(4),比如 where c1=1 and c2=2 or c3=3,如果使用(and|or)做劈分符再用split方法,那么再还原SQL语句是将

之所以不直接使用String的split方法是因为分隔符存在多种形式,使用split方法后将无从知晓以前的劈分符是什么,比如 where c1=1 and c2=2 or c3=3,如果使用(and|or)做劈分符再用split方法,那么再还原SQL语句是将不可能知道原先的分隔符是and还是or。

5.还原整个SQL语句。

分析完SQL语句后,最终是要以清晰完整的形式将SQL还原出来,这一步的工作主要是将各个子句又重新组合起来,如果分析的语句是

select c1,c2,c3 from  t1,t2, t3 where condi1=5 and condi6=6 or condi7=7 order by g1,g2

解析后的的Sql为:

select
  c1,
  c2,
  c3
from
  t1,
  t2,
  t3
where
  condi1=5 and
  condi6=6 or
  condi7=7
order by
  g1,
  g2
到这里,我对单句SQL语句进行分析的基本思路都写完了,下面是完整的代码示例:

工具类SqlParserUtil,这是进行SQL解析的入口

public class SqlParserUtil{
public static String getParsedSql(String sql){
 sql=sql.trim();
 sql=sql.toLowerCase();
 sql=sql.replaceAll("s+", " ");
 sql=""+sql+" ENDOFSQL";
 return SingleSqlParserFactory.generateParser(sql).getParsedSql();
}
}

单句Sql解析器基类:

package com.sitinspring.common.sqlparser.single;
import java.util.ArrayList;
import java.util.List;
import com.sitinspring.common.sqlparser.SqlSegment;
/** *//**
* 单句Sql解析器,单句即非嵌套的意思
* @author 何杨(heyang78@gmail.com)
*
* @since 2009-2-2 下午03:01:06
* @version 1.00
*/
public abstract class BaseSingleSqlParser{
/** *//**
 * 原始Sql语句
 */
protected String originalSql;
/** *//**
 * Sql语句片段
 */
protected List<SqlSegment> segments;
/** *//**
 * 构造函数,传入原始Sql语句,进行劈分。
 * @param originalSql
 */
public BaseSingleSqlParser(String originalSql){
 this.originalSql=originalSql;
 segments=new ArrayList<SqlSegment>();
 initializeSegments();
 splitSql2Segment();
}
/** *//**
 * 初始化segments,强制子类实现
 *
 */
protected abstract void initializeSegments();
/** *//**
 * 将originalSql劈分成一个个片段
 *
 */
protected void splitSql2Segment() {
 for(SqlSegment sqlSegment:segments){
  sqlSegment.parse(originalSql);
 } 
}
/** *//**
 * 得到解析完毕的Sql语句
 * @return
 */
public String getParsedSql() {
 StringBuffer sb=new StringBuffer();
 for(SqlSegment sqlSegment:segments){
  sb.append(sqlSegment.getParsedSqlSegment()+"n");
 } 
 String retval=sb.toString().replaceAll("n+", "n"); 
 return retval;
}
}

上一页  1 2 3 4 5  下一页

Tags:单句 SQL 语句

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接