如何在数据库中插入用户名和检查用户名是重复的

时间:2017-11-21 07:08:29

标签: java

public static ArrayList<User_Database> getUsername() {

    ArrayList<User_Database> list_Username = new ArrayList<User_Database>();
    try {
        Class.forName(driver);
        String sql = "SELECT user_name FROM users";
        Connection connect = DriverManager.getConnection(url, user, password);
        Statement state = connect.createStatement();
        ResultSet rs = state.executeQuery(sql);
        while (rs.next()) {
            String user_name = rs.getString("user_name");
            User_Database userDB = new User_Database(user_name);
            list_Username.add(userDB);
            System.out.printf(" %s  \n", user_name);
        }
        rs.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (ClassNotFoundException e) {
        System.out.println(e.getMessage());
    }
    return list_Username;
}

public static void createNewUser(User_Database us) {
    getAllUser();
    try {
        Class.forName(driver);
        Connection connect = DriverManager.getConnection(url, user, password);
        Statement state = connect.createStatement();
        String sql = "INSERT INTO users  VALUES (0, '" + us.user_name + "' , '" + us.user_password + "' , '"
                + us.email + "') ";
        if (getAllUser().equals(us.user_name)) {
            System.out.println("Username not available");
        } else {
            state.executeUpdate(sql);
            state.close();
            System.out.println("Insert Database Success");
        }
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (ClassNotFoundException e) {
        System.out.println(e.getMessage());
    }
}

1 个答案:

答案 0 :(得分:0)

你正在呼叫getAllUser()而我不知道是做什么的。假设您想要调用getUsername(),这是您在此处提供的方法,它会在ArrayList<User_Database>中返回您在数据库中拥有的所有用户名。

执行if (getAllUser().equals(us.user_name))时,您尝试将ArrayList与String进行比较,这是错误的。请在下面的代码中找到更正:

public static void createNewUser(User_Database us) {
    try {
        Class.forName(driver);
        Connection connect = DriverManager.getConnection(url, user, password);
        Statement state = connect.createStatement();
        String sql = "INSERT INTO users  VALUES (0, '" + us.user_name + "' , '" + us.user_password + "' , '"
                + us.email + "') ";

        boolean isUnique = true;

        for(User_Database user: getUsername()) {
            if(user.user_name.equals(us.user_name)) {
                isUnique = false;
                break;
            }
        }

        if (!isUnique) {
            System.out.println("Username not available");
        } else {
            state.executeUpdate(sql);
            state.close();
            System.out.println("Insert Database Success");
        }
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (ClassNotFoundException e) {
        System.out.println(e.getMessage());
    }
}

其他说明

  • 在try catch块之外关闭你的语句,例如在最后一个街区内。通过这种方式,您可以确保即使在发生异常时也会关闭它。
  • 也不要忘记关闭连接。
  • 尽量不要直接在查询中插入用户提供的信息,因为这会导致数据库出现严重问题(例如SQL Injection)。尝试查看this并改用PreparedStatement

另一个重要的考虑因素:

  • 由于您正在检查用户名的唯一性,因此ArrayList可能不是最好的(在性能方面)来实现您想要的,因为当您想要检查是否已经存在时,必须通过它数据库中的用户名与否(O(N))。相反,尝试获取所有用户名并将其放在HashSet中。使用set,您只需尝试add用户名;如果用户名是唯一的,你将得到一个真假,如果它已经在集合中(O(1)),你将得到假。

希望它有所帮助。