2013-02-12 53 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); 
}