Вопрос по mysql, sql, java – Несколько запросов выполняются в Java в одном выражении

83

Привет, мне было интересно, возможно ли выполнить что-то подобное с использованием JDBC, поскольку в настоящее время оно предоставляет исключение, даже если это возможно в браузере запросов MySQL.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Хотя я понимаю, что это возможно, если разделить строку SQL-запроса и выполнить оператор дважды, но мне было интересно, существует ли для этого одноразовый подход.

    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);
Возможный дубликат: Как выполнить составные SQL-запросы в Java? [1] [1]:stackoverflow.com/questions/6773393/… prayagupd
Привет, Рахул, для этого проекта я использую обычный старый объект подключения и знаешь, где я должен установить & quot; allowMultiQueries = true & quot ;. Добавили код объекта подключения в вопрос MilindaD
Есть свойство, которое вы должны установить в строке подключенияallowMultiQueries=true. Rahul
положить в хранимую процедуру, вызвать хранимую процедуру. означает, что вам также не нужно повторно развертывать код, когда вы хотите внести изменения. Chris

Ваш Ответ

6   ответов
10

правильный флаг - "allowMultiQueries = true"

122

I was wondering if it is possible to execute something like this using JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Да, это возможно. Насколько я знаю, есть два пути. Они есть

  1. By setting database connection property to allow multiple queries, separated by a semi-colon by default.
  2. By calling a stored procedure that returns cursors implicit.

Следующие примеры демонстрируют две вышеупомянутые возможности.

Example 1: (Чтобы разрешить несколько запросов):

При отправке запроса на подключение необходимо добавить свойство подключенияallowMultiQueries=true в базу данных URL. Это дополнительное свойство подключения к тем, если оно уже существует, напримерautoReConnect=trueи т. д. Допустимые значения дляallowMultiQueries собственностьtrue, false, yes, а такжеno, Любое другое значение отклоняется во время выполнения сSQLException.

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

Если такая инструкция не пройдена,SQLException брошен

Вы должны использоватьexecute( String sql ) или другие его варианты для получения результатов выполнения запроса.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

Для итерации и обработки результатов требуются следующие шаги:

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

Example 2Шаги, чтобы следовать:

  1. Create a procedure with one or more select, and DML queries.
  2. Call it from java using CallableStatement.
  3. You can capture multiple ResultSets executed in procedure.
    DML results can't be captured but can issue another select
    to find how the rows are affected in the table.

Sample table and procedure:

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)

Call Procedure from 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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
14

Подсказка: если у вас более одного свойства соединения, разделите их:

&

Чтобы дать вам что-то вроде:

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

Я надеюсь, что это помогает кому-то.

С Уважением,

Глин

26

Вы можете использовать Пакетное обновление, но запросы должны быть действиями (т.е. вставлять, обновлять и удалять).

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();
Error: User Rate Limit Exceeded
1

Я думаю, что это самый простой способ для многократного выбора / обновления / вставки / удаления. Вы можете запускать столько обновлений / вставок / удалений, сколько захотите, после выбора (вы должны сначала сделать выбор (фиктивный, если необходимо)) с executeUpdate (str) (просто используйте новый int (count1, count2, ...)) и если вам нужен новый выбор, закройте «заявление»; и «соединение»; и сделать новый для следующего выбора. Как пример:

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

Я надеюсь, что это помогает

Error: User Rate Limit Exceeded
2

Почему бы вам не попробовать написатьStored Procedure за это?

Вы можете получитьResult Set и в том жеStored Procedure вы можетеInsert то, что ты хочешь.

Единственное, что вы можете не получить вновь вставленные строки вResult Set если тыInsert послеSelect.

Error: User Rate Limit Exceeded

Похожие вопросы