Java mysql之类的命令

时间:2015-07-26 17:03:54

标签: java mysql sql-like

我想请求帮助我的代码,根据身份证号码从数据库中找到相关名称。

我的代码找到了我试图找到的名称。

但我想在程序找不到ID号时发送错误信息。

我尝试了很多方法,但总是在找不到ID号时,它说构建成功并且没有错误就退出程序。

感谢您的帮助。

public void search(String ID) throws SQLException {

    Statement mystate = con.createStatement();

    String sql = "SELECT*FROM users" +
        " WHERE id LIKE " + ID;

    ResultSet rs = mystate.executeQuery(sql);    

    while (rs.next()) {

        System.out.println("Your Name is " + rs.getString("name"));   
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码存在两个大问题:

  1. 您不会在ID周围放置SQL引号,因此它看起来像是SQL解析器的关键字或标识符

  2. 全开到SQL注入攻击(见下文)

  3. 您想使用PreparedStatement,它会为您处理这两种情况。然后只需使用一个标志即可看到任何内容:

    public void search(String ID) throws SQLException {
        boolean sawOne = false;
    
        PreparedStatement mystate = con.prepareStatement(
            "SELECT * FROM users WHERE id LIKE ?"
        );
        mystate.setString(1, ID);
        ResultSet rs = mystate.executeQuery(mystate);    
    
        while (rs.next()) {
            sawOne = true;
            System.out.println("Your Name is " + rs.getString("name"));   
        }
        if (!sawOne) {
            System.out.println("...");
        }
    }
    

    我假设ID已经有一张通配符(或者你真的不想要一张通配符)。

    或者如果您知道只有一场比赛,或者您只想要一场比赛,即使有多场比赛,您也可以添加

    mystate.setMaxRows(1);
    

    ...在executeQuery()之前,然后只使用if/else,不需要标记:

    if (rs.next()) {
        System.out.println("Your Name is " + rs.getString("name"));   
    } else {
        System.out.println("...");
    }
    

    强制SQL注入链接:http://bobby-tables.com/

    卡通:

    enter image description here

答案 1 :(得分:0)

public void search(String ID) throws SQLException {

    Statement mystate = con.createStatement();

    String sql = "SELECT*FROM users" +
            " WHERE id LIKE " + ID;

    ResultSet rs = mystate.executeQuery(sql);    

    if(rs.next()) {

        System.out.println("Your Name is " + rs.getString("name"));   
    }
    else
    {
        System.out.println("Id not found");   
    }
}