Sal*_*zel 3 java mysql netbeans resultset while-loop
我在NetBeans上用Java编写了一个代码:
package helloworld;
import java.sql.*;
import java.io.*;
import java.lang.Object;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.functors.EqualPredicate;
import org.apache.lucene.queryParser.ParseException;
public class HelloWorld {
public static void main(String[] args) throws IOException, ParseException {
// TODO code application logic here
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:mysql://localhost:3306/kdd";
String user = "root";
String password = "Pass1234";
try {
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sqlQuery = "Select * from ad_contents";
rs = stmt.executeQuery(sqlQuery);
while (rs.next()) { //(rs.next())
int adID = rs.getInt(1);
String keywordTokens = rs.getString(2);
String titleTokens = rs.getString(3);
String descriptionTokens = rs.getString(4);
List<String> keywordList = Arrays.asList(keywordTokens.split("\\|", -1));
List<String> titleList = Arrays.asList(titleTokens.split("\\|", -1));
List<String> descriptionList = Arrays.asList(descriptionTokens.split("\\|", -1));
Set<String> distincts = new HashSet<String>();
distincts.addAll(keywordList);
distincts.addAll(titleList);
distincts.addAll(descriptionList);
int keywordHit = 0, titleHit = 0, descriptionHit = 0;
for (String distinctCounter : distincts) {
keywordHit = CollectionUtils.cardinality(distinctCounter, keywordList);
titleHit = CollectionUtils.cardinality(distinctCounter, titleList);
descriptionHit = CollectionUtils.cardinality(distinctCounter, descriptionList);
String intoQuery = "insert into ad_word_counts values (" + adID + "," + distinctCounter + "," + keywordHit + "," + titleHit + "," + descriptionHit + ")";
stmt.execute(intoQuery);
//node myNode= new node(adID, Integer.parseInt(distinctCounter) , keywordHit, titleHit, descriptionHit);
}
}
} catch (SQLException ex) {
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException ex) {
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,对于rs Result Set的第一行,它只进入while块一次.因此,它仅为1个adID写入数据."intoQuery"不适用于所有rs Result Set行.我怎么处理它?
那是因为你在while循环中的for循环中再执行了一次查询: -
for (String distinctCounter : distincts) {
// Create a new statement to execute query in while loop
Statement stmt1 = conn.createStatement();
stmt1.execute(intoQuery);
}
Run Code Online (Sandbox Code Playgroud)
这将导致旧result set
的关闭.
看看: - ResultSet#close
文档,其中说: -
当Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,Statement对象会自动关闭它生成它的Statement对象.
因此,文档清楚地表明,使用相同的语句重新执行新查询将关闭该ResultSet
对象.
因此,您需要使用其他statement
实例来创建内部查询.
建议: -
理想情况下,您的上述代码会抛出一个SQLException
(请参阅参考资料ResultSet#next
),因为您在catch
块中吞下了异常,因此您不必知道.
catch (SQLException ex) {
}
Run Code Online (Sandbox Code Playgroud)
切勿使用empty
挡块.它没用,除了它阻止你的程序在运行时停止.但它不会有任何好处.
归档时间: |
|
查看次数: |
2168 次 |
最近记录: |