使用jdbc从数据库中逐列检索值

时间:2017-09-21 05:12:43

标签: java jdbc

我想从数据库列中检索数据。假如我有列'a'然后我想要该列的所有值然后我有另一列说'b'然后我想得到该列的所有值,依此类推所有列。

我的代码给了我明智的价值。首先,它将从第一行检索数据,然后从第二行检索数据,依此类推。我的代码如下。

while (rs.next()) {
 for(inti=1;i<=rsMetaData.getColumnCount();i++) {
 System.out.println(rs.getString(i)); 
}
 }

请建议如何获取第一列的所有值,然后获取第二列,依此类推。

3 个答案:

答案 0 :(得分:1)

明智地迭代数据行并转换为列方式。像这样:

        ResultSet rs = con.createStatement().executeQuery("SELECT * FROM table");
        ResultSetMetaData rsMetaData = rs.getMetaData();
        Map<String, List<Object>> resultMap = new LinkedHashMap<>();
        while (rs.next()) {
            for(int i=1;i<=rsMetaData.getColumnCount();i++) {
                String strColumnName = rsMetaData.getColumnName(i);
                Object columnValue = rs.getObject(i);
                if(resultMap.containsKey(strColumnName)){
                    resultMap.get(strColumnName).add(columnValue);
                }else{
                    List<Object> resultList = new ArrayList<>();
                    resultList.add(columnValue);
                    resultMap.put(strColumnName,resultList);
                }
            }
        }
        // Iterate Data Column Wise
        for(Iterator<Map.Entry<String, List<Object>>> iterator = resultMap.entrySet().iterator();iterator.hasNext();){
            Map.Entry<String, List<Object>> entry = iterator.next();
            System.out.println("Column Name: "+entry.getKey());
            System.out.println("Column Values: "+entry.getValue());
        }

答案 1 :(得分:1)

更灵活的解决方案可能会使用HashMap而不是List。这样,您可以将列名存储为键,这使得检索值更容易,更透明。

//declare a HashMap

Map<String,Object> hMap = new HashMap<String,Object>();

    public void populateColumns(ResultSet rs) { 
            try{  
                    while(rs.next()){           
            for (int i=1;i<=rs.getMetaData().getColumnCount();i++) { 
                    Object obj=rs.getObject(i); //get the value for whatever column the result has   
                    hMap.put(rs.getMetaData().getColumnName(i), obj); 
                } }
            }catch (Exception e) { 
            //handle the exception
            } 
        } 

请注意,如果您想要对某些数据库类型/ Java类型进行特殊处理,则可以使用instanceof运算符。

for (int i=1;i<=rs.getMetaData().getColumnCount();i++) { 
            Object obj=rs.getObject(i); /
            if(obj instanceof String) //if obj is a String
                hMap.put(rs.getMetaData().getColumnName(i), new String(((String)obj).getBytes("UTF-8"),"UTF-8"));
            else //for every other objects
                hMap.put(rs.getMetaData().getColumnName(i), obj); 

更新:

要获得您想要的输出,请尝试使用

public void populateColumns(ResultSet rs) {
            List<Object> list = new ArrayList<Object>(); 
            int colCount;
            try{   
            while(rs.next()){
            colCount =  rs.getMetaData().getColumnCount();      
            for (int i=1;i<=colCount;i++) { 
                    Object obj=rs.getObject(i); //get the value for whatever column the result has   
                    list.add(obj); 
                } 
            }
            }catch (Exception e) { 
            //handle the exception
            } 

            //
            List<Object> sortedByCol = new ArrayList<Object>();

            for(int j=0; j<colCount;j++){
            for(int i=j; i<list.size(); i+=colCount){

            sortedByCol.add(list.get(i));
            }

        } 

输入

     col a    col b   col c

1 row   1         2       3
2 row   1         2       3

你的输出列表(sortedByCol)将有

1, 1, 2, 2, 3, 3

答案 2 :(得分:-1)

使用逗号分隔符ArraList

中每列的字符串值

喜欢的东西(抱歉不在电脑前)

ArrayList<String> columnValList = new ArrayList<>();
while (rs.next()) {
   for(inti=0;i<rsMetaData.getColumnCount();i++) {
       // get element for this col - create if doesnt exist
       String cols = columnValList.get (i);   // error checking needed
       cols = cols + "," + rs.getString (i + 1);
       // put it back
       columnValList.set (i, cols);
   }
}

之后你将得到包含第一列等所有值的元素(0)