您好,登錄后才能下訂單哦!
這篇文章運(yùn)用簡單易懂的例子給大家介紹java中如何使用ResultSet實(shí)現(xiàn)遍歷數(shù)據(jù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1.查找數(shù)據(jù)庫中表的列名
<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.查找數(shù)據(jù)庫中表中每條記錄的列值
for(int i=1;i<rs.getMetaData().getColumnCount();i++){ str+=rs.getString(i)+","; }
補(bǔ)充知識:Java:使用ResultSet.next()執(zhí)行含有rownum的SQL語句速度緩慢
在使用Oracle數(shù)據(jù)庫進(jìn)行分頁查詢時(shí),經(jīng)常會用到如下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); } } }
當(dāng)使用以上代碼時(shí),會發(fā)現(xiàn)當(dāng)取完最后一條記錄后,再執(zhí)行rs.next()時(shí),本來希望返回false后跳出循環(huán),但rs.next()會執(zhí)行非常長的時(shí)間。解決的方法是不讓rs.next()來判斷下一條記錄不存在,而在代碼通過計(jì)數(shù)來實(shí)現(xiàn):
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; } } } }
如果代碼中設(shè)置了fetchSize,并且fetchSize不能被count整除時(shí),在取最后一片數(shù)據(jù)時(shí),rs.next()也會執(zhí)行很長時(shí)間:
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); } } }
以上代碼中,當(dāng)取得9900條數(shù)據(jù)后,再取下一個(gè)300條時(shí),rs.next()就會執(zhí)行很長時(shí)間,可能是由于取不到一個(gè)完整的300條記錄造成的。解決方法是將fetchSize設(shè)置成能被count整除的數(shù)字,比如:
ps.setFetchSize(500);
在以上兩種狀況下,為什么rs.next()會執(zhí)行很長時(shí)間,還不是很清楚,但可以通過上述方式解決。至于為什么會有這個(gè)問題,有知道原因的朋友,請不吝賜教。
關(guān)于java中如何使用ResultSet實(shí)現(xiàn)遍歷數(shù)據(jù)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。