Hola, me preguntaba si es posible ejecutar algo como esto usando JDBC, ya que actualmente proporciona una excepción a pesar de que es posible en el navegador de consultas MySQL.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Si bien me doy cuenta de que es posible dividir la cadena de consulta SQL y ejecutar la declaración dos veces, me preguntaba si hay un enfoque único para esto.
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
.Respuestas:
Me preguntaba si es posible ejecutar algo como esto usando JDBC.
Sí, es posible. Hay dos formas, hasta donde yo sé. Son
Los siguientes ejemplos demuestran las dos posibilidades anteriores.
Ejemplo 1 : (para permitir múltiples consultas):
Al enviar una solicitud de conexión, debe agregar una propiedad de conexión
allowMultiQueries=true
a la URL de la base de datos. Esto es propiedad de conexión adicionales a los que ya existe, si algunos, comoautoReConnect=true
, etc .. Los valores aceptables paraallowMultiQueries
la propiedad sontrue
,false
,yes
, yno
. Cualquier otro valor se rechaza en tiempo de ejecución con unSQLException
.A menos que se apruebe tal instrucción,
SQLException
se lanza un.Debe usar
execute( String sql )
o sus otras variantes para obtener resultados de la ejecución de la consulta.Para iterar y procesar los resultados, necesita los siguientes pasos:
Ejemplo 2 : Pasos a seguir:
select
yDML
.CallableStatement
.ResultSet
electrónico ejecutados en el procedimiento.Los resultados de DML no se pueden capturar, pero pueden emitir otro
select
para averiguar cómo se ven afectadas las filas en la tabla.
Tabla de muestra y procedimiento :
Procedimiento de llamada desde Java :
fuente
Puede utilizar la actualización por lotes, pero las consultas deben ser consultas de acción (es decir, insertar, actualizar y eliminar)
fuente
Sugerencia: si tiene más de una propiedad de conexión, sepárelas con:
Para darte algo como:
Espero que esto ayude a alguien.
Saludos,
Glyn
fuente
Según mis pruebas, la marca correcta es "allowMultiQueries = true"
fuente
¿Por qué no intentas escribir una
Stored Procedure
para esto?Puedes sacar la
Result Set
salida y en la mismaStored Procedure
puedes hacerInsert
lo que quieras.Lo único es que es posible que no obtenga las filas recién insertadas en el
Result Set
siInsert
después delSelect
.fuente
Creo que esta es la forma más fácil de realizar múltiples selecciones / actualizar / insertar / eliminar. Puede ejecutar tantas actualizaciones / insertar / eliminar como desee después de la selección (primero debe hacer una selección (una ficticia si es necesario)) con executeUpdate (str) (solo use new int (count1, count2, ...)) y si necesita una nueva selección, cierre 'declaración' y 'conexión' y haga nuevas para la próxima selección. Como ejemplo:
Espero que ayude
fuente