Во-первых, позвольте мне подчеркнуть, что я думаю, что вы должны использовать некоторые проверенные библиотеки для этого.Построение динамического SQL рискованно, вы можете легко открыть себя для внедрения SQL, если строите SQL из предоставленных пользователем данных.
Ответ , на который ссылается Эллиот Фриш, содержит хорошие варианты.
Теперь то, что эти сборщики запросов делают изнутри, на самом деле строит строку SQL на основе данных, которые вы им предоставляете.Конечно, это можно сделать самостоятельно.По сути, вы создаете метод, который принимает имя таблицы, список имен столбцов и список значений.
Затем вы строите строку SQL
StringBuilder sql = new StringBuilder();
sql.Append("SELECT 1 FROM ");
sql.Append(QuoteTableName(tableName));
sql.Append(" WHERE ");
bool firstCol = true;
for(String col: columns) {
if(firstCol) {
firstCol = false;
} else {
sql.Append(" AND ");
}
sql.Append(QuoteColumnName(col));
sql.Append(" = ?");
}
Теперь вы можете создать подготовленныйутверждение и связать значения параметров.PreparedStatement.setObject
отлично работает в большинстве случаев для большинства примитивных значений.Если у вас возникнут проблемы с преобразованием типов, вы можете добавить отдельный параметр для SQLType
.
PreparedStatement stmt = connection.prepareStatement(sql.toString());
for(int i = 0; i < values.length; ++i) {
Object val = values[i];
stmt.setObject(i+1, val);
}
Сложная часть заключается в цитировании имен таблиц и столбцов.Это зависит от базы данных, и, насколько я понимаю, в JDBC нет надежного способа.Я был бы счастлив, если бы кто-нибудь мог поправить меня в этом.