Salut, je me demandais s'il est possible d'exécuter quelque chose comme ça en utilisant JDBC car il fournit actuellement une exception même si c'est possible dans le navigateur de requêtes MySQL.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Bien que je réalise qu'il est possible de diviser la chaîne de requête SQL et d'exécuter l'instruction deux fois, je me demandais s'il existe une approche unique pour cela.
String url = "jdbc:mysql://localhost:3306/";
String dbName = "databaseinjection";
String driver = "com.mysql.jdbc.Driver";
String sqlUsername = "root";
String sqlPassword = "abc";
Class.forName(driver).newInstance();
connection = DriverManager.getConnection(url+dbName, sqlUsername, sqlPassword);
allowMultiQueries=true
.Réponses:
Je me demandais s'il était possible d'exécuter quelque chose comme ça en utilisant JDBC.
Oui c'est possible. Pour autant que je sache, il y a deux façons. Elles sont
Les exemples suivants illustrent les deux possibilités ci-dessus.
Exemple 1 : (Pour autoriser plusieurs requêtes):
Lors de l'envoi d'une demande de connexion, vous devez ajouter une propriété de connexion
allowMultiQueries=true
à l'URL de la base de données. C'est une propriété de connexion supplémentaire à ceux si existe déjà certains, commeautoReConnect=true
, etc .. Les valeurs acceptables pour laallowMultiQueries
propriété sonttrue
,false
,yes
etno
. Toute autre valeur est rejetée lors de l'exécution avec unSQLException
.À moins qu'une telle instruction ne soit passée, un
SQLException
est lancé.Vous devez utiliser
execute( String sql )
ou ses autres variantes pour récupérer les résultats de l'exécution de la requête.Pour parcourir et traiter les résultats, vous devez suivre les étapes suivantes:
Exemple 2 : étapes à suivre:
select
etDML
.CallableStatement
.ResultSet
s exécutés dans la procédure.Les résultats DML ne peuvent pas être capturés mais peuvent en émettre un autre
select
pour déterminer comment les lignes sont affectées dans le tableau.
Exemple de tableau et procédure :
Procédure d'appel depuis Java :
la source
Vous pouvez utiliser la mise à jour par lots, mais les requêtes doivent être des requêtes d'action (c'est-à-dire insérer, mettre à jour et supprimer)
la source
Conseil: si vous disposez de plusieurs propriétés de connexion, séparez-les par:
Pour vous donner quelque chose comme:
J'espère que ça aidera quelqu'un.
Cordialement,
Glyn
la source
D'après mes tests, l'indicateur correct est "allowMultiQueries = true"
la source
Pourquoi n'essayez-vous pas d'écrire un
Stored Procedure
pour cela?Vous pouvez
Result Set
sortir et dans le mêmeStored Procedure
vous pouvezInsert
ce que vous voulez.La seule chose est que vous n'obtiendrez peut-être pas les lignes nouvellement insérées dans le
Result Set
si vousInsert
après leSelect
.la source
Je pense que c'est le moyen le plus simple de sélectionner / mettre à jour / insérer / supprimer plusieurs fois. Vous pouvez exécuter autant de mise à jour / d'insertion / de suppression que vous le souhaitez après la sélection (vous devez d'abord effectuer une sélection (un mannequin si nécessaire)) avec executeUpdate (str) (utilisez simplement new int (count1, count2, ...)) et si vous avez besoin d'une nouvelle sélection, fermez «instruction» et «connexion» et faites-en une nouvelle pour la prochaine sélection. Comme exemple:
J'espère que ça aide
la source