Pertanyaan Beberapa kueri dieksekusi di java dalam satu pernyataan


Hai Aku bertanya-tanya apakah mungkin untuk mengeksekusi sesuatu seperti ini menggunakan JDBC karena saat ini memberikan pengecualian meskipun mungkin di browser query MySQL.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Sementara saya menyadari bahwa adalah mungkin dengan memiliki string query SQL terpecah dan pernyataan dieksekusi dua kali tetapi saya bertanya-tanya apakah ada pendekatan satu kali untuk ini.

    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


asal


Jawaban:


Saya bertanya-tanya apakah mungkin untuk mengeksekusi sesuatu seperti ini menggunakan JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Ya itu mungkin. Ada dua cara, sejauh yang saya tahu. Mereka

  1. Dengan menyetel properti koneksi basis data untuk memungkinkan beberapa kueri, dipisahkan oleh semi-kolon secara default.
  2. Dengan memanggil prosedur yang tersimpan yang mengembalikan cursor implisit.

Contoh berikut menunjukkan dua kemungkinan di atas.

Contoh 1: (Untuk memperbolehkan banyak pertanyaan):

Saat mengirim permintaan koneksi, Anda perlu menambahkan properti koneksi allowMultiQueries=true ke url basis data. Ini adalah properti koneksi tambahan untuk mereka jika sudah ada beberapa, seperti autoReConnect=true, dll. Nilai yang dapat diterima untuk allowMultiQueries properti adalah true, false, yes, dan no. Nilai lainnya ditolak saat runtime dengan SQLException.

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

Kecuali instruksi tersebut disahkan, sebuah SQLException dilemparkan.

Anda harus menggunakan execute( String sql ) atau varian lainnya untuk mengambil hasil dari eksekusi kueri.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Untuk mengulangi dan memproses hasil Anda memerlukan langkah-langkah berikut:

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

Contoh 2: Langkah-langkah untuk diikuti:

  1. Buat prosedur dengan satu atau lebih select, dan DML pertanyaan.
  2. Sebut saja dari java menggunakan CallableStatement.
  3. Anda dapat mengambil banyak ResultSetdijalankan dalam prosedur.
    Hasil DML tidak dapat ditangkap tetapi dapat mengeluarkan yang lain select
    untuk menemukan bagaimana baris terpengaruh dalam tabel.

Tabel dan prosedur sampel:

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)

Prosedur Panggilan dari Jawa:

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



Anda dapat menggunakan pembaruan Batch, tetapi kueri harus berupa tindakan (yaitu sisipkan, perbarui, dan hapus) kueri

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



Petunjuk: Jika Anda memiliki lebih dari satu properti koneksi, pisahkan dengan:

&

Untuk memberi Anda sesuatu seperti:

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

Saya harap ini membantu seseorang.

Salam,

Glyn


12
2018-01-25 23:30



Berdasarkan pengujian saya, bendera yang benar adalah "allowMultiQueries = true"


7
2017-11-08 07:18



Mengapa Anda tidak mencoba dan menulis Stored Procedure untuk ini?

Anda bisa mendapatkan Result Set keluar dan sama Stored Procedure kamu bisa Insert apa maumu.

Satu-satunya adalah Anda mungkin tidak mendapatkan baris yang baru dimasukkan di Result Set jika kamu Insert setelah Select.


0
2018-05-29 11:04



Saya rasa ini adalah cara termudah untuk multy selection / update / insert / delete. Anda dapat menjalankan sebanyak pembaruan / sisipkan / hapus seperti yang Anda inginkan setelah memilih (Anda harus membuat pilihan pertama (contoh jika diperlukan)) dengan executeUpdate (str) (cukup gunakan int baru (count1, count2, ...)) dan jika Anda memerlukan pilihan baru tutup 'pernyataan' dan 'koneksi' dan buat baru untuk pemilihan selanjutnya. Seperti contoh:

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

Saya harap itu membantu


-1
2018-06-28 10:28