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