Выбор между jdbcTemplate.update (String sql, Object [] args, int [] argTypes) и jdbcTemplate.update (String sql, Object [] args) - PullRequest
0 голосов
/ 11 января 2019

Я изучаю комбинацию Spring Boot и jdbcTemplate для некоторых основных операций crud и пытаюсь лучше понять, какой метод обновления мне выбрать.

Я понимаю, что следующие два классовых подхода (адаптированные из этого поста ) будут записывать одну и ту же запись в базу данных.

Пример 1:

public class InsertDemo {
private static final String sql =
        "INSERT INTO records (title, " +
        "    release_date, " +
        "    artist_id, " +
        "    label_id, " +
        "    created) " +
        "VALUES (?, ?, ?, ?, ?)";

private DataSource dataSource;

public InsertDemo(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void saveRecord(String title, Date releaseDate,
                       Integer artistId, Integer labelId) {
    JdbcTemplate template = new JdbcTemplate(this.dataSource);

    Object[] params = new Object[] {
            title, releaseDate, artistId, labelId, new Date()
    };
    int[] types = new int[] {
            Types.VARCHAR,
            Types.DATE,
            Types.INTEGER,
            Types.INTEGER,
            Types.DATE
    };

    int row = template.update(sql, params, types);
    System.out.println(row + " row inserted.");
}

Пример 2:

public class InsertDemo {
private static final String sql =
        "INSERT INTO records (title, " +
        "    release_date, " +
        "    artist_id, " +
        "    label_id, " +
        "    created) " +
        "VALUES (?, ?, ?, ?, ?)";

private DataSource dataSource;

public InsertDemo(DataSource dataSource) {
    this.dataSource = dataSource;
}

public void saveRecord(String title, Date releaseDate,
                       Integer artistId, Integer labelId) {
    JdbcTemplate template = new JdbcTemplate(this.dataSource);

    Object[] params = new Object[] {
            title, releaseDate, artistId, labelId, new Date()
    };

    int row = template.update(sql, params);
    System.out.println(row + " row inserted.");
}

но мне неясно, почему я должен / должен использовать первый, который определяет типы аргументов. Я прочитал javadoc , но я все еще не уверен, зачем мне нужно указывать типы. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Без Type параметра:

SQL SQL, содержащий параметры связывания аргументы аргументы для привязки к запросу (оставляя это PreparedStatement угадать соответствующий SQL тип); может также содержать объекты SqlParameterValue, которые указывают не только значение аргумента, но также тип SQL и, возможно, масштаб

С параметром Type:

SQL, содержащий параметры связывания, аргументы аргументов для привязки к запросу argTypes SQL-типы аргументов (константы из java.sql.Types)

0 голосов
/ 11 января 2019

Установка типа аргумента обеспечивает корректность и оптимизацию (незначительную) для базового оператора SQL. (JdbcTemplate внутренне создает PreparedStatement и устанавливает для него значения, используя предоставленные / производные типы).

В вашем примере, если вы не укажете массив Types, они будут установлены как SqlTypeValue.TYPE_UNKOWN, что в конечном итоге будет угадано или разрешено как;

if (sqlType == SqlTypeValue.TYPE_UNKNOWN || sqlType == Types.OTHER) {
            if (isStringValue(inValue.getClass())) {
                ps.setString(paramIndex, inValue.toString());
            }
            else if (isDateValue(inValue.getClass())) {
                ps.setTimestamp(paramIndex, new java.sql.Timestamp(((java.util.Date) inValue).getTime()));
            }
            else if (inValue instanceof Calendar) {
                Calendar cal = (Calendar) inValue;
                ps.setTimestamp(paramIndex, new java.sql.Timestamp(cal.getTime().getTime()), cal);
            }
            else {
                // Fall back to generic setObject call without SQL type specified.
                ps.setObject(paramIndex, inValue);
            }
        }

Взгляните на org.springframework.jdbc.core.StatementCreatorUtils#setValue

Так что хорошей практикой является установка типов arg.

...