Cześć, zastanawiałem się, czy można wykonać coś takiego za pomocą JDBC, ponieważ obecnie zapewnia wyjątek, mimo że jest to możliwe w przeglądarce zapytań MySQL.
"SELECT FROM * TABLE;INSERT INTO TABLE;"
Chociaż zdaję sobie sprawę, że jest to możliwe w przypadku podzielenia ciągu zapytania SQL i dwukrotnego wykonania instrukcji, ale zastanawiałem się, czy jest do tego jednorazowe podejście.
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
.Odpowiedzi:
Zastanawiałem się, czy da się wykonać coś takiego za pomocą JDBC.
Tak to mozliwe. O ile wiem, istnieją dwa sposoby. Oni są
Poniższe przykłady pokazują powyższe dwie możliwości.
Przykład 1 : (aby zezwolić na wiele zapytań):
Wysyłając żądanie połączenia, musisz dołączyć właściwość połączenia
allowMultiQueries=true
do adresu URL bazy danych. Jest to dodatkowa właściwość Połączenie tych jeśli już istnieje niektóre, jakautoReConnect=true
itp .. Dopuszczalne wartości dlaallowMultiQueries
własności sątrue
,false
,yes
, ino
. Każda inna wartość jest odrzucana w czasie wykonywania z rozszerzeniemSQLException
.Jeśli taka instrukcja nie zostanie przyjęta,
SQLException
zostanie wyrzucony.Musisz użyć
execute( String sql )
lub innych jego wariantów, aby pobrać wyniki wykonania zapytania.Aby iterować i przetwarzać wyniki, potrzebujesz następujących kroków:
Przykład 2 : Kroki do wykonania:
select
iDML
zapytaniami.CallableStatement
.ResultSet
wykonanych w procedurze.Wyniki DML nie mogą zostać przechwycone, ale mogą wydać inny,
select
aby sprawdzić, jak wpływa to na wiersze w tabeli.
Przykładowa tabela i procedura :
Procedura wywołania z Java :
źródło
Możesz użyć aktualizacji wsadowej, ale zapytania muszą być zapytaniami działającymi (tj. Wstawiaj, aktualizuj i usuwaj)
źródło
Wskazówka: jeśli masz więcej niż jedną właściwość połączenia, oddziel je:
Aby dać ci coś takiego:
Mam nadzieję, że to komuś pomoże.
Pozdrowienia,
Glyn
źródło
Na podstawie moich testów prawidłowa flaga to „allowMultiQueries = true”
źródło
Dlaczego nie spróbujesz napisać
Stored Procedure
tego?Możesz
Result Set
wyjść i jednocześnieStored Procedure
możesz to,Insert
co chcesz.Jedyną rzeczą jest to, że możesz nie dostać nowo wstawionych wierszy w
Result Set
jeśliInsert
poSelect
.źródło
Myślę, że to najłatwiejszy sposób na multy wybór / aktualizację / wstawienie / usunięcie. Możesz uruchomić tyle aktualizacji / wstawień / usunięcia, ile chcesz po dokonaniu selekcji (musisz najpierw dokonać wyboru (jeśli to konieczne) za pomocą executeUpdate (str) (po prostu użyj new int (count1, count2, ...)) a jeśli potrzebujesz nowego wyboru, zamknij „instrukcję” i „połączenie” i utwórz nowy dla następnego wyboru. Na przykład:
Mam nadzieję, że to pomoże
źródło