我有搜索数据的follwinig代码。
public void advanceSearchMethod(String advanceName, int advanceTpNumber, String advanceAddress, String advanceDescription){
Connection connection=null;
try{
//for connect to database.
connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost/contactbook","root","time1");
//for communicate with database.
Statement stmt=(Statement)connection.createStatement();
String searchQuery="SELECT * FROM Contacts WHERE Name LIKE '%'"+advanceName+"'%' AND TelePhoneNumber LIKE '"+advanceTpNumber+"%' OR Address LIKE '%'"+advanceAddress+"'%' OR Description LIKE '%'"+advanceDescription+"'%'";
rs=stmt.executeQuery(searchQuery);
contactTableInDefaultForm.setModel(DbUtils.resultSetToTableModel(rs));
}catch(Exception e){
JOptionPane.showMessageDialog(null, "Sorry! Connection Failed");
}
}
此代码中没有错误。但是工作catch块。我无法想象我应该做些什么。我该如何搜索它们?
答案 0 :(得分:3)
你有一个主要的错误 - 当你构建WHERE子句时,你会在'%opening-quote& amp;'之后出现虚假的'撇号'。通配符和%'结束 - 通配符&报价。
Your broken code: "WHERE Name LIKE '%'"+advanceName+"'%'"
Corrected: "WHERE Name LIKE '%"+advanceName+"%'"
但是整个代码根本不是好代码 - 每一件事都是错误的。
WHERE子句只能与您实际需要搜索的条件一起构建。应该使用PreparedStatement和?绑定参数,而不是在SQL中构建字符串文字。 (你已经建立了一个众所周知的安全漏洞。)
PhoneNumbers是字符串,而不是整数。 TelePhoneNumber的LIKE模式没有起始%。
应该从一个班级提供数据库连接。方法,而不是应用程序中的每个方法。
应检查单独操作中的错误(获取连接/执行查询和读取结果)和&单独报道。应该总是记录异常和堆栈跟踪(使用Log4J),或者在最坏的情况下,输出到控制台。
你唯一能做的就是变量&参数命名。
老实说,你应该使用Hibernate而不是写这种摇摇欲坠的废话。
答案 1 :(得分:1)
String searchQuery="SELECT * FROM Contacts WHERE Name LIKE '%'"+advanceName+"'%' AND TelePhoneNumber LIKE '"+advanceTpNumber+"%' OR Address LIKE '%"+advanceAddress+"%' OR Description LIKE '%"+advanceDescription+"%'";
你已经加入了单一的quatation .. 希望这是正确答案..