Создайте универсальный метод PreparedStatement, чтобы проверить, существует ли значение в таблице - PullRequest
0 голосов
/ 18 ноября 2018

Я хотел бы создать общий метод PreparedStatement.У меня есть несколько значений любого примитивного типа данных и определенный запрос (SELECT COUNT (1) FROM TABLE WHERE COLUMN =?) Или даже 2 или более значений с одним и тем же запросом (SELECT COUNT (1) FROM TABLE WHERE COLUMN =? ANDCOLUMN1 =?) Чтобы узнать, существует ли он, эти запросы могут быть даже из любого соединения / БД.

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

Examples:
Check if 1, does exist in SELECT COUNT(1) FROM TABLE1, in database1
Check if "Hey", does exist SELECT COUNT(1) FROM TABLE1 in database1
Check if "Hey" and 2, does exist SELECT COUNT(1) FROM TABLE2 in database1
Check if "TEST-001-TEST", does exist SELECT COUNT(1) FROM TABLE1 in database2

Or Basically:
Check if any primitive data type, and any number values does exist in an specific query, in any connection/DB using PreparedStatement
...

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я написал (конечно же, динамический) язык сценариев на Java, и он имеет функциональность SQL.Посмотрите на эти соответствующие фрагменты кода, чтобы узнать, помогут ли они вам:

https://github.com/EngineHub/CommandHelper/blob/master/src/main/java/com/laytonsmith/core/functions/SQL.java#L173 https://github.com/EngineHub/CommandHelper/blob/master/src/main/java/com/laytonsmith/core/functions/SQL.java#L312

Соответствующая информация в основном:

Длязнаю, сколько параметров, я считаю вопросительные знаки, хотя я, вероятно, должен использовать PreparedQuery.getParameterMetaData (). getParameterCount ().Если нет жестко закодированных строк, в которых есть вопросительные знаки, либо они должны работать, но использование метаданных параметра требует активного подключения к базе данных, что нежелательно в моем случае.Как только вы знаете, сколько должно быть параметров (используя любой метод), вы можете циклически повторять это число раз и использовать различные методы set * (i, value), где i - это число с 1 индексированным параметром.Вы можете получить много другой информации из PreparedQuery.getParameterMetaData (), включая требуемый тип для каждого параметра с помощью getParameterType ().Но использование метаданных параметра является решением вашей проблемы, и вы можете углубиться в это, чтобы найти, возможно, больше информации, которая вам нужна.

0 голосов
/ 18 ноября 2018

Во-первых, позвольте мне подчеркнуть, что я думаю, что вы должны использовать некоторые проверенные библиотеки для этого.Построение динамического 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 нет надежного способа.Я был бы счастлив, если бы кто-нибудь мог поправить меня в этом.

...