Там, где я работаю, мы сделали несколько вещей, чтобы уменьшить SQL и уменьшить связанные с этим издержки использования SQL в Java. (Мы запускаем Java с MSSQL, MySQL и Oracle).
Самым полезным приемом является использование метода setObject в Java для привязки параметров. Это, в сочетании с Varargs, позволяет вам написать служебный метод для выполнения SQL:
DBUtil.execSQL(Connection con, String sql, Object... params)
Просто переберите параметры и используйте Statement.setObject (index, param [index-1]). Для нулей вы используете setNull (). Мы расширили эту концепцию для запросов с помощью метода getResultSet; обернутый объект ResultSet также закрывает свой оператор, упрощая управление ресурсами.
Чтобы уменьшить фактический написанный код SQL, у нас есть структура построения запросов, которая позволяет вам указать группу столбцов и их типы, а затем использовать это для автоматического указания критериев поиска и выходных столбцов. Мы можем легко указать объединения и критерии объединения, и это обрабатывает большинство обычных случаев. Преимущество состоит в том, что вы можете сгенерировать отчет примерно из 10 строк кода, включая различные параметры запроса, сортировку, группировку и т. Д. Код слишком сложен, чтобы включать его здесь.
Я также использовал таблицы Oracle ALL_TABLES и ALL_TAB_COLUMNS для генерации операторов SELECT; Еще один прием, который я использовал, - это использование ResultSetMetadata для анализа таблицы:
ResultSet rs = DBUtil.getResultSet(con, "SELECT * FROM " + someTable);
ResultSetMetaData rsm = rs.getMetaData();
boolean first = true;
for (int i = 1; i <= rsm.getColumnCount(); i++) {
String col = rsm.getColumnName(i).toUpperCase();
// do something with the column name
}
Это позволяет легко генерировать определенные виды утверждений; в этом случае у нас есть активная таблица и архивная таблица, и мы перемещаем записи из одной в другую. Не вступая в дискуссию об использовании архивной таблицы, написанный мной Java-код позволяет мне изменять две таблицы без необходимости изменения сценария архивации.
Еще один прием, который мы используем, - это использование констант для всех имен наших таблиц и столбцов. Это делает ввод SQL немного утомительным, но позволяет (помимо прочего) легко генерировать SQL для таблиц с похожей или идентичной конструкцией. Поскольку мы используем константы для определения имен столбцов, код фактически обеспечивает одинаковое имя идентичных столбцов. Использование констант также позволяет вам находить ссылки на определенный столбец, что позволяет вам исследовать другие операторы SQL, которые могут быть связаны с выполняемой вами работой. Это позволяет нам повторно использовать SQL из других модулей, вместо того, чтобы снова слепо переписывать тот же оператор снова.