Как избавиться от многих заполнителей (вопросительные знаки) в выражениях Java SQL - PullRequest
0 голосов
/ 26 июня 2019

Я хочу вставить строку в таблицу, используя JDBC. Но таблица имеет большое количество столбцов, поэтому я не хочу указывать все из них в выражении. Есть ли другой способ указать значения столбца?

INSERT INTO TABLE_NAME VALUES(?, ?, ?, ..., ?)

Я надеюсь, что есть другой способ сделать это без большого количества заполнителей.

РЕДАКТИРОВАНИЕ:

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

P.S .: для некоторых забавных требований предприятия причин, по которым я не могу использовать каркасы JPA:)

1 Ответ

3 голосов
/ 26 июня 2019

EDIT

Другой вариант - написать свой или использовать SqlBuilder

SqlBuilder изменяет весь этот сценарий, заключая синтаксис SQL в очень легкий и простой в использовании Java-объект, который следует парадигме «строителя» (аналогично StringBuilder). Это превращает многие распространенные синтаксические ошибки SQL во время компиляции Java! Давайте рассмотрим несколько быстрых примеров, чтобы увидеть, как все это работает.

Вы можете использовать Springd NamedParameterJdbcTemplate и использовать имена переменных

String SQL = INSERT INTO TABLE_NAME VALUES((:id),...);

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("id", "idValue");
//...
namedParameterJdbcTemplate.update(SQL, parameters) > 0;

Шаблонный класс с базовым набором операций JDBC, позволяющий использовать именованные параметры вместо традиционных '?' заполнители.

Если вы можете (безопасно) использовать динамический запрос , используя Statement:

Statement stmt = (Statement) con.createStatement(“SELECT username, password FROM users WHERE username='” + user + “‘ AND password='” + pass + “‘ limit 0,1”);

ResultSet rs = stmt.executeQuery();

Вы можете использовать его только для закрытых значений, поэтому для SQL-инъекций не будет возможности

...