Я использую jdbcTemplate Spring Framework для получения списка записей из БД. Теперь я хочу добавить к нему фильтрацию, добавив ограничение к запросу.
Например, скажем, список представляет людей и показывает - имя, адрес электронной почты и местоположение
Оригинальный запрос
String sql = "SELECT name, email, location FROM persons WHERE status = ?";
в зависимости от фильтров, к нему будут добавлены ограничения
if(filters.containsKey("person_name")) {
sql += " AND name LIKE '%" + filters.get("person_name") + "%'";
}
//similarly
if(filters.containsKey("person_email")) {
....
}
//similarly
if(filters.containsKey("person_location")) {
....
}
Таким образом, запрос будет создан и выполнен путем передачи его методу запроса объекта jdbcTemplate
this.jdbcTemplate.query(sql, new Object[] { 1 }, RowMapper<Person> rowmapper)
Меня беспокоит то, что при использовании вышеуказанного метода он становится уязвимым для внедрения, поскольку значения, к которым применяются фильтры, напрямую записываются в запросе без какого-либо экранирования.
Можно ли динамически создавать второй параметр (массив arguments) так же, как построен запрос?
Есть ли альтернативный подход для этого с использованием jdbcTemplate?
Edit:
Теперь я использую StringEscapeUtils.escapeSql из org.apache.commons.lang.StringEscapeUtils для экранирования значений. Но все еще в поисках лучших методов или тех, которые уже предоставлены весной, если таковые имеются.
Спасибо