欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java如何將ResultSet結(jié)果集遍歷到List中

 更新時間:2023年02月28日 09:40:51   作者:gblfy  
這篇文章主要介紹了Java如何將ResultSet結(jié)果集遍歷到List中問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

如何將ResultSet結(jié)果集遍歷到List中

今天在使用jstl標簽展示查詢結(jié)果時遇到一個小問題,即如何將ResultSet對象傳遞給前臺頁面。

在默認情況中我們在使用數(shù)據(jù)庫查詢時

public List selectDataFromJdbc() throws SQLException, ClassNotFoundException {

? ? ? ? Class.forName("oracle.jdbc.driver.OracleDriver"); //加載MYSQL JDBC驅(qū)動程序
? ? ? ? String url = "jdbc:oracle:thin:@192.168.x.222:1521:orcl";
? ? ? ? Connection conn = DriverManager.getConnection(url, "username", "passwd");
? ? ? ? Statement stat = conn.createStatement();
? ? ? ? String sql = "select u.user_id ,u.account,u.name from " + "sys_user u";
? ? ? ? ?// 格式: String sql = "select * from " + TableName where 1=1;
? ? ? ? ResultSet rs = stat.executeQuery(sql);
? ? ? ? List list = convertList(rs);
? ? ? ? stat.close();
? ? ? ? conn.close();
? ? ? ? return list;
? ? }

在正常情況下,我們是不能直接將 ResultSet 記錄集 rs 直接傳遞給前臺的,因為 ResultSet 不僅無法進行循環(huán)遍歷 (即只能每行遍歷,從0至end ,執(zhí)行一次),而且在實際應用中,它還必須被關(guān)閉。

當關(guān)閉后,rs為null ,結(jié)果不再存在。

在這時我們就需要將 ResultSet 對象進行遍歷到 list 中,代碼如下:

private static List convertList(ResultSet rs) throws SQLException {
? ? ? ? List list = new ArrayList();
? ? ? ? ResultSetMetaData md = rs.getMetaData();//獲取鍵名
? ? ? ? int columnCount = md.getColumnCount();//獲取行的數(shù)量
? ? ? ? while (rs.next()) {
? ? ? ? ? ? Map rowData = new HashMap();//聲明Map
? ? ? ? ? ? for (int i = 1; i <= columnCount; i++) {
? ? ? ? ? ? ? ? rowData.put(md.getColumnName(i), rs.getObject(i));//獲取鍵名及值
? ? ? ? ? ? }
? ? ? ? ? ? list.add(rowData);
? ? ? ? }
? ? ? ? return list;
? ? }

查看以上代碼,可以看出我們使用 Map 與 MetaDate 使 ResultSet 儲存到 list 中的,因為 list 只能存放元素的索引而不能存放元素的值,所以我們要用到 Map 。

使用這種方法的好處就是可以創(chuàng)建高復用性的代碼 ,因為我們不需要每次通過指定鍵名取值。

實際工作間接,與君共勉。

代碼

package com.example.demo.test;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
?*JAVA將ResultSet結(jié)果集遍歷到List中
?* @author gblfy
?* @date 2020-10-14
?*/
public class getColumnName {

? ? public static void main(String[] args) throws SQLException, ClassNotFoundException {
? ? ? ? getColumnName getColumnName = new getColumnName();
? ? ? ? List list = getColumnName.selectDataFromJdbc();
? ? ? ? for (Object o : list) {
? ? ? ? ? ? System.out.println("ddd:" + o);
? ? ? ? }

? ? }

? ? public List selectDataFromJdbc() throws SQLException, ClassNotFoundException {

? ? ? ? Class.forName("oracle.jdbc.driver.OracleDriver"); //加載MYSQL JDBC驅(qū)動程序
? ? ? ? String url = "jdbc:oracle:thin:@10.5.6.222:1521:lisdb";
? ? ? ? Connection conn = DriverManager.getConnection(url, "fisknow", "fisknow");
? ? ? ? Statement stat = conn.createStatement();
? ? ? ? String sql = "select u.user_id ,u.account,u.name from " + "sys_user u";
? ? ? ? // 格式: String sql = "select * from " + TableName where 1=1;
? ? ? ? ResultSet rs = stat.executeQuery(sql);
? ? ? ? List list = convertList(rs);
? ? ? ? stat.close();
? ? ? ? conn.close();
? ? ? ? return list;
? ? }

? ? private static List convertList(ResultSet rs) throws SQLException {
? ? ? ? List list = new ArrayList();
? ? ? ? ResultSetMetaData md = rs.getMetaData();//獲取鍵名
? ? ? ? int columnCount = md.getColumnCount();//獲取行的數(shù)量
? ? ? ? while (rs.next()) {
? ? ? ? ? ? Map rowData = new HashMap();//聲明Map
? ? ? ? ? ? for (int i = 1; i <= columnCount; i++) {
? ? ? ? ? ? ? ? rowData.put(md.getColumnName(i), rs.getObject(i));//獲取鍵名及值
? ? ? ? ? ? }
? ? ? ? ? ? list.add(rowData);
? ? ? ? }
? ? ? ? return list;
? ? }
}

使用泛型封裝結(jié)果集ResultSet遍歷成List集合

public  <T> List<T>  findModelListBySqlAndParam(String sql,List<Object> param,T t) throws Exception{
        //定義一個集合來存放需要轉(zhuǎn)成的對象集合
        List<T> list=new ArrayList<T>();
        //獲取當前類
        Class<?> c=t.getClass();//泛型的反射機制(?問號可寫可不寫)java.lang.reflect
        //遍歷結(jié)果集,封裝成外界用戶所需要的對象集合
        //1>獲取結(jié)果集
        ResultSet rs=executeQuery(sql, param);
        //2>開始遍歷
        while(rs.next()){
            //初始化對象
            @SuppressWarnings("unchecked")
            T obj= (T)c.newInstance();
            //獲取當前類一共多少個屬性啊
            Field[] fields=c.getDeclaredFields();
            for(Field f:fields){
                //獲取當前屬性的屬性名子
                String fname=f.getName();
                //獲取當前的屬性的類型(簡稱)  java.lang.String
                String type=f.getType().getSimpleName();

                //*****************  取出來當前屬性對應的數(shù)據(jù)庫的值了 ****************
                //在此方法名中要求類的屬性名和數(shù)據(jù)庫的字段名相同
                Object value=null;
                if(type.equalsIgnoreCase("string")){
                    value=rs.getString(fname);
                }else if(type.equalsIgnoreCase("int")){
                    value=rs.getInt(fname);
                }else if(type.equalsIgnoreCase("Integer")){
                    value=rs.getInt(fname);
                }else if(type.equalsIgnoreCase("Double")){
                    value=rs.getDouble(fname);
                }else if(type.equalsIgnoreCase("Float")){
                    value=rs.getFloat(fname);
                }else if(type.equalsIgnoreCase("date")){
                    value=rs.getDate(fname);
                }else if(type.equalsIgnoreCase("long")){
                    value=rs.getLong(fname);
                }
                //*****************  將取出來當前屬性的值設(shè)置給當前對象obj****************
                //1>獲取當前對象的所有set方法,并找到當前取出來的屬性對應的set方法
                Method[] methods=c.getDeclaredMethods();//獲取所有的方法
                for(Method m:methods){
                    //獲取當前方法名
                    String methodName=m.getName();
                    //判斷是不是當前屬性
                    if(methodName.equalsIgnoreCase("set"+fname)){
                        //執(zhí)行該方法
                        m.invoke(obj, value);
                    }
                }
            }
            list.add(obj);
        }
        return list;
    }

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot整合Redis的詳細教程分享

    Springboot整合Redis的詳細教程分享

    這篇文章主要為大家詳細介紹了如何利用SpringBoot整合Redis,文中的示例代碼講解詳細,具有很好的參考價值,希望對大家有所幫助
    2022-08-08
  • ZooKeeper入門教程一簡介與核心概念

    ZooKeeper入門教程一簡介與核心概念

    本文是ZooKeeper入門系列教程,涵蓋ZooKeeper核心內(nèi)容,通過實例和大量圖表,結(jié)合實戰(zhàn),幫助學習者理解和運用,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • 修改Android應用的樣式的一些關(guān)鍵點解析

    修改Android應用的樣式的一些關(guān)鍵點解析

    這篇文章主要介紹了修改Android應用的樣式的一些關(guān)鍵點,即對影響外觀的theme跟style的相關(guān)修改,需要的朋友可以參考下
    2015-12-12
  • 分布式面試分布式鎖實現(xiàn)及應用場景

    分布式面試分布式鎖實現(xiàn)及應用場景

    這篇文章主要為大家介紹了關(guān)于分布式的面試問題,分布式鎖的實現(xiàn)及應用不同場景下的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示

    Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示

    這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java實現(xiàn)兩人五子棋游戲(三) 畫出棋子

    Java實現(xiàn)兩人五子棋游戲(三) 畫出棋子

    這篇文章主要為大家詳細介紹了Java實現(xiàn)兩人五子棋游戲,畫出五子棋的棋子,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Mybatis-plus?代碼生成器?AutoGenerator?的簡介和使用詳解

    Mybatis-plus?代碼生成器?AutoGenerator?的簡介和使用詳解

    AutoGenerator是MyBatis-Plus的代碼生成器,通過AutoGenerator可以快速生成?Entity、Mapper、Mapper XML、Service、Controller等各個模塊的代碼,極大的提升了開發(fā)效率,這篇文章主要介紹了Mybatis-plus代碼生成器AutoGenerator的簡介和使用,需要的朋友可以參考下
    2023-05-05
  • Mybatis的parameterType造成線程阻塞問題分析

    Mybatis的parameterType造成線程阻塞問題分析

    這篇文章主要詳細分析了Mybatis的parameterType造成線程阻塞問題,文中有詳細的解決方法,及相關(guān)的代碼示例,具有一定的參考價值,感興趣的朋友可以借鑒閱讀
    2023-06-06
  • Java Maven高級之插件開發(fā)詳解

    Java Maven高級之插件開發(fā)詳解

    這篇文章主要介紹了Maven 插件開發(fā)的詳細整理的相關(guān)資料,需要的朋友可以看下,希望能夠給你帶來幫助
    2021-09-09
  • java file.renameTo返回false的原因及解決方案

    java file.renameTo返回false的原因及解決方案

    這篇文章主要介紹了java file.renameTo返回false的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論