javasqlparser_使⽤Jsqlparser从复杂SQL语句中提取表名如果从简单的SQL语句中获取表名,那么可以通过不严谨的关键字匹配的⽅式获取或者正则表达式的⽅式获取表名。但是这种做法不具有通⽤性,遇到复杂的SQL语句就会存在BUG。
严谨的做法当然是通过SQL分析⼯具分析SQL结构并获取SQL信息,Jsqlparser就是这样的⼯具,为我们的SQL分析提供了便利。下⾯通过⼀个简单的例⼦可以了解到Jsqlparser的实现机制,举⼀反三,更多的应⽤都是可以做到的。//实现从SQL中提取表名
public static final List getTables(String sql) {
CCJSqlParserManager parserManager = new CCJSqlParserManager();
Statement stmt;
try {
//解析SQL语句
stmt = parserManager.parse(new StringReader(sql));
} catch (JSQLParserException e) {
return null;
}
final List tableNames = new ArrayList();
//使⽤visitor模式访问SQL的各个组成部分
stmt.accept(new MyStatementVisitor(tableNames));
return tableNames;
}
static class MySelectVisitor implements SelectVisitor {
List tableNames;
public MySelectVisitor(List tableNames) {
this.tableNames = tableNames;
}
@Override
public void visit(PlainSelect ps) {
FromItemVisitor fromItemVisitor = new FromItemVisitor() {
@Override
public void visit(Table table) {
tableNames.Name());
}
@Override
public void visit(SubSelect ss) {
}
javaparser野外@Override
public void visit(SubJoin sj) {
}
};
//访问select中的from部分,这⾥获取到第⼀个表名
//访问select中的join部分,这⾥获取到第⼆个表名
List joins = ps.getJoins();
if (joins != null) {
for (Join join : joins) {
}
}
}
//忽略
@Override
public void visit(Union union) {
}
}
static class MyStatementVisitor implements StatementVisitor { List tableNames;
public MyStatementVisitor(List tableNames) {
this.tableNames = tableNames;
}
//访问select语句
public void visit(Select select) {
//访问select的各个组成部分
//访问delete语句
public void visit(Delete delete) {
tableNames.Table().getName());
}
//访问update语句
public void visit(Update update) {
tableNames.Table().getName());
}
//访问insert语句
public void visit(Insert insert) {
tableNames.Table().getName());
}
//访问replace,忽略
public void visit(Replace replace) {
}
//访问drop,忽略
public void visit(Drop drop) {
}
//访问truncate,忽略
public void visit(Truncate truncate) {
}
//访问create,忽略
public void visit(CreateTable arg0) {
}
}
public static void main(String[] args) throws JSQLParserException {
System.out.println(getTables("select * from (select * from table_a left outer join table_b on table_a.aa=table_b.bb)")); //输出结果:[table_a, table_b]
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论