Java怎么将ResultSet结果集遍历到List中
今天小编给大家分享一下Java怎么将ResultSet结果集遍历到List中的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
如何将ResultSet结果集遍历到List中
今天在使用jstl标签展示查询结果时遇到一个小问题,即如何将ResultSet对象传递给前台页面。
在默认情况中我们在使用数据库查询时
public List selectDataFromJdbc() throws SQLException, ClassNotFoundException { Class.forName("oracle.jdbc.driver.OracleDriver"); //加载MYSQL JDBC驱动程序 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 不仅无法进行循环遍历 (即只能每行遍历,从0至end ,执行一次),而且在实际应用中,它还必须被关闭。
当关闭后,rs为null ,结果不再存在。
在这时我们就需要将 ResultSet 对象进行遍历到 list 中,代码如下:
private static List convertList(ResultSet rs) throws SQLException { List list = new ArrayList(); ResultSetMetaData md = rs.getMetaData();//获取键名 int columnCount = md.getColumnCount();//获取行的数量 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 。
使用这种方法的好处就是可以创建高复用性的代码 ,因为我们不需要每次通过指定键名取值。
实际工作间接,与君共勉。
代码
package com.example.demo.test;import java.sql.*;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;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驱动程序 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();//获取行的数量 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; }}
使用泛型封装结果集ResultSet遍历成List集合
public <T> List<T> findModelListBySqlAndParam(String sql,List<Object> param,T t) throws Exception{ //定义一个集合来存放需要转成的对象集合 List<T> list=new ArrayList<T>(); //获取当前类 Class<?> c=t.getClass();//泛型的反射机制(?问号可写可不写)java.lang.reflect //遍历结果集,封装成外界用户所需要的对象集合 //1>获取结果集 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(); //***************** 取出来当前属性对应的数据库的值了 **************** //在此方法名中要求类的属性名和数据库的字段名相同 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); } //***************** 将取出来当前属性的值设置给当前对象obj**************** //1>获取当前对象的所有set方法,并找到当前取出来的属性对应的set方法 Method[] methods=c.getDeclaredMethods();//获取所有的方法 for(Method m:methods){ //获取当前方法名 String methodName=m.getName(); //判断是不是当前属性 if(methodName.equalsIgnoreCase("set"+fname)){ //执行该方法 m.invoke(obj, value); } } } list.add(obj); } return list; }
以上就是“Java怎么将ResultSet结果集遍历到List中”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341