Во многих случаях мы часто сталкиваемся с необходимостью выполнять команды SQL в базе данных с использованием JDBC для загрузки необработанных данных. Хотя поставщик базы данных предоставляет интерфейсы командной строки или графический интерфейс, иногда нам может потребоваться управлять выполнением команд базы данных с помощью внешнего программного обеспечения. В этой статье мы научимся выполнять SQL-файл, содержащий тысячи комментариев, всего за несколько секунд, не полагаясь на какую-либо внешнюю библиотеку или зависимость. Этот процесс требует лишь минимальных знаний о потоках ввода-вывода и подключении JDBC.
Понимание концепций
Прежде чем углубиться в статью, давайте ознакомимся с необходимыми понятиями:
- Имя класса: имя класса драйвера JDBC.
- URL-адрес подключения: URL-адрес для подключения к базе данных.
- Имя пользователя и пароль: учетные данные для подключения к базе данных.
- Файл SQL: файл, содержащий команды SQL без каких-либо синтаксических ошибок.
- Файл 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-адрес, имя пользователя и пароль.
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 за считанные секунды. Этот подход оказывается очень полезным для таких задач, как создание таблиц, вставка значений и выполнение некоторых предопределенных определений.
Однако важно помнить о любых синтаксических различиях между базами данных, таких как форматы значений даты и времени или различная поддержка определенных баз данных. Приятного кодирования!