Frage Mehrere Abfragen, die in Java in einer einzelnen Anweisung ausgeführt werden


Hi Ich frage mich, ob es möglich ist, etwas wie das mit JDBC auszuführen, da es derzeit eine Ausnahme bietet, obwohl es im MySQL-Abfrage-Browser möglich ist.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Während ich merke, dass es möglich ist, dass die SQL-Abfragezeichenfolge aufgeteilt und die Anweisung zweimal ausgeführt wird, habe ich mich gefragt, ob es einen einmaligen Ansatz dafür gibt.

    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);

76
2018-05-29 10:58


Ursprung


Antworten:


Ich habe mich gefragt, ob es möglich ist, so etwas mit JDBC auszuführen.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Ja, es ist möglich. Es gibt zwei Möglichkeiten, soweit ich weiß. Sie sind

  1. Durch Festlegen der Datenbankverbindungseigenschaft, um mehrere Abfragen zuzulassen, standardmäßig durch ein Semikolon getrennt.
  2. Durch Aufrufen einer gespeicherten Prozedur, die Cursor implizit zurückgibt.

Die folgenden Beispiele zeigen die obigen zwei Möglichkeiten.

Beispiel 1: (Um mehrere Abfragen zu ermöglichen):

Beim Senden einer Verbindungsanforderung müssen Sie eine Verbindungseigenschaft anhängen allowMultiQueries=true zur Datenbank-URL. Dies ist eine zusätzliche Verbindungseigenschaft zu denen, wenn bereits einige vorhanden sind, wie autoReConnect=true, etc .. Akzeptable Werte für allowMultiQueries Eigentum sind true, false, yes, und no. Jeder andere Wert wird zur Laufzeit mit einem abgelehnt SQLException.

String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";  

Sofern eine solche Anweisung nicht bestanden wird, a SQLException ist geworfen.

Sie müssen verwenden execute( String sql ) oder seine anderen Varianten, um Ergebnisse der Abfrageausführung zu holen.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Um die Ergebnisse zu durchlaufen und zu bearbeiten, benötigen Sie folgende Schritte:

READING_QUERY_RESULTS: // label  
    while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) {  
        if ( hasMoreResultSets ) {  
            Resultset rs = stmt.getResultSet();
            // handle your rs here
        } // if has rs
        else { // if ddl/dml/...
            int queryResult = stmt.getUpdateCount();  
            if ( queryResult == -1 ) { // no more queries processed  
                break READING_QUERY_RESULTS;  
            } // no more queries processed  
            // handle success, failure, generated keys, etc here
        } // if ddl/dml/...

        // check to continue in the loop  
        hasMoreResultSets = stmt.getMoreResults();  
    } // while results

Beispiel 2: Schritte zum folgen:

  1. Erstellen Sie eine Prozedur mit einem oder mehreren select, und DML Abfragen.
  2. Nennen Sie es von Java mit CallableStatement.
  3. Sie können mehrere Aufnahmen machen ResultSets in Prozedur ausgeführt.
    DML-Ergebnisse können nicht erfasst werden, können jedoch eine andere ausgeben select
    um herauszufinden, wie die Zeilen in der Tabelle betroffen sind.

Beispieltabelle und Prozedur:

mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) );
Query OK, 0 rows affected (0.16 sec)

mysql> delimiter //
mysql> create procedure multi_query()
    -> begin
    ->  select count(*) as name_count from tbl_mq;
    ->  insert into tbl_mq( names ) values ( 'ravi' );
    ->  select last_insert_id();
    ->  select * from tbl_mq;
    -> end;
    -> //
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
mysql> call multi_query();
+------------+
| name_count |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

+---+------+
| i | name |
+---+------+
| 1 | ravi |
+---+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Aufruf Prozedur von Java:

CallableStatement cstmt = con.prepareCall( "call multi_query()" );  
boolean hasMoreResultSets = cstmt.execute();  
READING_QUERY_RESULTS:  
    while ( hasMoreResultSets ) {  
        Resultset rs = stmt.getResultSet();
        // handle your rs here
    } // while has more rs

108
2018-05-29 18:33



Sie können das Batch-Update verwenden, aber Abfragen müssen Aktionen (d. H. Einfügen, Aktualisieren und Löschen) von Abfragen sein

Statement s = c.createStatement();
String s1 = "update emp set name='abc' where salary=984";
String s2 = "insert into emp values ('Osama',1420)";  
s.addBatch(s1);
s.addBatch(s2);     
s.executeBatch();

22
2018-05-29 11:46



Tipp: Wenn Sie mehr als eine Verbindungseigenschaft haben, dann trennen Sie sie mit:

&

Um Ihnen etwas zu geben wie:

url="jdbc:mysql://localhost/glyndwr?autoReconnect=true&allowMultiQueries=true"

Ich hoffe, das hilft jemandem.

Grüße,

Glyn


12
2018-01-25 23:30



Basierend auf meinen Tests ist das richtige Flag "allowMultiQueries = true"


7
2017-11-08 07:18



Warum versuchst du nicht, einen zu schreiben? Stored Procedure dafür?

Du kannst das bekommen Result Set aus und in demselben Stored Procedure Sie können Insert was du willst.

Das einzige Problem ist, dass Sie die neu eingefügten Zeilen nicht in der Result Set wenn du Insert nach dem Select.


0
2018-05-29 11:04



Ich denke, das ist der einfachste Weg für multy selection / update / insert / delete. Sie können so viele update / insert / delete ausführen, wie Sie wollen, nachdem Sie ausgewählt haben (Sie müssen zuerst eine Auswahl treffen (ein Dummy wenn nötig)) mit executeUpdate (str) (benutzen Sie einfach new int (count1, count2, ...)) und wenn du eine neue Auswahl benötigst, schließe "Anweisung" und "Verbindung" und mache "Neu" für "Nächste". Beispiel:

String str1 = "select * from users";
String str9 = "INSERT INTO `port`(device_id, potition, port_type, di_p_pt) VALUE ('"+value1+"', '"+value2+"', '"+value3+"', '"+value4+"')";
String str2 = "Select port_id from port where device_id = '"+value1+"' and potition = '"+value2+"' and port_type = '"+value3+"' ";
try{  
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    theConnection=(Connection) DriverManager.getConnection(dbURL,dbuser,dbpassword);  
    theStatement = theConnection.prepareStatement(str1);
    ResultSet theResult = theStatement.executeQuery();
    int count8 = theStatement.executeUpdate(str9);
    theStatement.close();
    theConnection.close();
    theConnection=DriverManager.getConnection(dbURL,dbuser,dbpassword);
    theStatement = theConnection.prepareStatement(str2);
    theResult = theStatement.executeQuery();

    ArrayList<Port> portList = new ArrayList<Port>();
    while (theResult.next()) {
        Port port = new Port();
        port.setPort_id(theResult.getInt("port_id"));

        portList.add(port);
    }

Ich hoffe, es hilft


-1
2018-06-28 10:28