Maison  >  Article  >  base de données  >  Pourquoi les instructions préparées sont-elles plus rapides que les instructions dans JDBC ? expliquer?

Pourquoi les instructions préparées sont-elles plus rapides que les instructions dans JDBC ? expliquer?

WBOY
WBOYavant
2023-08-26 17:57:06787parcourir

为什么 JDBC 中的准备语句比语句更快?解释?

Lors de l'exécution d'une instruction à l'aide d'un objet Statement, en particulier lors de l'insertion d'une instruction, chaque fois que la requête est exécutée, l'instruction entière est compilée et exécutée encore et encore, la seule différence entre les instructions étant la valeur de l'instruction. déclaration.

Cependant, les instructions préparées sont des instructions précompilées, c'est-à-dire que la requête est compilée et stockée dans la base de données, en utilisant des espaces réservés (?) au lieu de valeurs, et les valeurs de ces espaces réservés sont fournies ultérieurement.

Alors, évitez encore et encore les instructions de compilation et d’exécution inutiles.

Exemple

Supposons que nous ayons une table nommée Dataset dans la base de données qui contient colonnes mobile_brand et unit_sale, si nous voulons insérer des enregistrements dans cette table à l'aide d'un objet de déclaration, le code sera le suivant Représentation :

stmt.executeUpdate("insert into Dataset values('Iphone', 3000)");
stmt.executeUpdate("insert into Dataset values('Samsung', 4000)");
stmt.executeUpdate("insert into Dataset values('Nokia', 5000)");
stmt.executeUpdate("insert into Dataset values('Vivo', 1500)");
stmt.executeUpdate("insert into Dataset values('Oppo', 9000)");
stmt.executeUpdate("insert into Dataset values('MI', 6400)");
stmt.executeUpdate("insert into Dataset values('MotoG', 4360)");
stmt.executeUpdate("insert into Dataset values('Lenovo', 4100)");
stmt.executeUpdate("insert into Dataset values('RedMi', 4000)");
stmt.executeUpdate("insert into Dataset values('OnePlus', 6334)");

Pour chaque appel de méthode executeUpdate(), l'intégralité de l'instruction qu'elle contient est compilée et exécutée. Ici, si vous observez que seule la valeur de l'instruction est modifiée et que le reste de la requête est compilé inutilement.

Si vous écrivez une requête d'insertion à l'aide d'une instruction préparée pour insérer les mêmes données dans la même table, le code ressemblera à ceci :

PreparedStatement pstmt = con.prepareStatement("insert into Dataset values(?, ?)");

pstmt.setString(1, "Iphone");
pstmt.setInt(2, 3000);
pstmt.executeUpdate();

pstmt.setString(1, "Samsung");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "Nokia");
pstmt.setInt(2, 5000);
pstmt.executeUpdate();

pstmt.setString(1, "Vivo");
pstmt.setInt(2, 1500);
pstmt.executeUpdate();

pstmt.setString(1, "Oppo");
pstmt.setInt(2, 900);
pstmt.executeUpdate();

pstmt.setString(1, "MI");
pstmt.setInt(2, 6400);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "Lenovo");
pstmt.setInt(2, 4100);
pstmt.executeUpdate();

pstmt.setString(1, "RedMi");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "OnePlus");
pstmt.setInt(2, 6334);
pstmt.executeUpdate();

Ici, si vous observez que la requête d'insertion est préparée avec un espace réservé (?) et que la requête est compilé et stocké dans la base de données, et la valeur est ensuite transmise à l'aide de la méthode setter de l'interface PreparedStatement, évitant ainsi l'exécution inutile de l'instruction.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer