Как выполнить файл SQL с помощью Java, используя потоки файлов и ввода-вывода?

управление данными с помощью моделей предметной области Java Программирование и разработка

Во многих случаях мы часто сталкиваемся с необходимостью выполнять команды SQL в базе данных с использованием JDBC для загрузки необработанных данных. Хотя поставщик базы данных предоставляет интерфейсы командной строки или графический интерфейс, иногда нам может потребоваться управлять выполнением команд базы данных с помощью внешнего программного обеспечения. В этой статье мы научимся выполнять SQL-файл, содержащий тысячи комментариев, всего за несколько секунд, не полагаясь на какую-либо внешнюю библиотеку или зависимость. Этот процесс требует лишь минимальных знаний о потоках ввода-вывода и подключении JDBC.

Понимание концепций

Прежде чем углубиться в статью, давайте ознакомимся с необходимыми понятиями:

  1. Имя класса: имя класса драйвера JDBC.
  2. URL-адрес подключения: URL-адрес для подключения к базе данных.
  3. Имя пользователя и пароль: учетные данные для подключения к базе данных.
  4. Файл SQL: файл, содержащий команды SQL без каких-либо синтаксических ошибок.
  5. Файл jar соединителя базы данных. Чтобы использовать JDBC, вам необходимо включить соответствующий файл jar соединителя базы данных в свой проект. Драйвер JDBC — это программный компонент, который позволяет приложениям Java взаимодействовать с базой данных.

Создание класса SQLExecutor

Чтобы эффективно выполнять команды SQL, мы создадим класс с именем «SQLExecutor», отвечающий за подключение к JDBC и выполнение файла SQL. Класс будет иметь три свойства экземпляра: URL-адрес, имя пользователя и пароль. При инициализации объекта будет загружен класс Driver, и любые ошибки во время этого процесса приведут к тому, что конструктор выдаст исключение «ClassNotFoundException».

Java

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.*;
public class SQLExecutor {
  
    private final String url;
    private final String userName;
    private final String password;
    public SQLExecutor(String className, String url, String userName, String password)
                  throws ClassNotFoundException {
        Class.forName(className);
        this.url = url;
        this.userName = userName;
        this.password = password;
    }
}

И этот класс содержит следующие методы.

1. Установление соединения:

Мы реализуем служебный метод getConnection, который возвращает новое соединение с базой данных, используя предоставленный URL-адрес, имя пользователя и пароль.

Читайте также:  Ключевое слово и позиционный аргумент в Python

Java

private Connection getConnection() throws SQLException {
    return DriverManager.getConnection(url, userName, password);
}

2. Печать метаданных:

Мы создадим еще один метод printMetaData для отображения метаданных о подключении к базе данных, таких как имя базы данных, версия базы данных, имя драйвера и версия.

Java

private void printMetaData(Connection connection)
    throws SQLException
{
    DatabaseMetaData metaData = connection.getMetaData();
    String format = "\nDatabase metadata\n"
                    + "Database name : %s\n"
                    + "Database version : %s\n"
                    + "Database driver name : %s\n"
                    + "Database driver version : %s\n\n";
    System.out.printf(format,
                      metaData.getDatabaseProductName(),
                      metaData.getDatabaseProductVersion(),
                      metaData.getDriverName(),
                      metaData.getDriverVersion());
}

3. Выполнение файла SQL:

Теперь перейдем к методу «executeFile». Этот метод принимает путь к файлу в качестве параметра и выполняет команды SQL, присутствующие в файле. Он создает буферизованное средство чтения для файла, устанавливает новое соединение с базой данных и получает оператор из этого соединения. он использует блок try with resources для автоматического закрытия ресурсов.

Java

public void executeFile(String path)
{
    try (FileReader reader = new FileReader(path);
         // Wrap the FileReader in a BufferedReader for
         // efficient reading.
         BufferedReader bufferedReader
         = new BufferedReader(reader);
         // Establish a connection to the database.
         Connection connection = getConnection();
         // Create a statement object to execute SQL
         // commands.
         Statement statement
         = connection.createStatement();) {
        printMetaData(connection);
        System.out.println("Executing commands at : "
                           + path);
        StringBuilder builder = new StringBuilder();
        String line;
        int lineNumber = 0;
        int count = 0;
        // Read lines from the SQL file until the end of the
        // file is reached.
        while ((line = bufferedReader.readLine()) != null) {
            lineNumber += 1;
            line = line.trim();
            // Skip empty lines and single-line comments.
            if (line.isEmpty() || line.startsWith("--"))
                continue;
            builder.append(line);
            // If the line ends with a semicolon, it
            // indicates the end of an SQL command.
            if (line.endsWith(";"))
                try {
                    // Execute the SQL command
                    statement.execute(builder.toString());
                    // Print a success message along with
                    // the first 15 characters of the
                    // executed command.
                    System.out.println(
                        ++count
                        + " Command successfully executed : "
                        + builder.substring(
                            0,
                            Math.min(builder.length(), 15))
                        + "...");
                    builder.setLength(0);
                }
                catch (SQLException e) {
                    // If an SQLException occurs during
                    // execution, print an error message and
                    // stop further execution.
                    System.err.println(
                        "At line " + lineNumber + " : "
                        + e.getMessage() + "\n");
                    return;
                }
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

Использование класса SQLExecutor

Чтобы использовать класс SQLExecutor, мы создадим основной метод, который принимает вводимые пользователем данные и инициирует процесс выполнения. Основной метод, представленный выше, позволяет пользователям в интерактивном режиме вводить необходимые данные, включая имя класса, строку подключения, имя пользователя, пароль и путь к файлу. Затем он приступает к выполнению команд SQL из указанного файла.

Java

public static void main(String[] args)
{
    Scanner scanner = new Scanner(System.in);
    System.out.println("*** Welcome to SQl file executer ***\n");
    System.out.print("Enter Class Name        : ");
    String className = scanner.nextLine();
    System.out.print("Enter Connection string : ");
    String url = scanner.nextLine();
    System.out.print("Enter username          : ");
    String user = scanner.nextLine();
    System.out.print("Enter password          : ");
    String password = scanner.nextLine();
    try {
        SQLExecutor executor = new SQLExecutor(
            className, url, user, password);
        System.out.print("Enter file path : ");
        executor.executeFile(scanner.nextLine());
        scanner.close();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

Класс SQLExecutor можно использовать независимо как отдельный инструмент или включить в проект. Опишем варианты использования для обоих сценариев:

Автономный вариант использования

При независимом использовании в качестве автономного инструмента класс SQLExecutor можно скомпилировать с использованием jar-файла драйвера JDBC. Это позволяет выполнять команды SQL без необходимости настройки всего проекта.

Версия JDK — 18 или выше

java -cp path/to/jar SQLExecuter.java

Включение в проект:

В этом случае класс SQLExecutor включен как часть более крупного проекта Java. мы можем использовать функциональность класса при выполнении команд SQL, связанных с этим конкретным проектом.

Заключение

Используя мощь потоков ввода-вывода Java и возможности подключения JDBC, мы теперь можем эффективно выполнять множество команд SQL за считанные секунды. Этот подход оказывается очень полезным для таких задач, как создание таблиц, вставка значений и выполнение некоторых предопределенных определений.

Однако важно помнить о любых синтаксических различиях между базами данных, таких как форматы значений даты и времени или различная поддержка определенных баз данных. Приятного кодирования!

Оцените статью
bestprogrammer.ru
Добавить комментарий