Java如何將ResultSet結(jié)果集遍歷到List中
如何將ResultSet結(jié)果集遍歷到List中
今天在使用jstl標(biāo)簽展示查詢結(jié)果時(shí)遇到一個(gè)小問(wèn)題,即如何將ResultSet對(duì)象傳遞給前臺(tái)頁(yè)面。
在默認(rèn)情況中我們?cè)谑褂脭?shù)據(jù)庫(kù)查詢時(shí)
public List selectDataFromJdbc() throws SQLException, ClassNotFoundException { ? ? ? ? Class.forName("oracle.jdbc.driver.OracleDriver"); //加載MYSQL JDBC驅(qū)動(dòng)程序 ? ? ? ? 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 直接傳遞給前臺(tái)的,因?yàn)?ResultSet 不僅無(wú)法進(jìn)行循環(huán)遍歷 (即只能每行遍歷,從0至end ,執(zhí)行一次),而且在實(shí)際應(yīng)用中,它還必須被關(guān)閉。
當(dāng)關(guān)閉后,rs為null ,結(jié)果不再存在。
在這時(shí)我們就需要將 ResultSet 對(duì)象進(jìn)行遍歷到 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 儲(chǔ)存到 list 中的,因?yàn)?list 只能存放元素的索引而不能存放元素的值,所以我們要用到 Map 。
使用這種方法的好處就是可以創(chuàng)建高復(fù)用性的代碼 ,因?yàn)槲覀儾恍枰看瓮ㄟ^(guò)指定鍵名取值。
實(shí)際工作間接,與君共勉。
代碼
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ū)動(dòng)程序 ? ? ? ? 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{ //定義一個(gè)集合來(lái)存放需要轉(zhuǎn)成的對(duì)象集合 List<T> list=new ArrayList<T>(); //獲取當(dāng)前類 Class<?> c=t.getClass();//泛型的反射機(jī)制(?問(wèn)號(hào)可寫(xiě)可不寫(xiě))java.lang.reflect //遍歷結(jié)果集,封裝成外界用戶所需要的對(duì)象集合 //1>獲取結(jié)果集 ResultSet rs=executeQuery(sql, param); //2>開(kāi)始遍歷 while(rs.next()){ //初始化對(duì)象 @SuppressWarnings("unchecked") T obj= (T)c.newInstance(); //獲取當(dāng)前類一共多少個(gè)屬性啊 Field[] fields=c.getDeclaredFields(); for(Field f:fields){ //獲取當(dāng)前屬性的屬性名子 String fname=f.getName(); //獲取當(dāng)前的屬性的類型(簡(jiǎn)稱) java.lang.String String type=f.getType().getSimpleName(); //***************** 取出來(lái)當(dāng)前屬性對(duì)應(yīng)的數(shù)據(jù)庫(kù)的值了 **************** //在此方法名中要求類的屬性名和數(shù)據(jù)庫(kù)的字段名相同 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); } //***************** 將取出來(lái)當(dāng)前屬性的值設(shè)置給當(dāng)前對(duì)象obj**************** //1>獲取當(dāng)前對(duì)象的所有set方法,并找到當(dāng)前取出來(lái)的屬性對(duì)應(yīng)的set方法 Method[] methods=c.getDeclaredMethods();//獲取所有的方法 for(Method m:methods){ //獲取當(dāng)前方法名 String methodName=m.getName(); //判斷是不是當(dāng)前屬性 if(methodName.equalsIgnoreCase("set"+fname)){ //執(zhí)行該方法 m.invoke(obj, value); } } } list.add(obj); } return list; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
修改Android應(yīng)用的樣式的一些關(guān)鍵點(diǎn)解析
這篇文章主要介紹了修改Android應(yīng)用的樣式的一些關(guān)鍵點(diǎn),即對(duì)影響外觀的theme跟style的相關(guān)修改,需要的朋友可以參考下2015-12-12分布式面試分布式鎖實(shí)現(xiàn)及應(yīng)用場(chǎng)景
這篇文章主要為大家介紹了關(guān)于分布式的面試問(wèn)題,分布式鎖的實(shí)現(xiàn)及應(yīng)用不同場(chǎng)景下的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java實(shí)現(xiàn)兩人五子棋游戲(三) 畫(huà)出棋子
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,畫(huà)出五子棋的棋子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Mybatis-plus?代碼生成器?AutoGenerator?的簡(jiǎn)介和使用詳解
AutoGenerator是MyBatis-Plus的代碼生成器,通過(guò)AutoGenerator可以快速生成?Entity、Mapper、Mapper XML、Service、Controller等各個(gè)模塊的代碼,極大的提升了開(kāi)發(fā)效率,這篇文章主要介紹了Mybatis-plus代碼生成器AutoGenerator的簡(jiǎn)介和使用,需要的朋友可以參考下2023-05-05Mybatis的parameterType造成線程阻塞問(wèn)題分析
這篇文章主要詳細(xì)分析了Mybatis的parameterType造成線程阻塞問(wèn)題,文中有詳細(xì)的解決方法,及相關(guān)的代碼示例,具有一定的參考價(jià)值,感興趣的朋友可以借鑒閱讀2023-06-06Java Maven高級(jí)之插件開(kāi)發(fā)詳解
這篇文章主要介紹了Maven 插件開(kāi)發(fā)的詳細(xì)整理的相關(guān)資料,需要的朋友可以看下,希望能夠給你帶來(lái)幫助2021-09-09java file.renameTo返回false的原因及解決方案
這篇文章主要介紹了java file.renameTo返回false的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07