Java 如何使用StringTokenizer进行选择查询?
我正试图为最终用户创建一个从视图JSP到控制器的选定字段的查询,但我不知道如何进行 例如,我从JSP视图中获得了这些参数Java 如何使用StringTokenizer进行选择查询?,java,spring-mvc,stringtokenizer,Java,Spring Mvc,Stringtokenizer,我正试图为最终用户创建一个从视图JSP到控制器的选定字段的查询,但我不知道如何进行 例如,我从JSP视图中获得了这些参数 IDUSER,>,2,OR,USERNAME,=,'KURT' 所以,我想要这样的东西 SELECT IDUSER, USERNAME FROM TABLE_NAME WHERE IDUSER > 2 OR USERNAME = 'KURT' 但我有下一个结果 SELECT null FROM TABLE_NAME WHERE IDUSER > 2 OR
IDUSER,>,2,OR,USERNAME,=,'KURT'
所以,我想要这样的东西
SELECT IDUSER, USERNAME FROM TABLE_NAME WHERE IDUSER > 2 OR USERNAME = 'KURT'
但我有下一个结果
SELECT null FROM TABLE_NAME WHERE IDUSER > 2 OR USERNAME = 'KURT'
我正在使用StringTokenizer类解析字符串,其中查询为:string query=request.getParameterdata;数据是IDUSER,>,2,或者用户名,=,'KURT'
请帮助我我认为问题在于while循环中的这一行:
myQuery = "SELECT " + fields[i] + " FROM "+tableName+ " WHERE ";
这将在while循环执行时不断更改myQuery的值
也许您需要将其替换为:
myQuery = "SELECT " + fields[0] + " FROM "+tableName+ " WHERE ";
break;
我假设您的选择标准是您视图中参数的第一个字段。不知道IDPERFIL来自何处。另外,我不喜欢这样:
这将迭代标记器到最后,并在最后一个元素处停止。我肯定你不想要这个。解决这个问题,告诉我IDPERFIL是从哪里来的,然后,也许你们会自己理解答案。否则,我将尝试进一步提供帮助。这里是在您的查询中稍作调整后重新定义分隔符的解决方案
public static void main(String[] args) {
// Redefine the separators as single , separators is difficult to process
//You would need to define possible operators like this (#OR# , #AND# ) ,surrounded by special characters to identify.
String query ="IDUSER_>_2#OR#USERNAME_=_'KURT'";
String tableName="TESTTABLE";
String operator=null;
//you can choose operator conditionally
if(query.contains("#OR#")) operator="#OR#";
// if(query.contains("#AND#")) operator="#AND#";
//Used split instead of Tokenizer.
String cols[]= query.split(operator);
String myQuery = "SELECT ";
String select="";
for(String col:cols){
if(!select.isEmpty()){
select+=" , ";
}
// Only the first element is retrieved (for select)
select+=col.split("_")[0];
}
myQuery+=select+" FROM "+tableName+ " WHERE ";
// Removes all special charecters (like, # and _ with white space)
String subQuery = query.replaceAll("#", " ");
subQuery=subQuery.replaceAll("_", "");
myQuery+=subQuery;
System.out.println("QUERY RESOLVED: " + myQuery);
}
注:“,”替换为“\”,运算符用
干杯 您好,查询字符串是什么样子的?字符串query=IDUSER,>,2或,USERNAME,=,'KURT';这种方法容易受到SQL注入的影响。不要在面向公众的网站上使用它。列名和where子句在此查询中混淆。最好单独获取它们。不,用户final可以从视图JSPOK中选择1个或多个字段,那么您如何决定用户可以选择什么以及约束应该是什么?也就是说,您如何找到SELECT后面的内容以及WHERE后面的内容?请参阅Thor84no对上述原始问题的评论。他想要的查询实际上包括两个列名,但他没有任何可用的信息显示,应该是两个,必须从他神奇字符串中的列名推断出来。假设这些列是可变的,则需要查找可能的列名列表并计算字段数,然后正确地包含它们。
while(field.hasMoreTokens()) {
fields[i] = field.nextToken();
}
public static void main(String[] args) {
// Redefine the separators as single , separators is difficult to process
//You would need to define possible operators like this (#OR# , #AND# ) ,surrounded by special characters to identify.
String query ="IDUSER_>_2#OR#USERNAME_=_'KURT'";
String tableName="TESTTABLE";
String operator=null;
//you can choose operator conditionally
if(query.contains("#OR#")) operator="#OR#";
// if(query.contains("#AND#")) operator="#AND#";
//Used split instead of Tokenizer.
String cols[]= query.split(operator);
String myQuery = "SELECT ";
String select="";
for(String col:cols){
if(!select.isEmpty()){
select+=" , ";
}
// Only the first element is retrieved (for select)
select+=col.split("_")[0];
}
myQuery+=select+" FROM "+tableName+ " WHERE ";
// Removes all special charecters (like, # and _ with white space)
String subQuery = query.replaceAll("#", " ");
subQuery=subQuery.replaceAll("_", "");
myQuery+=subQuery;
System.out.println("QUERY RESOLVED: " + myQuery);
}