Java прочитать текстовый файл sql и выполнить

Обновлено: 04.07.2024

У меня есть sql script файл, мне нужно выполнить команды, присутствующие в этом через java. Я искал в Интернете то же самое, у меня есть код, определяющий синтаксические анализаторы, чтобы разбить SQL-запросы и выполнить это. Но ни один из них не работал для моего файла sql script. Поскольку мой файл script содержит как операторы create, так и инструкции alter без точки с запятой в конце [вместо этого он имеет GO] Может ли кто-нибудь предложить решение для выполнения файла script?
Благодаря,
Махеш

спросил(а) 2011-04-27T12:17:00+04:00 10 лет, 6 месяцев назад

Для простых скриптов я обычно использую этот класс из ibatis - ScriptRunner. Альтернативу вы можете создать новый процесс клиента db из Java и подать в script, который вы не выполнили. Это будет работать для всех сценариев, так как простые решения, такие как ScriptRunner, не работают хорошо, когда разграничители в файлах sql будут изменены, например.

Вот пример того, как передать sql как строку в обработанный клиентский процесс db:

ответил(а) 2011-04-27T12:31:00+04:00 10 лет, 6 месяцев назад ответил(а) 2015-03-20T19:07:00+03:00 6 лет, 8 месяцев назад

Можно изменить разделитель от ; до GO . Я думаю, что это должно было сделать трюк.

ответил(а) 2011-04-27T12:45:00+04:00 10 лет, 6 месяцев назад

Самый простой способ - просто получить инструкции и проверить, нужны ли они в конце столбца в конце: (это пример и работает только в том случае, если это оператор по строке:

Если вы не знаете, как использовать jdbc, просто спросите: -)

ответил(а) 2011-04-27T12:30:00+04:00 10 лет, 6 месяцев назад

Самое простое решение, которое я могу вам представить, это, полагая, что я понимаю ваш вопрос.

1) Прочитайте текстовый файл в строке или массиве через Java IO.
2) Передайте строку или массив в MySQL через JDBC.

Прочтите из примера файла,

ответил(а) 2011-04-27T12:30:00+04:00 10 лет, 6 месяцев назад

Вам нужно изменить синтаксический анализатор, чтобы он выдавал исполняемые операторы. Но я не уверен, что понимаю, что вы имеете в виду, когда говорите "выполняйте через Java".

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

Я не понимаю, почему вам нужно разбирать SQL, если вы не хотите, чтобы Java проверяла их перед отправкой на сервер базы данных. Сервер будет анализировать и проверять их снова, так что кажется, что вы делаете дополнительную работу ни для чего.

Я хочу выполнить файл сценария SQL на Java без чтения всего содержимого файла в большой запрос и его выполнения.

есть ли другой стандартный способ?

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

  • пример кода был извлечен из здесь и изменен, чтобы ответить на вопрос, предполагая, что пользователь хочет выполнить файл сценария с PostgreSQL.

существует отличный способ выполнения SQL-скриптов с Java, не читая их самостоятельно, пока вы не возражаете иметь зависимость от Ant. На мой взгляд, такая зависимость очень хорошо оправдана в вашем случае. Вот пример кода, где класс SQLExec живет в ant.jar:

нет, вы должны прочитать файл, разделить его на отдельные запросы, а затем выполнить их по отдельности (или с помощью пакетного API JDBC).

одна из причин заключается в том, что каждая база данных определяет свой собственный способ разделения операторов SQL (некоторые используют ; , другие / , некоторые позволяют одновременно или даже определить свой собственный разделитель).

вы не можете использовать JDBC, поскольку он не поддерживает . Работа вокруг будет включать в себя iBatis iBATIS-это структура персистентности и вызов Scriptrunner конструктор как показано в iBatis документация .

нехорошо включать тяжелую структуру персистентности, такую как ibatis, чтобы запускать простые сценарии sql любыми способами, которые вы можете сделать с помощью командной строки

библиотека Flyway действительно хороша для этого:

это сканирует местоположения для сценариев и запускает их по порядку. Скрипты могут быть версионными с именем V01__.sql, поэтому, если вызывается только миграция, будут выполняться только те, которые еще не запущены. Использует таблицу под названием "schema_version" для отслеживания вещей. Но может делать и другие вещи, см. документы:flyway.

чистый вызов не требуется, но полезно начать с чистого DB. Также следует учитывать местоположение (по умолчанию "classpath: db/migration"), нет места после":", который поймал меня.

поскольку JDBC не поддерживает эту опцию, лучшим способом решить этот вопрос является выполнение командных строк через программу Java. Ниже приведен пример для postgresql:

JDBC не поддерживает эту опцию (хотя конкретный драйвер БД может предложить это). Во всяком случае, не должно быть проблем с загрузкой всего содержимого файла в память.

Эта статья открывает небольшой цикл, посвященный азам взаимодействия с базами данных (БД) в Java и введению в SQL. Многие программы заняты обработкой и модификацией информации, её поддержкой в актуальном состоянии. Поскольку данные — весьма важная часть логики программ, то под них зачастую выделяют отдельное хранилище. Информация в нём структурирована и подчинена специальным правилам, чтобы обеспечить правильность обработки и хранения. Доступ к данным и их изменение осуществляется с помощью специального языка запросов — SQL (Structured Query Language).

Система управления базами данных — это ПО, которое обеспечивает взаимодействие разных внешних программ с данными и дополнительные службы (журналирование, восстановление, резервное копирование и тому подобное), в том числе посредством SQL. То есть программная прослойка между данными и внешними программами с ними работающими. В этой части ответим на вопросы что такое SQL, что такое SQL сервер и создадим первую программу для взаимодействия с СУБД.

Виды СУБД

  • Иерархические. Данные организованы в виде древовидной структуры. Пример — файловая система, которая начинается с корня диска и далее прирастает ветвями файлов разных типов и папок разной степени вложенности.
  • Сетевые. Видоизменение иерархической, у каждого узла может быть больше одного родителя.
  • Объектно-ориентированные. Данные организованы в виде классов/объектов c их атрибутами и принципами взаимодействия согласно ООП.
  • Реляционные. Данные этого вида СУБД организованы в таблицах. Таблицы могут быть связаны друг с другом, информация в них структурирована.
  • Что такое SQL-Сервер и как он работает? Взаимодействие с СУБД происходит по клиент-серверному принципу. Некая внешняя программа посылает запрос в виде операторов и команд на языке SQL, СУБД его обрабатывает и высылает ответ. Для упрощения примем, что SQL Сервер = СУБД.
  • Data Definition Language (DDL) – определения данных. Создание структуры БД и её объектов;
  • Data Manipulation Language(DML) – собственно взаимодействие с данными: вставка, удаление, изменение и чтение;
  • Transaction Control Language (TCL) – управление транзакциями;
  • Data Control Language(DCL) – управление правами доступа к данным и структурам БД.

Часть 1. Введение в SQL - 2

В 80-е годы прошлого века персональные компьютеры типа PC XT/AT завоевали рынок. Во многом это произошло благодаря модульности их конструкции. Это означает, что пользователь мог довольно просто менять ту или иную составную часть своего компьютера (процессор, видеокарту, диски и тому подобное). Это замечательное свойство сохранилось и поныне: мы меняем видеокарту и обновляем драйвер (иногда он и вовсе обновляется сам, в автоматическом режиме). Чаще всего при таких манипуляциях ничего плохого не происходит, и существующие программы продолжат работать с обновившейся системой без переустановки. Аналогично и для работы в Java с СУБД. Для стандартизации работы с SQL-серверами взаимодействие с ней можно выполнять через единую точку — JDBC (Java DataBase Connectivity). Она представляет собой реализацию пакета java.sql для работы с СУБД. Производители всех популярных SQL-серверов выпускают для них драйверы JDBC. Рассмотрим схему ниже. Приложение использует экземпляры классов из java.sql. Затем мы передаем необходимые команды для получения/модификации данных. Далее java.sql через jdbc-драйвер взаимодействует с СУБД и возвращает нам готовый результат. Для перехода на СУБД другого производителя часто достаточно сменить JDBC и выполнить базовые настройки. Остальные части программы при этом не меняются.

Первая программа

Разбор кода

Блок констант:

  1. DB_Driver: Здесь мы определили имя драйвера, которое можно узнать, например, кликнув мышкой на подключенную библиотеку и развернув её структуру в директории lib текущего проекта.
  2. DB_URL: Адрес нашей базы данных. Состоит из данных, разделённых двоеточием:
  3. Протокол=jdbc
  4. Вендор (производитель/наименование) СУБД=h2
  5. Расположение СУБД, в нашем случае путь до файла (c:/JavaPrj/SQLDemo/db/stockExchange). Для сетевых СУБД тут дополнительно указываются имена или IP адреса удалённых серверов, TCP/UDP номера портов и так далее.

Обработка ошибок:

Вызов методов нашего кода может вернуть ошибки, на которые следует обратить внимание. На данном этапе мы просто информируем о них в консоли. Заметим, что ошибки при работе с СУБД — это чаще всего SQLException.

В этой статье мы научимся подключаться к базе данных MySQL из Java-кода и выполнять простые запросы для получения и обновления данных. Для того, чтобы получить доступ к базе данных, мы будем использовать JDBC (Java Database Connectivity) API, который входит в стандартную библиотеку Java. JDBC позволяет подключиться к любой базе данных: Postgres, MySQL, SQL Server, Oracle и т. д. — при наличии соответствующей реализации драйвера, необходимого для подключения. Для базы данных MySQL мы будем использовать драйвер Type 4 JDBC из пакета mysql-connector-java-5.1.23-bin.jar . Он написан на чистой Java, а значит, нам не понадобятся какие-либо нативные библиотеки или ODBC-мост. Все, что нам надо будет сделать — это положить JAR-файл в директорию, содержащуюся в CLASSPATH. JAR-файл содержит класс com.mysql.jdbc.Driver , необходимый для подключения к MySQL. Если его не окажется в CLASSPATH, во время выполнения программы выбросится исключение java.lang.ClassNotFoundException , поэтому убедитесь, что вы правильно настроили пути.

Кстати, если вы ищете хорошую книгу по использованию JDBC, обратите внимание на Practical Database Programming with Java (Ying Bai). Это относительно новая книга, и в ней рассматриваются две самые популярные базы данных: Oracle и SQL Server 2008. В книге используется IDE NetBeans для примеров и описываются все инструменты, необходимые для работы с базами данных в Java. Это отличная книга для начинающих и опытных программистов.

Подключаем базу данных MySQL с помощью JDBC

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

  1. Строка подключения JDBC (например:
    jdbc:mysql://localhost:3306/test).
  2. Имя пользователя (root).
  3. Пароль (root).
  4. База данных с некоторым количеством таблиц для примера (например, база данных книг).

Строка подключения для MySQL начинается с jdbc:mysql . Это название протокола соединения, за которым следуют хост и порт подключения, на которых запущена база данных. В нашем случае это localhost с портом по умолчанию 3306 (если вы его не поменяли при установке). Следующая часть — test — имя базы данных, которая уже существует в MySQL. Мы можем создать таблицу Books :

и наполнить её хорошими книгами:

Программа на Java, которая использует базу данных

Теперь давайте напишем программу на Java, которая будет подключаться к нашей базе данных, запущенной на localhost . Важно помнить о том, что необходимо закрывать соединение, запросы и результат выполнения после завершения работы с ними. Также важно закрывать их в finally-блоке, со своей try/catch оберткой, поскольку сам метод close() может кинуть исключение, что приведет к утечке ресурсов. За подробной информацией вы можете обратиться к этой статье. Кроме того, вы можете использовать обертку try-with-resource, которая появилась в Java 7. Более того, это стандартный способ работы с ресурсами в Java 1.7.

При первом запуске у вас, возможно, будет ошибка No suitable driver found for jdbc:mysql , если драйвера MySQL нет в CLASSPATH:

Добавим нужный JAR-файл в путь и снова запустим программу. Другая частая ошибка — указать таблицу в строке соединения: jdbc:mysql://localhost:3306/test/book . В этом случае вылетит следущее исключение:

Успешный запуск программы выведет на экран следующее:

Результат верный, поскольку у нас в таблице только две книги: «Effective Java» и «Java Concurrency in Practice».

Получаем данные с помощью SELECT-запроса в JDBC

Для получения данных из БД вы можете выполнить SELECT-запрос. В первом примере мы уже его использовали, но получили только количество строк. Теперь мы вернем сами строки. Большая часть программы останется без изменений, за исключением SQL-запроса и кода, возвращающего данные из объекта ResultSet :

Этот код выведет на экран следующее:

Тут есть пара моментов, на которые следует обратить внимание. Метод rs.getInt(1) используется для получения столбца с целочисленным типом, в нашем случае это столбец «id». Индексы в JDBC начинаются с единицы, поэтому rs.getInt(1) вернет значение первого столбца как целое число. В случае, если вы укажете неверный индекс (многие разработчики вызывают rs.getInt(0) для получения первого столбца), выбросится исключение InvalidColumnIndexException . Доступ к столбцам по индексу чреват ошибками, поэтому лучше использовать имя столбца, например, rs.getInt("id") . Подробнее об этом вы можете прочитать в этой статье. Метод getString() используется для получения строковых значений из базы (например, VARCHAR ). Цикл будет выполняться, пока rs.next() не вернет false . Это значит, что строки закончились. В нашем случае в таблице две строки, поэтому цикл выполнится два раза, выводя информацию о книгах из таблицы на экран.

Добавляем данные с помощью INSERT-запроса в JDBC

После запуска программы вы можете проверить таблицу в СУБД. На этот раз вы увидите три записи в таблице:

Connecting MySQL Database from Java

Теперь вы умеете подключаться к MySQL из Java-приложения и выполнять SELECT, INSERT, DELETE и UPDATE-запросы так же, как и в MySQL GUI. Для подключения мы используем объект Connection , для чтения результатов запроса — ResultSet . Убедитесь перед подключением, что сервер MySQL запущен и mysql-connector-java-5.1.17-bin.jar находится в CLASSPATH, чтобы избежать ClassNotFoundException .

3–5 декабря, Онлайн, Беcплатно

Когда разберетесь с подключением и простыми запросами, имеет смысл изучить, как использовать подготавливаемые запросы (Prepared Statement) в Java для избежания SQL-инъекции. В боевом коде всегда следует использовать подготавливаемые запросы и связывание переменных.

Если вам понравилось это руководство и не терпится узнать больше о подключении и работе с базой данных из Java-программ, обратите внимание на следующие статьи:

Читайте также: