2013-02-12 51 views
2

以记录我有一个表像下面从数据库中的Java

enter image description here

我运行一个查询来获取表中的数值如下

SELECT Id, UserName, UserId, Password, 
     CASE Status WHEN 1 THEN 'Active' ELSE 'Inactive' END AS Status 
    FROM users 

现在我的Java代码以上查询是如下。

String[] arrUsersList[] = new String[100][5]; 
    String[] arrUsersTem = new String[5]; 

    pstmt = conn.createStatement(rs.TYPE_FORWARD_ONLY, rs.CONCUR_READ_ONLY); 
    rs = pstmt.executeQuery(strSQL); 


    while(rs.next()) 
    { 
     arrUsersTem[0] = rs.getString("Id"); 
     arrUsersTem[1] = rs.getString("UserName"); 
     arrUsersTem[2] = rs.getString("UserId"); 
     arrUsersTem[3] = rs.getString("Password"); 
     arrUsersTem[4] = rs.getString("Status"); 

     arrUsersList.add(arrUsersTem); 
    } 

我的问题是

我知道我应该使用二维数组从记录得到的值。我也知道我在做错误的方式。从以上的结果集中获取记录的正确方法是什么。

是阵列的正确选择,或者我应该使用ArrayList或其他东西。

感谢您的回复。

+0

谢谢大家帮助我每个人发表回答。困惑哪一个打勾 – 2013-02-12 13:43:26

回答

4

Java是面向对象的语言,所以常见的方式是打造一流的描述与此类表格和表格Collection的实体对象

class Account { 

    private long id; 
    private String userName; 
    private String userId; 
    private String password; 
    private boolean status; 

    // getters, setters 
} 

List<Account> accountList = new ArrayList(); 
Account account; 

while(rs.next()) { 

    account = new Account(); 
    account.setId(rs.getLong("Id")); 
    account.setUserName(rs.getString("UserName")); 
    account.setUserId(rs.getString("UserId")); 
    account.setPassword(rs.getString("Password")); 
    account.setStatus(rs.getBoolean("Status")); 

    accountList.add(account); 
} 
+0

感谢您的回复我是新来的Java所以我应该寻找如何将表与Java中的集合关联 – 2013-02-12 13:31:30

+0

@JavaBeginner,看看更新 – bsiamionau 2013-02-12 13:37:20

4

您应该创建一个用户的bean包含字段为每个数据库列。然后创建用户豆类的列表,这样做:

List<User> users = new ArrayList<User>(); 
while(rs.next()) { 
     User user = new User(); 
     user.setId(rs.getString("Id")); 
     user.setUsername(rs.getString("UserName")); 
     //More fields here 


     users.add(user); 
    } 

这时会留下用户的列表,而不是一个混乱的二维数组

+0

感谢您的回复。所以列表之后的用户是类名Right – 2013-02-12 13:33:02

+0

是的,这是正确的。这是指定将存在于该列表中的对象的类。它使用泛型。如果你想了解更多关于Java的泛型,请到处搜索。 – cowls 2013-02-12 13:34:13

+0

非常感谢你我学到了很多东西。谢谢了很多 – 2013-02-12 13:34:55

2

既然你结果集可以是任意大小的,你应该不使用数组,你应该使用Collection(或任何派生实现)。

首先,你应该创建表示要检索的元组的类:

public class User { 

    // fields 
    private int id; 
    private int userId; 
    private String username; 
    private String password; 
    private String status; 

    // constructor 
    public User(ResultSet rs) { 
    id = rs.getInt("Id"); 
    // the same for the other fields... 
    } 
} 

第二和最后,当迭代只需要创建一个新的实例为每一行/元组,并将得到的对象添加到集合这将根据需要增长。

List<User> users = new ArrayList<User>(); 
while(rs.next()) 
{ 
    users.add(new User(rs)); 
} 
+0

非常感谢你 – 2013-02-12 13:38:20

+1

我会避免让你的业务领域对象(例如用户)依赖于像JDBC这样的JDBC类。保持它们分开。 – NickJ 2013-02-12 13:41:06

+0

+1你是对的@NickJ! – 2013-02-12 13:41:41

2

我将创建一个类用户:

public class User { 
    private int id; 
    private String userName; 
    private String userId; 
    private String password; 
    private boolean active; 
    // getters & setters... 
} 

然后创建这样的用户:

SQL:

SELECT Id, UserName, UserId, Password, Status FROM users 

的Java:

List<User> users = new ArrayList<User>(); 

while (rs.next()) { 
    User user = new User(); 
    user.setId(rs.getInt(1)); 
    user.setUserName(rs.getString(2)); 
    user.setUserId(rs.getString(3)); 
    user.setPassword(rs.getString(4)); 
    user.setActive(rs.getInt(5)>0); 
    users.add(user); 
} 
0

试试这个:

while(rs.next()) { 

    account = new Account(); 
    account.setId(rs.getLong("Id")); 
    account.setUserName(rs.getString("UserName")); 
    account.setUserId(rs.getString("UserId")); 
    account.setPassword(rs.getString("Password")); 
    account.setStatus(rs.getBoolean("Status")); 

    accountList.add(account); 
}