[SQL] 한 성명에서 자바 실행 여러 개의 쿼리
SQL한 성명에서 자바 실행 여러 개의 쿼리
현재는 MySQL의 쿼리 브라우저에서 가능하다하더라도 예외를 제공하기 때문에이 JDBC를 사용하여 뭔가를 실행할 수있는 경우 안녕하세요 궁금 해서요.
"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);
해결법
-
==============================
1.이 사용하는 JDBC 뭔가를 실행할 수 있는지 궁금했다.
이 사용하는 JDBC 뭔가를 실행할 수 있는지 궁금했다.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
네, 가능합니다. 두 가지 방법이 내가 아는 한,이 있습니다. 그들은
다음의 예는 위의 두 가지 가능성을 보여줍니다.
예 1 : (여러 쿼리를 허용하려면) :
연결 요청을 보내는 동안, 당신은 데이터베이스 URL로 연결 속성 allowMultiQueries = TRUE를 추가해야합니다. 이미 네, autoReConnect = 사실, allowMultiQueries 속성 등 사용할 수있는 값이 거짓 사실처럼, 어떤 존재, 어떤 경우에 사람들에게 추가 연결 속성입니다. 다른 값은 SQLException을 가진 런타임에 거부됩니다.
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
이러한 명령이 전달되지 않는 한, SQLException가 throw됩니다.
당신은 쿼리 실행의 결과를 가져 오기 위해 실행 (문자열 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
예 2 : 단계 따르십시오 :
샘플 테이블과 절차 :
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)
자바에서 프로 시저를 호출 :
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
-
==============================
2.당신은 일괄 업데이트를 사용할 수 있지만 쿼리 (즉. 삽입, 업데이트 및 삭제) 쿼리 작업을해야합니다
당신은 일괄 업데이트를 사용할 수 있지만 쿼리 (즉. 삽입, 업데이트 및 삭제) 쿼리 작업을해야합니다
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();
-
==============================
3.힌트 : 둘 이상의 연결 속성이 경우로 구분합니다 :
힌트 : 둘 이상의 연결 속성이 경우로 구분합니다 :
&
당신에게 뭔가를 제공합니다 :
url="jdbc:mysql://localhost/glyndwr?autoReconnect=true&allowMultiQueries=true"
나는이 어떤 사람 도움이되기를 바랍니다.
문안 인사,
글린
-
==============================
4.내 테스트를 기반으로 올바른 플래그는 "allowMultiQueries = 참"
내 테스트를 기반으로 올바른 플래그는 "allowMultiQueries = 참"
-
==============================
5.왜 시도하고 이것에 대한 저장 프로 시저를 작성 해달라고?
왜 시도하고 이것에 대한 저장 프로 시저를 작성 해달라고?
당신은 밖으로 설정 결과를 얻을 수와 같은 저장 프로 시저에 당신은 당신이 원하는 것을 삽입 할 수 있습니다.
유일한 것은 당신이 선택 후 삽입 경우 결과 집합에 새로 삽입 된 행을 얻지 못할 수도있다.
-
==============================
6.나는이 삭제 엑셀 선택 / 갱신 / 삽입 / 가장 쉬운 방법이라고 생각합니다. 당신은 많은으로 실행할 수 있습니다 갱신 / 삽입 / 유 executeUpdate의 (STR)와 (당신은이 (더미가 필요한 경우) 먼저 선택해야 할) 선택 후 원하는 삭제 (단지 새로운 지능 (사용 COUNT1, COUNT2, ...)) u는 새로운 선택 가까운 '문'과 '연결'을 필요로하고 새로운 만들 경우 다음을 선택합니다. 예처럼 :
나는이 삭제 엑셀 선택 / 갱신 / 삽입 / 가장 쉬운 방법이라고 생각합니다. 당신은 많은으로 실행할 수 있습니다 갱신 / 삽입 / 유 executeUpdate의 (STR)와 (당신은이 (더미가 필요한 경우) 먼저 선택해야 할) 선택 후 원하는 삭제 (단지 새로운 지능 (사용 COUNT1, COUNT2, ...)) u는 새로운 선택 가까운 '문'과 '연결'을 필요로하고 새로운 만들 경우 다음을 선택합니다. 예처럼 :
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); }
나는 그것이 도움이되기를 바랍니다
from https://stackoverflow.com/questions/10797794/multiple-queries-executed-in-java-in-single-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 PostgreSQL의에서 many-to-many 관계를 구현하는 방법? (0) | 2020.03.09 |
---|---|
[SQL] 여러 열의 SQL MAX? (0) | 2020.03.09 |
[SQL] 어떻게 마지막으로 삽입 된 ID를 얻는 방법? (0) | 2020.03.09 |
[SQL] 의 특정 값에 대한 모든 필드에서 모든 테이블을 검색 (오라클) (0) | 2020.03.09 |
[SQL] MySQL의에 그렇지 않은 경우 (일명 "upsert"또는 "병합")을 삽입있는 경우 어떻게 업데이트하나요? (0) | 2020.03.09 |