В общем и целом для работы с 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)
Я думаю что такой вариант более прост и понятен:
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);
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Преобразовал Json String в Java объект с помощью objectMapperТеперь из массива Json не могу получить значение для Cod или dtBeg
Подчеркивает FindPreference, getSharedPreferencesНеобходимо перенести из активити во фрагмент, но не получается
Каким способом с помощью рефлексии можно вызвать метод по его названию из определенной области классов? Или из любого класса наследника...
Кто знает в чем проблема, вывожу данные на jsp страницу в таком виде <td><%=pListget(3)%></td> все хорошо отрабатывает, пытаюсь установить паттерн...