«SQL-блокнот» — web-приложение на Java + Spring Boot / MVC
В начале материала расскажу о возможностях программы, а в конце будет ссылка на репозиторий. Программа запускается везде, где есть JVM (Java Virtual Machine), имеет простой и понятный интерфейс.
1346просмотров
Итак, какую программу будем собирать? Ту, которая умеет:
Писать, хранить, редактировать SQL запросы;
Создавать подключения к различным СУБД;
Исполнять SQL запросы;
Выгружать результаты отработки запросов в Excel, обходя его ограничение в 1 млн строк (выборка автоматически разбивается по excel листам);
Разграничивать роли пользователей (пользователь/администратор);
Также программа имеет собственный механизм регистрации/авторизации, логирования действий пользователей;
Для примера я также приложил сервер СУБД Postgres, развернутый через Docker, чтобы описанная программа запускалась «из коробки».
Итак, стартовое окно авторизации/регистрации нового пользователя выглядит так:
Начальное окно с пунктами меню выглядит так:
С правами “ADMIN” можно увидеть список пользователей, редактировать их или удалить
Далее подробнее остановлюсь на каждом разделе меню и расскажу о его возможностях.
Пункт меню «Запрос». Здесь можно найти по наименованию «запрос» в списке запросов.
«Список запросов». Запросы, как я сказал ранее, можно редактировать. Возможно редактировать сам скрипт запроса, выгрузить его в Excel, найти в «Журнале» готовые выгрузки запроса. О «Журнале» расскажу далее.
Если в тексте SQL запроса присутствует макрос подстановки (@TMFL1), то в это место подставляется построчный текст, загруженный из txt-файла. Программа попросит загрузить файл:
«Журнал запросов». В Журнале хранятся исполненные запросы, и журнал также позволяет экспортировать готовый отчет Excel пользователю.
Возможен поиск готовых отчетов в журнале:
«Выгрузка пользователю». Когда отчет (файл Excel) сформирован в журнале появляется кнопка «Выгрузить».
Теперь перейдем к описанию некоторых частей кода программы.
Для работы c базами данных, системой доступа, REST API в pom.xml я использовал следующие зависимости.
Легко перейти на любую другую БД изменив настройки и добавив соответствующе драйвера (зависимости в pom).
В БД создаем необходимые таблицы.
Таблица для списка отчетов:
-- Create table
create table REPORTLIST
(
id NUMBER default "CURR_SCHEMA"."SEQ_REP".nextval not null,
namequery VARCHAR2(1000),
description VARCHAR2(2000),
repenabled NUMBER
)
Таблица для хранения SQL-запросов
-- Create table
create table REPORTSCRIPT
(
id NUMBER default "CURR_SCHEMA"."SEQ_SKRP".nextval not null,
script VARCHAR2(4000),
idreport NUMBER
)
Таблица для хранения журнала запросов.
-- Create table
create table LOGREPORT
(
id NUMBER default "CURR_SCHEMA"."SEQ_LOGREP".nextval not null,
datein DATE,
procname VARCHAR2(1000),
script VARCHAR2(4000),
nrowcount NUMBER,
logtext VARCHAR2(1000),
vusername VARCHAR2(100),
vfileout VARCHAR2(200),
nflagout NUMBER
)
Ниже приведу пример использования классов в приложении:
Для работы со списком отчетов – класс ReportsEntity:
Сервис для выгрузки отчетов в Excel. Для выгрузки данных в Excel написан отдельный класс с учетом формирования файлов с большим объемом данных. Для ограничения расхода памяти, при очень больших объёмах данных использую разбивку выгрузки по 2000+- записей (строка ((SXSSFSheet) sheet).flushRows(2000);).
@Service
public class ExportServiceImpl implements ExportService {
private static final Logger log = LoggerFactory.getLogger(ExportServiceImpl.class);
private final ResultSetToExcelLoc resultSetToExcelLoc;
private long countRow;
private String repositoryPath;
@Autowired
public ExportServiceImpl(ResultSetToExcelLoc resultSetToExcelLoc) {
this.resultSetToExcelLoc = resultSetToExcelLoc;
this.repositoryPath = this.resultSetToExcelLoc.getRepositoryPath();
}
@Override
public void exportExcelLoc(ResultSet rs, String filename) {
log.info("=Start execution of scheduled task");
try {
log.info("====start export excel====");
this.repositoryPath = this.resultSetToExcelLoc.getRepositoryPath();
log.info("==repositoryPath==" + this.repositoryPath);
resultSetToExcelLoc.setResultSet(rs);
//
resultSetToExcelLoc.writeIntoExcelSXSSFMulti(filename);
//count rows
countRow = resultSetToExcelLoc.getiRow();
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
log.error(e.getMessage(), e);
}
log.info("=Complete execution of scheduled task");
}
@Override
public long getCountRow() {
return countRow;
}
@Override
public String getRepositoryPath() {
return repositoryPath;
}
}
Логирование. Все логи собираются в log-файл (ежедневно в новый файл, название файла с датой). Файлы с логами хранятся на сервере в папке Logs.
логи в гите, кто-то не умеет в gitignore.
мапинги в котнроллере через жопу - кто-то не умеет в REST
пароли в конфиг файлах (zz#~n3wf) - кто-то не умеет в секурити
бизнес логика в контроллерах - кто-то не умеет в Spring
исрпользование spring.jpa.hibernate.ddl-auto - кто-то не умеет в миграции
Взгляд со стороны...
Какой-то непрофессиональный сленг и оценочное суждение не совсем понятно для чего.
Здесь же совершенно различные статьи размещают разрабы и не только, ориентированные на абсолютно разные скилзы и компетенции программёров.
Коллеги, если вам показалась эта статья не столь интересной или не столь информативной, пожалуйста, не смотрите.
Только не понимаю, зачем давать свою оценку, да еще используя негатив и ненормативную лексику, лишь ради того, чтобы просто дать.
Или у вас какие-то свои мотивы и обиды на всех во всём мире?!
логи в гите, кто-то не умеет в gitignore.
мапинги в котнроллере через жопу - кто-то не умеет в REST
пароли в конфиг файлах (zz#~n3wf) - кто-то не умеет в секурити
бизнес логика в контроллерах - кто-то не умеет в Spring
исрпользование spring.jpa.hibernate.ddl-auto - кто-то не умеет в миграции
Да тут наверное даже не в спринге дело
А вообще конечно "дорого быстро качественно" - выбирайте любые два пункта 🤣
Просто студент хотел codereview получить на халяву
Взгляд со стороны...
Какой-то непрофессиональный сленг и оценочное суждение не совсем понятно для чего.
Здесь же совершенно различные статьи размещают разрабы и не только, ориентированные на абсолютно разные скилзы и компетенции программёров.
Коллеги, если вам показалась эта статья не столь интересной или не столь информативной, пожалуйста, не смотрите.
Только не понимаю, зачем давать свою оценку, да еще используя негатив и ненормативную лексику, лишь ради того, чтобы просто дать.
Или у вас какие-то свои мотивы и обиды на всех во всём мире?!
Thread.sleep(100); еще из забавного
" я разместил его в GitHub" и ссылка на bitbucket =)