Последствия моего варианта PreparedStatement

291
01 декабря 2017, 05:31

В общем и целом для работы с JDBC-mysql у меня есть только три типа данных:
Integer, String, Long

Я не любитель усложнять, но все-таки для удобства создал такой PreparedStatement:

private final int STR = 1, INT = 2, LONG = 3;
private class Param {
    private int type, valueInt;
    private long valueLong;
    private String valueString;
    private Param(int type, String valueString) {
        this.type = type;
        this.valueString = valueString;
    }
    private Param(int type, int valueInt) {
        this.type = type;
        this.valueInt = valueInt;
    }
    private Param(int type, long valueLong) {
        this.type = type;
        this.valueLong = valueLong;
    }
}
private PreparedStatement prepareStatement(Connection connection, String sql, Param... params) throws SQLException {
    PreparedStatement prst = connection.prepareStatement(sql);
    for (int i = 0; i < params.length; i++) {
        switch (params[i].type) {
            case STR: prst.setString(i + 1, params[i].valueString); break;
            case INT: prst.setInt(i + 1, params[i].valueInt); break;
            case LONG: prst.setLong(i + 1, params[i].valueLong); break;
        }
    }
    return prst;
}

Собственно делалось это для читаемого try-with-resourse:

try (PreparedStatement prst = prepareStatement(connection, "SELECT * FROM " + table + " WHERE id = ? AND age = ? AND time = ? LIMIT 1",
         new Param(STR, "value"),
         new Param(INT, 123),
         new Param(LONG, 123L));
     ResultSet rs = prst.executeQuery()) {
    //...
}

Тоесть здесь у меня все удобно все красиво...

А есть еще вот такой известный всем вариант:

private PreparedStatement prepareStatement(Connection connection, String sql, Object... params) throws SQLException {
    PreparedStatement prst = connection.prepareStatement(sql);
    for (int i = 0; i < params.length; i++) {
        prst.setObject(i + 1, params[i]);
    }
    return prst;
}

И собственно он еще удобнее и красивее:

try (PreparedStatement prst = prepareStatement(connection, "SELECT * FROM " + table + " WHERE id = ? AND age = ? AND time = ? LIMIT 1", "value", 123, 123L);
     ResultSet rs = prst.executeQuery()) {
    //...
}

Но тут нет того, что мне важно - четкости.
Да и определение типа данных это тоже накладные расходы.
Особенно если клиентов онлайн 1000+ и от каждого ежесекундно поступают запросы.

Вопрос: чем я рискую и рискую ли вообще в своей реализации используя класс Param ? Если есть вариант лучше, пожалуйста дайте пример.

UPD: Еще вот такой вариант Param:

private final int STR = 1, INT = 2, LONG = 3;
private class Param {
    private int type, valueInt;
    private long valueLong;
    private String valueString;
    private Param setString(String valueString) {
        this.type = STR;
        this.valueString = valueString;
        return this;
    }
    private Param setInt(int valueInt) {
        this.type = INT;
        this.valueInt = valueInt;
        return this;
    }
    private Param setLong(long valueLong) {
        this.type = LONG;
        this.valueLong = valueLong;
        return this;
    }
}
new Param(STR, value) vs new Param().setString(value)
Answer 1

Я думаю что такой вариант более прост и понятен:

public static void setParam(PreparedStatement prstmt, int parameterIndex, String value) throws SQLException {
    prstmt.setString(parameterIndex, value);
}
public static void setParam(PreparedStatement prstmt, int parameterIndex, int value) throws SQLException {
    prstmt.setInt(parameterIndex, value);
}
public static void setParam(PreparedStatement prstmt, int parameterIndex, long value) throws SQLException {
    prstmt.setLong(parameterIndex, value);
}
...
PreparedStatement preparedStatement = connection.prepareStatement(sql);
setParam(preparedStatement, 1, "StringValue");
setParam(preparedStatement, 2, 10);
setParam(preparedStatement, 2, 15L);
READ ALSO
Как выбрать одно значение из Json Array

Как выбрать одно значение из Json Array

Преобразовал Json String в Java объект с помощью objectMapperТеперь из массива Json не могу получить значение для Cod или dtBeg

255
проблема preference в fragment

проблема preference в fragment

Подчеркивает FindPreference, getSharedPreferencesНеобходимо перенести из активити во фрагмент, но не получается

218
Вызов метода с помощью рефлексии

Вызов метода с помощью рефлексии

Каким способом с помощью рефлексии можно вызвать метод по его названию из определенной области классов? Или из любого класса наследника...

256
Установка паттерна даты jstl

Установка паттерна даты jstl

Кто знает в чем проблема, вывожу данные на jsp страницу в таком виде <td><%=pListget(3)%></td> все хорошо отрабатывает, пытаюсь установить паттерн...

202