Как определить тип запроса sql для jdbcTemplate в JAVA? - PullRequest
0 голосов
/ 13 февраля 2019

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

Предположим, что мой SQL-запрос имеет тип вставки или обновления, тогда я выберу

String sql ="insert/update sql query";
jdbcTemplate.update(sql); 

jdbcTemplate, и если выбран тип моего sql-запроса, я выберу

String sql ="select sql query";
jdbcTemplate.query(sql);

jdbcTemplate.

Как эффективно определить тип SQL-запроса в Java?

Какой метод jdbcTemplate выбрать, если мой запрос содержит операторы update и select sql?например,

обновить набор таблиц column_name = "abc", где column_name в (выберите имя_ столбца из таблицы, где column_name = "xyz");

Обновление: На самом деле я принимаю sql-запросы от пользователей моего приложения из веб-формы, поэтому возникает реальная проблема, поскольку пользователь может отправлять любые типы SQL-запросов через форму, и я хочу выбрать конкретный метод jdbcTemplate в зависимости от типазапрос.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

в Oracle вы можете проанализировать запрос перед его выполнением

declare
    l_theCursor     integer default dbms_sql.open_cursor;
begin
    dbms_sql.parse(  l_theCursor,  'SELECT 1 FROM DUAL', dbms_sql.native );
end;

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

После синтаксического анализа оператора вы можете запросить v $ sql, чтобы узнать тип_команды:

select command_type, sql_text
from v$sql t
where sql_text = 'SELECT 1 FROM DUAL';

Различные типы command_typ выглядят так:

2 - ВСТАВИТЬ

3 - ВЫБРАТЬ

6 - ОБНОВИТЬ

7 - УДАЛИТЬ

189 - MERGE

полный список вы можете получить по select * from audit_actions order by action

Надеюсь, это поможет :)

0 голосов
/ 13 февраля 2019

Вы можете выполнить запрос SQL UPDATE с помощью метода .select (), а запрос SQL SELECT - с помощью метода .update ().

Так почему существуют 2 разных метода?

Метод update возвращает одно число;это число представляет количество измененных / созданных строк.

Метод select возвращает набор результатов, который похож на небольшую таблицу: в нем есть ряд (набранных и именованных) столбцов, и вы можете просмотреть набор результатовполучение значений строки каждый раз.

На практике выполнение оператора SELECT SQL с помощью .update () запустит select (и если этот select каким-либо образом записывает данные в БД, например, потому что вы запускаете SELECT).NEXTVAL ('someSequence'), эти эффекты действительно имеют место, но вы получаете 0 обратно, потому что он не изменил / не добавил ни одной строки в какие-либо таблицы. Если вы запускаете UPDATE SQL через .select (), обновления проходят, и выполучить обратно пустой набор результатов или, возможно, набор результатов с 1 столбцом некоторого числового типа и одной строкой, в которой одно значение этой строки равно количеству обновлений. Это зависит от драйвера JDBC.

Естьдругой метод (execute), который ничего не возвращает. То же самое применимо и здесь: если вы запускаете UPDATE с помощью этого метода, он все еще работает, вы просто не получитеupdatecount back.

Мой совет: используйте .select для всего этого и напишите хороший рендерер, который сообщает о результатах обратно пользователю.

Если вы хотите исследовать некоторый код, которыйвсе это уже сделано, посмотрите на консоль h2 .

0 голосов
/ 13 февраля 2019

Подзапросы SELECT не имеют значения для конечного результата.Таким образом, команда, первый глагол указывает на результат (int updateCount vs. ResultSet).

boolean isSqlSelect = sql.toUpperCase().startsWith("SELECT")
                   || sql.toUpperCase().startsWith("WITH");
...