单句SQL语句的解析方案
2009-02-05 10:20:54 来源:WEB开发网之所以不直接使用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
到这里,我对单句SQL语句进行分析的基本思路都写完了,下面是完整的代码示例:
c1,
c2,
c3
from
t1,
t2,
t3
where
condi1=5 and
condi6=6 or
condi7=7
order by
g1,
g2
工具类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;
}
}
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接