前言
这段时间,为了开发数据中台项目,我去研究学习了JSQLParser(Java中解析SQL语句的工具),并且结合网上资料,写了一个初步的SQL解析工具类...
正文
时隔三天,我又回来了, 因为之前JSQLParser的使用方式果然不太正确 。基本上正常的SQL通过JSQLParser都可以完美解析出它的结构。
主要错误如下:
表别名的解析是包含from和join两部分的,之前只解析了from,所以无法获得所有的表。
SQL是可以不断嵌套的,解析的时候必须判断是否含有子查询,然后将子查询的SQL语句递归解析。
没有对union的情况做判断 2023/5/12.
关于字段类型的解析,可以用jdbc查询返回的map,然后判断instanceof的字段类型,非常简单。
这里就贴下最新的代码吧,目前已经支持了嵌套SQL的解析~~
实体类:
NormalSqlStructureDto.class
/**
* SQL语句
*/
private String sql;
/**
* 表名
*/
private List tableNames;
/**
* 检索项
*/
private List selectItems;
/**
* 字段和表的映射关系
*/
private List colMappings;
/**
* 表别名映射
*/
private Map tableAliasMapping;
ColMappingDto.class
/** 字段名 */
private String name;
/** 字段别名 */
private String alias;
/** 关联表 */
private Object table;
/** 表别名 */
private Object tableAlias;
/** 字段类型 */
private String type;
主要实现类:
public class JsqlParserUtil {
/**
* 表名列表
*/
private final static ThreadLocal> TABLE_NAME_LIST = new ThreadLocal<>();
/**
* 查询字段名列表
*/
private final static ThreadLocal> COLUMN_NAME_LIST = new ThreadLocal<>();
/**
* 表别名映射关系
*/
private final static ThreadLocal
解析结果展示
结论
JSQLParser是Java里用来解析SQL结构的一个非常好用的工具,有且不仅限于上面的功能。