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