如何从Java源代码检索所有SQL查询?

时间:2018-06-21 12:28:47

标签: java sql parsing migration text-parsing

我们有许多使用Sybase数据库的Java Spring项目。

我们想将其迁移到MSSQL。

任务之一是开发脚本来查找项目源代码中使用的所有SQL查询。此外,项目中还增加了存储过程的使用。

什么是合适的方法呢?

@Override
public void update(int id, Entity entity) {
    jdbcTemplate.update(
        "UPDATE exclusion SET [enabled] = :enabled WHERE [id] = :id",
        HashMapBuilder.<String, Object>builder()
                .put("id", id)
                .put("enabled", entity.enabled)
                .build()
    );
}

这是最简单的情况。

首先,我们想对源代码进行正则表达式,以便通过一系列SQL关键字查找SQL。

1 个答案:

答案 0 :(得分:0)

从本质上讲,您希望找到任何送入jdbc调用的(SQL)字符串。

这意味着您的工具必​​须知道什么是jdbc方法(例如,“ jdbcTemplate.update”),以及每个方法的哪个参数是要用作SQL的字符串。既然已记录下来,那很容易。

很难找到字符串,因为它是动态组装的。不能保证整个SQL字符串实际上都作为函数调用的直接参数而存在。可以通过使用“ +”和任意函数调用组合SQL字符串片段来计算得出。

这意味着您必须从编译器的角度解析Java,了解每个符号的含义,并通过代码中的数据流跟踪值。

地球上正则表达式无法可靠地做到这一点。 (您可能做得不好,也许对您来说已经足够了,我建议您搜寻所有的jdbc方法调用名称。)

还有一个更严重的问题:一旦弄清了SQL字符串 是什么,您就需要知道它是否符合MSSQL。这就要求使用兼容MSSQL的解析器(同样,没有regex可以进行上下文无关的解析)来解析抽象字符串(记住,它是由一堆片段组成的),并抱怨那些没有解析的字符串。

即使这还不够,如果MSSQL的语句看起来与sybase语句相同,但含义不同。

这是使用自动化解决好一个非常困难的问题。 (有研究论文描述了上述所有活动)。

我认为您需要做的是找到所有SQL调用,并手动检查每个SQL调用的兼容性。

下次,您应该使用数据库访问层构建应用程序。然后所有SQL调用都放在一个地方。