java中ResultSet遍历数据操作

作者:liuyunshengsir 时间:2022-06-13 05:02:13 

1.查找数据库中表的列名


<pre name="code" class="html">String sql = "select *from tblmetadatainfo";
ResultSet rs = MySqlHelper.executeQuery(sql, null);
String str="";
try {
 ResultSetMetaData rsmd = rs.getMetaData();
 for (int i = 1; i < rsmd.getColumnCount(); i++) {
 str+=rsmd.getColumnName(i)+",";
 }
 str=str.substring(0, str.length()-1);
} catch (SQLException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}

2.查找数据库中表中每条记录的列值


for(int i=1;i<rs.getMetaData().getColumnCount();i++){
  str+=rs.getString(i)+",";
 }

补充知识:Java:使用ResultSet.next()执行含有rownum的SQL语句速度缓慢

在使用Oracle数据库进行分页查询时,经常会用到如下SQL:

select tm.* from (select rownum rm, t.* xmlrecord from testtable t) tm where tm.rm > ? and tm.rm <= ?

使用的java代码如下:


int startIdx = 0;
int endIdx = 10000;
String sql = "select tm.* from (select rownum rm, t.* xmlrecord from testtable t) tm where tm.rm > ? and tm.rm <= ?";

try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql);) {

ps.setInt(1, startIdx);
ps.setInt(2, endIdx);

try (ResultSet rs = ps.executeQuery();) {
while (rs.next()) {
 String id = rs.getString(2);

System.out.println("id="+id);
}
}
}

当使用以上代码时,会发现当取完最后一条记录后,再执行rs.next()时,本来希望返回false后跳出循环,但rs.next()会执行非常长的时间。解决的方法是不让rs.next()来判断下一条记录不存在,而在代码通过计数来实现:


int startIdx = 0;
int endIdx = 10000;
int i = 0;
int count = endIdx - startIdx;
String sql = "select tm.* from (select rownum rm, t.* xmlrecord from testtable t) tm where tm.rm > ? and tm.rm <= ?";

try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql);) {

ps.setInt(1, startIdx);
ps.setInt(2, endIdx);

try (ResultSet rs = ps.executeQuery();) {
 while (rs.next()) {
 i++;
 String id = rs.getString(2);
 System.out.println("id="+id);
  if(i == count) {
  break;
 }
}
}
}

如果代码中设置了fetchSize,并且fetchSize不能被count整除时,在取最后一片数据时,rs.next()也会执行很长时间:


int startIdx = 0;
int endIdx = 10000;
String sql = "select tm.* from (select rownum rm, t.* xmlrecord from testtable t) tm where tm.rm > ? and tm.rm <= ?";

try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql);) {
ps.setFetchSize(300);
ps.setInt(1, startIdx);
ps.setInt(2, endIdx);

try (ResultSet rs = ps.executeQuery();) {

while (rs.next()) {
 String id = rs.getString(2);

System.out.println("id="+id);
}
}
}

以上代码中,当取得9900条数据后,再取下一个300条时,rs.next()就会执行很长时间,可能是由于取不到一个完整的300条记录造成的。解决方法是将fetchSize设置成能被count整除的数字,比如:

ps.setFetchSize(500);

在以上两种状况下,为什么rs.next()会执行很长时间,还不是很清楚,但可以通过上述方式解决。至于为什么会有这个问题,有知道原因的朋友,请不吝赐教。

来源:https://blog.csdn.net/liuyunshengsir/article/details/50618494

标签:java,ResultSet,遍历,数据
0
投稿

猜你喜欢

  • Java递归来实现汉诺塔游戏,注释详细

    2023-07-05 10:33:52
  • 详解Java的Struts框架中栈值和OGNL的使用

    2022-11-03 01:38:04
  • Spring超详细讲解IOC与解耦合

    2023-06-16 12:32:50
  • Springboot项目引入druid安装部署使用教程

    2023-07-28 01:39:25
  • 在Java中避免NullPointerException的解决方案

    2023-10-17 04:47:00
  • @valid 无法触发BindingResult的解决

    2023-08-10 09:16:12
  • 入门JDK集合之HashMap解析

    2023-11-24 02:45:03
  • Java实现线程同步方法及原理详解

    2021-07-29 21:28:13
  • 事务在c#中的使用

    2021-11-27 23:30:29
  • java自动生成ID号的方法

    2023-11-18 11:17:56
  • SpringBoot+JPA 分页查询指定列并返回指定实体方式

    2021-08-26 11:54:57
  • 微信开发--自定义菜单查询返码乱码的解决方法

    2023-11-25 04:47:55
  • 关于SpringCloudStream配置问题

    2023-08-08 20:12:00
  • 带大家认识Java语法之泛型与通配符

    2021-06-04 06:14:46
  • JDK1.8中ArrayList是如何扩容的

    2023-01-20 19:04:47
  • SpringMVC上传文件的两种方法

    2023-11-17 14:27:20
  • 详解SpringBoot定制@ResponseBody注解返回的Json格式

    2023-07-26 13:47:02
  • Mapper批量插入Oracle数据@InsertProvider注解

    2023-02-11 15:13:40
  • 用命令行编译java并生成可执行的jar包方法

    2023-01-15 23:21:35
  • Spring JDK动态 代理实现过程详解

    2023-11-16 19:42:15
  • asp之家 软件编程 m.aspxhome.com