2012-12-31 3 views
1

J'ai confondu avec StringBuilder en java. Mon code est ici:Comment ajouter une chaîne de gauche à droite et de droite à gauche à StringBuilder en Java

StringBuilder cmdB = new StringBuilder(
      "INSERT IGNORE INTO Query (context, category, generality, freshness, TokenCount, type) VALUES "); 
    for (int i = 0; i < querydata.size(); i++) { 

     if (i == 0) 
      cmdB.append("('"); 
     else 
      cmdB.append(",('"); 
     cmdB.append(querydata.get(i).getContext() + "'," 
       + querydata.get(i).getCategory() + "," 
       + querydata.get(i).getGenerality() + "," 
       + querydata.get(i).getFreshness() + "," 
       + querydata.get(i).getTokenCount() + "," 
       + querydata.get(i).getType()); 
     cmdB.append(")"); 
    } 
    cmdB.append(";"); 

J'ai base de données Mysql et que vous souhaitez créer chaîne insérer 1000 lignes. Le querydata.get (i) .getContext() renvoie String et contient l'anglais (left ro right) et le persan (de droite à gauche).

Lorsque mon querydata.get (i) .getContext() retourne "دانلود کرک بازی ghost recon" mon Stringbuilder l'ajoute incorporé. Mon résultat montre ci-dessous.

VALUES ('پخش زنده فوتبال', 2,1.0,0.0,2,1), ('عکسهای جشنواره فیلم فجر'

INSERT INTO IGNORE Query (contexte, la catégorie générale, la fraîcheur, TokenCount, type), 2, 1,0,0,0,2,1), ('نتایج لیگ برتر', 2,1,0,0,0,2,1), ('دانلود کرک بازی fantôme de reconnaissance', 2,1,0,0,0,2,1).

+0

Quelle erreur MySql obtenez-vous? –

Répondre

2

Il n'y a rien fait de mal avec le contenu de la chaîne en termes de ordre logique, pour autant que je peux voir, ce qui peut être source de confusion vous est la façon dont le texte bidirectionnel est rendu lorsque vous l'imprimez. Si vous faites glisser votre souris sur la chaîne, vous pouvez voir par la façon dont la sélection saute sur quelles séquences de texte sont rendus avec quelle directionnalité prédominante.

Si je sépare les ensembles de valeurs avec les nouvelles lignes que je reçois

INSERT IGNORE DANS requête (contexte, la catégorie, la généralité, la fraîcheur, TokenCount, type) VALEURS
('پخش زنده فوتبال', 2,1.0, 0.0,2,1),
('عکسهای جشنواره فیلم فجر', 2,1.0,0.0,2,1),
('نتایج لیگ برتر', 2,1.0,0.0,2,1),
('دانلود کرک بازی fantôme de reconnaissance', 2,1.0,0.0,2,1).

Je ne suis pas sûr de ce que vous voyez dans votre navigateur, mais dans le mien, il y a le traitement de la ligne INSERT INTO ... VALUES GàD, puis les lignes suivantes jusqu'à, mais non y compris celui contenant ghost recon comme principalement RTL. Voici la même chaîne avec des marqueurs Unicode gauche-à-droite (U+200E) insérés autour des parties de script Persique, pour forcer les citations et les parenthèses environnantes à être traitées comme LTR:

INSERT IGNORE INTO Requête (contexte, catégorie, généralité , la fraîcheur, TokenCount, type) VALEURS
('& # x200e; پخش زنده فوتبال & # x200e;', 2,1.0,0.0,2,1),
('& # x200e; عکسهای جشنواره فیلم فجر & # x200e; '2,1.0,0.0,2,1),
('& # x200e; نتایج لیگ برتر & # x200e;', 2,1.0,0.0,2,1),
(' & # x200e; دانلود کرک بازی & # x200e; ghost recon ', 2,1.0,0.0,2,1).

En d'autres termes - ne vous inquiétez pas, la base de données contiendra la bonne chose.

Mais je suis d'accord aussi avec this answer que vous devriez envisager d'utiliser PreparedStatement au lieu de construire SQL avec un StringBuilder, pour se protéger contre les attaques par injection SQL (ou des erreurs obscures) dans le cas où l'un de vos chaînes de contexte contiennent des apostrophes (ce qui arrive plus souvent que pensez-vous).

1

Je ne suis pas sûr de ce que vous exactement poser votre question, mais vous devriez vraiment envisager d'utiliser un outil d'insertion par lots pour faire ces grands inserts. Ce sera mieux sur la mémoire, la vitesse et la sécurité. Consultez JdbcTemplate de SpringSource et c'est la méthode batchUpdate. Ci-dessous un des exemples simples tirés d'un seach google ...

public void insertBatch(final List<Customer> customers){ 
  
  String sql = "INSERT INTO CUSTOMER " + 
    "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)"; 
  
  getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() { 
  
    @Override 
    public void setValues(PreparedStatement ps, int i) throws SQLException { 
     Customer customer = customers.get(i); 
     ps.setLong(1, customer.getCustId()); 
     ps.setString(2, customer.getName()); 
     ps.setInt(3, customer.getAge()); 
    } 
  
    @Override 
    public int getBatchSize() { 
     return customers.size(); 
    } 
  }); 
} 
Questions connexes