У меня есть Java-проект, в котором PreparedStatements не используются ни в одном SQL-запросе. Теперь я хочу реализовать PreparedStatements для всех этих запросов. Вместо того, чтобы изменять каждый запрос, помещая "?" , Я хочу написать функцию, которая принимает строку запроса SQL, которая анализирует ее и возвращает карту значений различных предложений SQL.
public class SQLParser {
public static void main(String args[]) {
String sqlString = "select * from table t where columnA = 'hello' and columnB = 'hai'";
Map<Integer,String> values = new HashMap<>();
values = parseQuery(sqlString);
System.out.println(values); // prints { {1,'hello'} , {2,'hai'} }
}
private static Map<Integer,String> parseQuery(String sqlString) {
Map<Integer,String> values = new HashMap<>();
//
// ???? I want this function
//
return values;
}
}
Несколько примеров
sqlString: выберите * из таблицы t, где columnA = 'hello' AND columnB = 'hai'
вывод: {{1, 'hello'}, {2, 'hai'}}
sqlString: выберите * из таблицы t, где columnA IN ('hello', 'hai')
вывод: {{1, 'hello'}, {2, 'hai'}}
sqlString: выберите * из таблицы t, где столбец A> 17 И столбец B МЕЖДУ 10 И 20;
вывод: {{1, '17 '}, {2,' 10 '}, {3,' 20 '}}
По сути, он должен поддерживать все возможные предложения и их комбинации.
В любом случае, вы в основном спрашиваете, как написать синтаксический анализатор для SQL (какой диалект SQL, кстати?), Что, если вы спросите меня, кажется немалым подвигом. Я не уверен, что он подходит для ответа StackOverflow.
В любом случае вам придется изменить код для каждого запроса, использовать ли ваш анализатор / подготовитель волшебных операторов или использовать PreparedStatement напрямую. Не могли бы вы разработать этот волшебный анализатор / средство подготовки, а затем модифицировать каждый запрос для его использования за меньшее время, чем просто переписать каждый запрос как PreparedStatement? О скольких запросах идет речь?
Я думаю, вы здесь что-то упускаете. Смысл использования PreparedStatement - избегать SQL-инъекций. Но если вы сначала создадите свой SQL как строку из ваших параметров, инъекция может произойти в этот момент, и ваш синтаксический анализатор с радостью проанализирует вредоносный оператор SQL.




Правильный способ реализовать это будет создание парсера SQL. Это огромная задача. Если вы решите пойти этим путем, вы можете взглянуть на мой парсер (Scala), хотя он еще даже не близок к завершению.
Альтернативный подход - создать регулярное выражение для захвата всего литерала. Для этого нужен только сканер, что проще.
Если ключи вашей карты представляют собой инкрементные числа, разве списка будет недостаточно?