SQL查询在while循环中不起作用 - JAVA
Posted
技术标签:
【中文标题】SQL查询在while循环中不起作用 - JAVA【英文标题】:SQL query doesn't work in while loop - JAVA 【发布时间】:2012-10-06 14:13:00 【问题描述】:我在 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)
但是,对于 rs 结果集的第一行,它只进入 while 块 1 次。因此,它只为 1 个 adID 写入数据。 “intoQuery”不适用于所有 rs 结果集行。我该如何处理?
【问题讨论】:
永远不要像在代码中那样捕获异常并吞下它。如果发生异常,您永远不会知道出了什么问题。至少打印堆栈跟踪:catch (SQLException ex) ex.printStackTrace();
【参考方案1】:
那是因为你在 for 循环中又执行了一个查询,在你的 while 循环中:-
for (String distinctCounter : distincts)
// Create a new statement to execute query in while loop
Statement stmt1 = conn.createStatement();
stmt1.execute(intoQuery);
这将导致旧的result set
关闭。
看看:-ResultSet#close
文档,上面写着:-
ResultSet 对象被 Statement 对象自动关闭 当 Statement 对象关闭、重新执行时生成它, or 用于从多个序列中检索下一个结果 结果。
因此,文档清楚地表明使用相同语句重新执行新查询将关闭 ResultSet
对象。
因此,您需要使用不同的statement
实例来创建内部查询。
建议:-
理想情况下,您的上述代码会抛出一个 SQLException
(请参阅 ResultSet#next
),因为您在 catch
块中吞下了异常,因此您并不知道。
catch (SQLException ex)
永远不要使用empty
catch 块。它没有用,除了它可以防止您的程序在运行时停止。但这不会有任何好处。
【讨论】:
以上是关于SQL查询在while循环中不起作用 - JAVA的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 while 循环中的条件在 python 中不起作用?