1

我有用于搜索数据的以下代码。

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 块。我无法想象我应该做什么。我该如何搜索它们?

4

2 回答 2

4

您有一个重大错误 - 当您构建 WHERE 子句时,在 '% opening-quote & wildcard 和 %' closing-wildcard & quote 之前有虚假的 ' 撇号。

Your broken code:     "WHERE Name LIKE '%'"+advanceName+"'%'"
Corrected:            "WHERE Name LIKE '%"+advanceName+"%'"

但是整个代码根本就不是好代码——每一件事都是错误的。

WHERE 子句应仅根据您实际需要搜索的条件构建。并且应该使用 PreparedStatement 和 ? 绑定参数,而不是将字符串文字构建到 SQL 中。(你已经建立了一个众所周知的安全漏洞。)

PhoneNumbers 是字符串,而不是整数。TelePhoneNumber 的 LIKE 模式没有起始 %。

数据库连接应该由一个类和方法提供,而不是应用程序中的每个方法。

单独操作(获取连接/与执行查询和读取结果)中的错误应单独检查和报告。应始终记录异常和堆栈跟踪(使用 Log4J),或者在最坏的情况下输出到控制台。

您在这里得到的唯一一件事就是变量和参数命名。

老实说,你应该使用 Hibernate 而不是写这种摇摇晃晃的废话。

于 2013-09-22T11:56:38.360 回答
2
String searchQuery="SELECT * FROM Contacts WHERE Name LIKE '%'"+advanceName+"'%' AND TelePhoneNumber LIKE '"+advanceTpNumber+"%' OR Address LIKE '%"+advanceAddress+"%' OR Description LIKE '%"+advanceDescription+"%'";

你已经添加了单引号..希望这是正确的答案..

于 2013-10-08T13:21:32.753 回答