Java SQL唯一用户名

Java SQL唯一用户名,java,mysql,database,Java,Mysql,Database,空白数据库 如果我输入用户名example1,它将添加到数据库中。然后,如果我再次尝试重新添加它,它将被我的代码停止,因为它已经在数据库中。然后,如果我输入example2并添加它,它将进入数据库,然后如果我尝试重新添加它,我的代码会让它通过唯一停止它的东西是数据库主键: 我认为这条线就是问题所在: PreparedStatement st = connection.prepareStatement("select * from Members order by username

空白数据库

如果我输入用户名example1,它将添加到数据库中。然后,如果我再次尝试重新添加它,它将被我的代码停止,因为它已经在数据库中。然后,如果我输入example2并添加它,它将进入数据库,然后如果我尝试重新添加它,我的代码会让它通过唯一停止它的东西是数据库主键:

我认为这条线就是问题所在:

        PreparedStatement st = connection.prepareStatement("select * from Members order by username asc");
以下是整个方法:

public static boolean CheckUsernameExists(String username){

    boolean usernameExists = false;

    try{
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection(urlDB, usernameDB, passwordDB);

        PreparedStatement st = connection.prepareStatement("select * from Members order by username asc");
        ResultSet r1=st.executeQuery();
        String usernameCounter;
        if(r1.next()){
            usernameCounter =  r1.getString("username");
            if(usernameCounter.equals(username)){
                System.out.println(username);
                usernameExists = true;
            }
        }
     } catch (SQLException e) {
        System.out.println("SQL Exception: "+ e.toString());
     }catch (ClassNotFoundException cE){
        System.out.println("Class Not Found Exception: "+ cE.toString());
     }

    return usernameExists;
}

将查询更改为以下内容:

"select * from Members where username=" +  username
    PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
    st.setString(1, username);
    ResultSet r1=st.executeQuery();
    if(r1.next()){
         System.out.println('user already exist in database!");
    }
    else{
        //Add to database
    }

它将只返回这个用户,从数据库中请求所有用户,然后在应用程序中过滤它们是没有意义的。应用程序和数据库都会过载。

将查询更改为以下内容:

"select * from Members where username=" +  username
    PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
    st.setString(1, username);
    ResultSet r1=st.executeQuery();
    if(r1.next()){
         System.out.println('user already exist in database!");
    }
    else{
        //Add to database
    }

它将只返回这个用户,从数据库中请求所有用户,然后在应用程序中过滤它们是没有意义的。应用程序和数据库都过载。

最好是这样:

"select * from Members where username=" +  username
    PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
    st.setString(1, username);
    ResultSet r1=st.executeQuery();
    if(r1.next()){
         System.out.println('user already exist in database!");
    }
    else{
        //Add to database
    }
或者,由于您的方法是
CheckUsernameExists

public static boolean CheckUsernameExists(String username){

    boolean usernameExists = false;
    try{
        PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
        st.setString(1, username);
        ResultSet r1=st.executeQuery();
        if(r1.next()){
           usernameExists = true;
        }
    catch (Exception e) {
        System.out.println("SQL Exception: "+ e.toString());
    }
    return usernameExists;
}

最好是这样:

"select * from Members where username=" +  username
    PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
    st.setString(1, username);
    ResultSet r1=st.executeQuery();
    if(r1.next()){
         System.out.println('user already exist in database!");
    }
    else{
        //Add to database
    }
或者,由于您的方法是
CheckUsernameExists

public static boolean CheckUsernameExists(String username){

    boolean usernameExists = false;
    try{
        PreparedStatement st = connection.prepareStatement("select * from Members where username = ? ");
        st.setString(1, username);
        ResultSet r1=st.executeQuery();
        if(r1.next()){
           usernameExists = true;
        }
    catch (Exception e) {
        System.out.println("SQL Exception: "+ e.toString());
    }
    return usernameExists;
}

不要迭代所有用户。只需尝试从数据库中选择所需的用户名。此外,如果使用提供的字符串,则有SQL注入的危险。尝试使用以下方法:

PreparedStatement st = connection.prepareStatement("select * from Members where username = ?");
st.setString(1, username);
ResultSet rs = st.executeQuery();

不要迭代所有用户。只需尝试从数据库中选择所需的用户名。此外,如果使用提供的字符串,则有SQL注入的危险。尝试使用以下方法:

PreparedStatement st = connection.prepareStatement("select * from Members where username = ?");
st.setString(1, username);
ResultSet rs = st.executeQuery();

您可以通过以下方式实现您的目标:

PreparedStatement st = connection.prepareStatement("select id from Members where username = ? ");
    //I assumed that their is id column in Members.
    st.setString(1, username);
    ResultSet resultSet=st.executeQuery();
    if(resultSet.next()){
         // prompt users already exists
    }
    else{
        //add to database
    }

只需抓取一个表示给定行的列,这其实并不重要,因为您只需检查是否有一行包含用户给定的用户名。(根据您当前的规格)。

您可以通过以下方式实现所需:

PreparedStatement st = connection.prepareStatement("select id from Members where username = ? ");
    //I assumed that their is id column in Members.
    st.setString(1, username);
    ResultSet resultSet=st.executeQuery();
    if(resultSet.next()){
         // prompt users already exists
    }
    else{
        //add to database
    }

只需抓取一个表示给定行的列,这其实并不重要,因为您只需检查是否有一行包含用户给定的用户名。(根据您当前的规格)。

这太疯狂了。获取要搜索的数据库,而不是返回整个用户列表。另外,您可以执行额外的步骤,使用户名在数据库中唯一,而无需执行任何操作。用户名在数据库中唯一。代码使我可以提醒用户发生了什么。如果您能帮助了解如何让数据库搜索,请回答。尝试添加具有重复用户名的用户将引发异常。你可以抓住这一点,并提供适当的反馈。至于在数据库上搜索,请使用
WHERE
。我认为捕获异常最适合查找bug等?通常是的,但捕获数据完整性问题也是一个很好的用途(这意味着可以运行一个查询而不是两个查询)。当然,您也可以编写超级复杂的SQL来在内部处理它并生成不同的输出,但这样做几乎肯定会更慢。这太疯狂了。获取要搜索的数据库,而不是返回整个用户列表。另外,您可以执行额外的步骤,使用户名在数据库中唯一,而无需执行任何操作。用户名在数据库中唯一。代码使我可以提醒用户发生了什么。如果您能帮助了解如何让数据库搜索,请回答。尝试添加具有重复用户名的用户将引发异常。你可以抓住这一点,并提供适当的反馈。至于在数据库上搜索,请使用
WHERE
。我认为捕获异常最适合查找bug等?通常是的,但捕获数据完整性问题也是一个很好的用途(这意味着可以运行一个查询而不是两个查询)。当然,您也可以编写超级复杂的SQL来在内部处理它并生成不同的输出,但这样做几乎肯定会慢一些。永远不要将用户提供的数据直接放入查询,否则小bobby表将处理您的数据。SQL注入漏洞的好例子感谢您的教训!使用准备好的语句和
。永远不要将用户提供的数据直接放入查询,否则小bobby表将处理您的数据。SQL注入漏洞的好例子感谢您的教训!