Java 解析SQL查询字符串以获取值的映射

Java 解析SQL查询字符串以获取值的映射,java,sql,sql-parser,Java,Sql,Sql Parser,我有一个java项目,其中PreparedStatements没有在任何SQL查询中使用。现在我想为所有这些查询实现PreparedStatements。我不想通过放置“?”来修改每个查询,而是想编写一个函数,该函数使用SQL查询字符串对其进行解析,并返回各种SQL子句的值映射 public class SQLParser { public static void main(String args[]) { String sqlString = "select *

我有一个java项目,其中PreparedStatements没有在任何SQL查询中使用。现在我想为所有这些查询实现PreparedStatements。我不想通过放置“?”来修改每个查询,而是想编写一个函数,该函数使用SQL查询字符串对其进行解析,并返回各种SQL子句的值映射

public class SQLParser {

    public static void main(String args[]) {

    String sqlString = "select * from table t where columnA = 'hello' and columnB = 'hai'";
    Map<Integer,String> values = new HashMap<>();
    values = parseQuery(sqlString);
    System.out.println(values);   // prints  { {1,'hello'} , {2,'hai'} }
    }

    private static Map<Integer,String> parseQuery(String sqlString) {
        Map<Integer,String> values = new HashMap<>();
        //
        //  ????  I want this function 
        //
        return values;
        
    }

}
公共类SQLParser{
公共静态void main(字符串参数[]){
String sqlString=“从表t中选择*,其中columnA='hello'和columnB='hai';
映射值=新的HashMap();
values=parseQuery(sqlString);
System.out.println(values);//打印{{1,'hello'},{2,'hai'}
}
私有静态映射parseQuery(字符串sqlString){
映射值=新的HashMap();
//
//我想要这个函数
//
返回值;
}
}
这方面的例子很少

sqlString:从表t中选择*,其中columnA='hello'和columnB='hai'
输出:{{1,'hello'},{2,'hai'}

sqlString:从表t中选择*,其中列A位于('hello','hai')
输出:{{1,'hello'},{2,'hai'}

sqlString:从表t中选择*,其中columnA>17,columnB介于10和20之间
输出:{1,'17'},{2,'10'},{3,'20'}


基本上,它应该支持所有可能的子句及其组合。

实现它的正确方法是创建SQL解析器。这是一项艰巨的任务。如果你决定这样做,你可以看看我的(Scala),它甚至还没有接近完成


另一种方法是创建regexp来捕获所有文本。你只需要扫描器就可以了,这更简单。

如果你的地图的键是递增的数字,那么列表就足够了吗?不管怎样,你基本上是在问如何为SQL编写解析器(顺便说一句,哪种SQL方言?),如果你问我,这似乎不是一个小技巧。我不确定它是否适合StackOverflow答案。无论如何,您都必须更改每个查询的代码,无论是使用magic语句解析器/预处理程序还是直接使用
PreparedStatement
。您是否真的可以开发神奇的解析器/预处理程序,然后修改每个查询以使用它,这比将每个查询重写为
PreparedStatement
所需的时间要短?我们在这里讨论了多少问题?我想你错过了一些东西。使用PreparedStatement的要点是避免SQL注入。但是,如果您首先从参数创建一个字符串形式的SQL,那么此时就可以进行注入,您的解析器将很高兴地解析恶意SQL语句。