with values update index debug java mysql netbeans while-loop resultset

values - La consulta SQL no funciona en while loop-JAVA



mongodb transactions rollback (1)

He escrito un código en Java en NetBeans:

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) { } } } }

Pero, entra en el bloque de tiempo solo 1 vez para la primera fila de conjunto de resultados rs. Por lo tanto, escribe los datos solo para 1 adID. "intoQuery" no funciona para todos los rs Resultado Establecer filas. ¿Cómo puedo manejarlo?


Esto se debe a que ha ejecutado una consulta más en un bucle for, dentro de su ciclo while: -

for (String distinctCounter : distincts) { // Create a new statement to execute query in while loop Statement stmt1 = conn.createStatement(); stmt1.execute(intoQuery); }

Esto dará como resultado que el result set cierre.

Eche un vistazo a: - ResultSet#close documentation, que dice que: -

Un objeto ResultSet se cierra automáticamente por el objeto Statement que lo generó cuando ese objeto Statement se cierra, se vuelve a ejecutar o se utiliza para recuperar el siguiente resultado de una secuencia de resultados múltiples.

Entonces, la documentación dice claramente que volver a ejecutar una nueva consulta con la misma declaración cerrará el objeto ResultSet .

Por lo tanto, debe usar una instancia de statement diferente para crear una consulta interna.

Sugerencia : -

Idealmente, su código anterior arroja una SQLException (Ver ResultSet#next ) que no llegó a saber porque tragó la excepción en su bloque catch .

catch (SQLException ex) { }

Nunca use un bloque de captura empty . No sirve de nada, excepto que evita que su programa se detenga en el tiempo de ejecución. Pero no servirá de nada.