什么是SQL解析

发布时间:2026/7/4 12:22:08

什么是SQL解析 什么是SQL解析这里给出使用的druid坐标dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.1.16/version /dependency注意druid不同版本结果可能会有细微差异。然后以Postgres数据库的语法进行解析。其实解析大致上都相同数据库的差异对解析影响不是很大最重要的还是思想。要使用druid进行SQL解析你需要先明白SQL的执行顺序SQL大致的执行顺序FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY当然这也只是个大致的顺序具体细节还需自己去探索。我们先用最简单的SQL来看看什么是SQL解析。public static void main(String[] args) { String sql select * from t; ListSQLStatement sqlStatements SQLUtils.parseStatements(sql, JdbcConstants.POSTGRESQL); SQLStatement sqlStatement sqlStatements.get(0); System.out.println(sqlStatement); }这里的sqlStatements对象我们暂时不用管它是什么主要看sqlStatement对象这里面封装了SQL语句的全部信息。现在我们使用debug查看sqlStatement对象里面到底是什么如图其实这里的sqlStatement就是大家说的AST(抽象语法树)这里面没有什么重要的信息就一个dbType可以看到数据库类型。然后我们继续看这个select看上去也没有什么我们继续点开query这里面看上去信息就很全这里面的各种关键字都是用来存放SQL语句中的信息的由于刚才SQL中只有select和from信息所以我们可以看到其他信息比如order by 都是 null我们在点看 selectList 和 from可以看到我们的select /* 和from t中的信息都被存放了进去。由此我们就可以知道druid解析实际上就是把SQL语句中的信息全部都解析出来放在这个sqlStatement中然后我们只需去解析这个sqlStatement对象就可以了至于sqlStatement对象怎么解析后面的博客会说到这里只是入门。下面我们再来解析个复杂的SQLpublic static void main(String[] args) { String sql select seq,remark,grade from student where 11 group by grade order by seq; ListSQLStatement sqlStatements SQLUtils.parseStatements(sql, JdbcConstants.POSTGRESQL); SQLStatement sqlStatement sqlStatements.get(0); System.out.println(sqlStatement); }同样的我们还是debug看sqlStatement对象这次我们直接看query对象怎么样是不是我们SQL的信息这里面都有我们暂时先不用管这些信息的数据结构是什么样的只用看到这些信息都有就行。我们先点开这个orderBy 看看里面是什么orderBy对象里面有个items是一个List对象这里面存放你order by 后面的字段一个字段就是一个items的元素再看一下这个groupBy它和orderBy类似也是一个group by后面一个字段就是一个items对象不同的是它还有个having对象这个在你的SQL有having关键字时就会填充进去。其实还有其他的解析方式比如visitor但我觉得没有直接解析这个statement对象来的直接。就比如这样public static void main(String[] args) { String sql with t as (select * from t) select seq,remark,grade from student where 11 group by grade order by seq; ListSQLStatement sqlStatements SQLUtils.parseStatements(sql, JdbcConstants.POSTGRESQL); SQLStatement sqlStatement sqlStatements.get(0); PGSchemaStatVisitor visitor new PGSchemaStatVisitor(); sqlStatement.accept(visitor); System.out.println(sqlStatement); }这样你就可以debug查看visitor有兴趣可以看看。其实SQL解析在很多公司都会用到但是发现博客很少大多都是个入门刚好我使用到了经过4个月的开发算是有了一些经验想写在这留个笔记方便以后回忆也希望给要入手SQL解析的人有个帮助。《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取以上资料如何领取文章来自网上侵权请联系博主

相关新闻