我想从特定列中搜索某些关键字并打印与关键字对应的所有列值,现在问题是我是否使用查询
从候选人中选择*,其中%C%等技能以及技能中的不同行为:
Java,C,C ++,HTML,CSS,Net Beans,My Eclipse
Java,Asp.Net,Eclipse
C,PHP,CSS,Hibernate
现在它正在对所有行进行diplaying,因为C是每行中的子字符串,我尝试使用C%而不是%C%但是只显示第3行,因为它以C开头,但我需要显示所有的Rowrs “C”作为一个不同的词,我如何搜索整个世界,建议一段代码。
import java.util.*;
import java.sql.*;
import java.io.*;
public class TokensOfString
{
public static void main(String[] args)
{
String str;
String query = "";
try
{
int i =0, cntToken =0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter the keywords to be searched");
str = br.readLine();
StringTokenizer words = new StringTokenizer(str, ",");
cntToken = words.countTokens();
//System.out.println("No. of Tokens = "+cntToken);
String token[]= new String[cntToken];
while(words.hasMoreElements())
{
token[i] = words.nextToken().trim();
//System.out.println(token[i]);
i++;
}
//System.out.println(++i+" : "+words.nextElement().toString().trim());
query = "SELECT * from can_skills where skills like '"+ token[0] +"%'";
// System.out.println("Query at 34 : "+query);
if(cntToken == 1)
{
query ="";
query = "SELECT * from can_skills where skills like '"+ str +"%'";
}
if(cntToken > 1)
{
for( int j=1; j < cntToken; j++)
query = query + " or skills like '"+ token[j] +"%'";
}
System.out.println("Query at 43 : "+query);
Connection con = null;
Class.forName("com.mysql.jdbc.Driver");
String hostName = "localhost";
String port = "3306";
String userName = "root";
String password = "root";
con = DriverManager.getConnection("jdbc:mysql://" + hostName + ":" + port + "/prem", userName, password);
Statement statement= con.createStatement();
ResultSet rs = statement.executeQuery(query);
while(rs.next())
{
System.out.println(rs.getString(4));
}
}
catch(ClassNotFoundException e){ System.out.println(e); }
catch(Exception ex){ System.out.println(ex); }
}
}
答案 0 :(得分:0)
你可以试试REGEXP:
"select * from can_skills where skills REGEXP '" . token . ",?'"
在此处阅读更多内容:http://dev.mysql.com/doc/refman/5.1/en/regexp.html
FWIW:现在你拥有代码的方式让它对注入式攻击持开放态度。
答案 1 :(得分:0)
使用正则表达式而不是like
表达式:
select *
from Candidate
where skills regexp '^C,| C,| C$'
|
表示or
。 ^
表示字符串的开头,$
表示结束。因此它将匹配字符串的开头,结尾和中间的标记。请注意,在第二个和第三个案例之前有空格。
在java中,如果我没有弄错:
"SELECT * from can_skills where skills regexp '^" + token[0] + ",| " + token[0] + ",| " + token[0] + "$'";