【问题标题】:How to get all users from MySql database and put into arraylist如何从 MySql 数据库中获取所有用户并放入 arraylist
【发布时间】:2019-01-06 11:47:06
【问题描述】:

我正在创建一个 java 应用程序,它允许用户注册、登录和更新他们的详细信息。数据存储在已成功连接到我的应用程序的 MySQL 数据库中。

我希望能够获取用户的所有数据,这些数据将用于创建用户对象并制作所有用户的数组列表,类型为“user”。

我想知道的是,对于“用户”对象,ID 是否是一个很好的属性,因为我有他们的姓名和用户名(这对用户来说是唯一的)。

当用户登录到他们的帐户时,用户列表应该包含数组列表中的所有用户并定位到登录用户。我不知道该怎么做。

到目前为止,我已经上传了我当前的代码:

public class UserAccountList {

private static UserAccountList instance;
private ArrayList<user> userList;
user newUser = null;
int currentUser;

protected UserAccountList() throws IOException {
    this.userList = new ArrayList<>();
    readDatabase();   
}

public static void main(String[] args) throws IOException{
    ArrayList<user> userList1 = new UserAccountList().getUserList();
    for(int i=0;i<userList1.size();i++){
        System.out.println(userList1.get(i).getUsername());
    }
}
public ArrayList getUserList() throws IOException {
    return this.userList;

}

public static UserAccountList getInstance() throws IOException {
    if (instance == null) {
        instance = new UserAccountList();
    }
    return instance;
}



private void readDatabase() throws IOException {
     PreparedStatement ps;
     ResultSet rs;

     String query = "SELECT * FROM `user`" ;

     try{
    ps = MyConnection.getConnection().prepareStatement(query);


    rs = ps.executeQuery();

    while(rs.next() != false){

        String uname = rs.getString("username");
        String pass = rs.getString("password");
        String fname = rs.getString("firstname");
        String lname = rs.getString("lastname");
        String email = rs.getString("email");
        String uni = rs.getString("university");
        String course = rs.getString("course");

        user newUser = new user(fname, lname, uname, pass, email, uni, course);
        addUser(newUser);
    }

   }

    catch (SQLException ex) {
        Logger.getLogger(FXMLRegistrationController.class.getName()).log(Level.SEVERE, null, ex);
    }
}


public void addUser(user newUser){
    userList.add(newUser);
    return;
}
}

【问题讨论】:

  • 当前代码的输出是什么?请删除表名字符串查询的单引号 = "SELECT * FROM user" ;
  • 程序没有报错,我可以正常登录和注册用户。唯一的问题是它只对数组第一个位置的用户进行更改,因为我不知道如何获取当前登录用户的位置。

标签: java mysql database arraylist jdbc


【解决方案1】:

我的建议是尝试

while(rs.next()){

    String uname = rs.getString(1);
    String pass = rs.getString(2);
    String fname = rs.getString(3);
    String lname = rs.getString(4); //Presuming they are in this order
    String email = rs.getString(5);
    String uni = rs.getString(6);
    String course = rs.getString(7);

    user newUser = new user(fname, lname, uname, pass, email, uni, course);
    addUser(newUser);
} 

在我看来,拥有 ID 总是一个好主意,但我认为在您的情况下没有必要。至于定位用户,我认为它是currentUser 变量。当您通过验证并获取登录的用户时。使用userList.indexOf(loggedInUser)

【讨论】:

  • 感谢您回来!我已经对 while 语句进行了更改以获取数据,但我不明白的是我如何知道哪个用户已登录?我的想法是创建一个登录控制器类的用户对象,并在 changeProfile 类中使用该对象,但该对象不是全局的,仅在 logIn 类的范围内。
  • 所以首先要了解如何获取用户,在您的登录控制器类中,检查用户是否存在以及凭据是否正确。为此,您必须浏览用户列表,一旦凭据匹配,就返回用户。下一站是确保您始终可以访问该用户变量。您可以通过多种方式做到这一点,最好的方式取决于您的程序架构。例如,您可以将其设置为 MainFrame 中您始终可以访问的变量。
  • 或者在检查用户时使用你的UserAccountList class,返回列表中用户的索引。这样您就可以随时使用userList.get(index) 访问它
  • 无论哪种方式最适合您。我认为您的问题的解决方案只是让用户。因此,当您要通过列表检查凭据时。当用户名和密码匹配时,只需return user。我会为此使用 for each 循环。
  • 谢谢!我让它工作了,它现在只将数据更改为当前登录的用户!
【解决方案2】:

您应该简单地遍历您的 user 列表 userList 并将每个用户对象的用户名属性与当前登录用户的用户名进行比较:

user currentLoggedInUser = null;
String username = "username of current logged in user";// you have this, right?
for(user u: userList){
    if(username.equals()){
        currentLoggedInUser = u;
        break;
    }
}

但是

如果我是你,我会将user 对象存储在HashMap&lt;String,user&gt; 而不是ArrayList&lt;user&gt;

public class UserAccountList {
    //private ArrayList<user> userList;
    Map<String,user> users = new HashMap<String,user>(); // instead of above userList
    ...

    public void addUser(user newUser){
        users.put(newUser.getUsername, newUser);// key is username, value is the user object
    }
}

因此,当用户登录并尝试更改其某些属性时,您可以从 users 地图集合中获取它的对象,而无需遍历整个列表:

String username = "username of current logged in user";
user loggedInUser = users.get(username);

现在你有了相应的用户对象。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 2017-11-04
    • 2015-07-10
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多