/
ilyaBu
/
WebSpringJava
Обзор
Документация
Войти
/
ilyaBu
/
WebSpringJava
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/ru/gb/spring/diplomawebjavaspringgb/service/PGConnections.java
126 строк
8 KB
IliaBu
Update code
14 июл 2024, 09:59
14 июл 2024, 09:59
2267cd9
Код
Авторство
О чём код?
package ru.gb.spring.diplomawebjavaspringgb.service; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /** * Вспомогательный класс для выполнения операций с базой данных PostgreSQL. */ public class PGConnections { private final String url; private final String username; private final String password; public PGConnections(String url, String username, String password) { this.url = url; this.username = username; this.password = password; } /** * Метод устанавливает соединение с базой данных PostgreSQL, используя предоставленный URL-адрес, имя пользователя и пароль. * * @return объект {@link Connection}, представляющий установленное соединение с базой данных. * @throws RuntimeException Если класс драйвера PostgreSQL не найден или соединение не может быть установлено. */ public Connection getConnection() { try { Class.forName("org.postgresql.Driver"); return DriverManager.getConnection(url, username, password); } catch (SQLException | ClassNotFoundException e) { throw new RuntimeException("Класс не найден: " + e.getMessage()); } } /** * Метод копирует данные из {@link MultipartFile} в указанную таблицу в базе данных PostgreSQL. * Он использует команду PostgreSQL COPY для эффективной загрузки данных из файла в таблицу. * * @param connection объект {@link Connection}, представляющий установленное соединение с базой данных PostgreSQL. * @param tableName имя таблицы в базе данных, в которую будут скопированы данные. * @param file объект {@link MultipartFile}, содержащий данные CSV, которые необходимо загрузить в базу данных. * @throws RuntimeException если в процессе копирования возникает ошибка, например IOException или SQLException. */ public void copyToDB(Connection connection, String tableName, MultipartFile file) { try (InputStream inputStream = file.getInputStream()) { CopyManager copyManager = new CopyManager(connection.unwrap(BaseConnection.class)); copyManager.copyIn(String.format("COPY %s FROM STDIN DELIMITER ';' CSV HEADER", tableName), inputStream); } catch (IOException | SQLException e) { throw new RuntimeException("Не удалось сохранить данные CSV: " + e.getMessage()); } } /** * Метод очищает все записи в указанной таблице базы данных PostgreSQL. * * @param connection объект {@link Connection}, представляющий установленное соединение с базой данных PostgreSQL. * @param tableName имя таблицы в базе данных, в которой необходимо удалить все записи. * @throws RuntimeException если при удалении записей возникает исключение {@link SQLException}. */ public void truncateRecord(Connection connection, String tableName) { try { PreparedStatement preparedStatement = connection.prepareStatement(String.format("TRUNCATE %s;", tableName)); preparedStatement.executeUpdate(); } catch (SQLException e) { throw new RuntimeException("Не удалось удалить строки: " + e.getMessage()); } } /** * Метод создает новую таблицу PRICELIST, удаляет старую, выполняет объединение таблиц в базе данных PostgreSQL. * Использует SQL-запрос с LEFT OUTER JOIN для объединения таблиц price_list, codesdiscounts, ostatokskladmoskov, * ostatokskladcompany, dimensionsweight, discount и discount2. * * @param connection объект {@link Connection}, представляющий установленное соединение с базой данных PostgreSQL. * @throws RuntimeException если при объединении таблиц возникает исключение {@link SQLException}. */ public void mergeRecord(Connection connection) { try { PreparedStatement preparedStatement = connection.prepareStatement("DROP TABLE IF EXISTS PRICELIST;" + "CREATE TABLE IF NOT EXISTS PRICELIST AS " + "SELECT CASE WHEN coalesce(d.articul,'') = '' AND coalesce(a.articul,'') = '' THEN p.articul " + "WHEN coalesce(d.articul,'') <> '' AND coalesce(a.articul,'') = '' THEN CONCAT(p.articul, ' *') " + "WHEN coalesce(d.articul,'') = '' AND coalesce(a.articul,'') <> '' THEN CONCAT(p.articul, ' +') " + "WHEN coalesce(d.articul,'') <> '' AND coalesce(a.articul,'') <> '' THEN CONCAT(p.articul, ' *+') " + "ELSE p.articul " + "END AS articul, " + "p.naimenovanie AS naimenovanie, p.minparty AS minparty, " + "CASE WHEN coalesce(m.ostatok,'') = '' THEN '0' ELSE m.ostatok END AS ostatokm, " + "ROUND(CAST(REPLACE(p.zena,',','.') as decimal)*((100-CAST(REPLACE(c.discvor,',','.') as decimal))/100)::decimal,2) AS inputpricevor, " + "ROUND(CAST(REPLACE(p.zena,',','.') as decimal)*((100-CAST(REPLACE(c.discstk,',','.') as decimal))/100)::decimal,2) AS inputpricestock, " + "CASE WHEN r.naimenovanie LIKE '%VOR%' AND r.naimenovanie NOT LIKE '%VOR%' OR r.naimenovanie NOT LIKE '%STOCK%' THEN CAST(REPLACE(r.ostatok,',','.') as decimal) " + "ELSE 0 " + "END AS availabilitykompanyvor, " + "CASE WHEN r.naimenovanie LIKE '%STOCK%' THEN CAST(REPLACE(r.ostatok,',','.') as decimal) " + "ELSE 0 " + "END AS availabilitykompanystock, " + "CASE WHEN coalesce(g.length,'') = '' THEN 0 ELSE CAST(REPLACE(g.length,',','.') as decimal) END AS length, " + "CASE WHEN coalesce(g.width,'') = '' THEN 0 ELSE CAST(REPLACE(g.width,',','.') as decimal) END AS width, " + "CASE WHEN coalesce(g.height,'') = '' THEN 0 ELSE CAST(REPLACE(g.height,',','.') as decimal) END AS height, " + "CASE WHEN coalesce(g.weight,'') = '' THEN 0 ELSE CAST(REPLACE(g.weight,',','.') as decimal) END AS weight " + "FROM price_list p " + "LEFT OUTER JOIN codesdiscounts c ON p.kodeskidok = c.disccd " + "LEFT OUTER JOIN ostatokskladmoskov m ON p.articul = m.articul " + "LEFT OUTER JOIN ostatokskladcompany r ON p.articul = r.articul " + "LEFT OUTER JOIN dimensionsweight g ON p.articul = g.articul " + "LEFT OUTER JOIN discount d ON p.articul = d.articul " + "LEFT OUTER JOIN discount2 a ON p.articul = a.articul;"); preparedStatement.executeUpdate(); } catch (SQLException e) { throw new RuntimeException("Не удалось объединить таблицы: " + e.getMessage()); } } }