Практически ни одно серьёзное современное приложение не обходится без баз данных. Поэтому на сегодняшний день практически все основные языки программирования поддерживают работу с ними. Java не исключение.
Рассмотрим работу с базами данных в Java на примере Microsoft SQL Server.
В Java для доступа к базам данных используется технология JDBC. Это платформенно-независимый стандарт, который поддерживает большинство современных СУБД.
Работа с базами данных с помощью JDBC строится по следующему алгоритму:
- Подключение к проекту библиотеки с драйвером;
- Подключение к базе данных;
- Собственно работа с базой данных посредством SQL запросов.
Подключение драйвера СУБД к проекту
Драйвер СУБД для JDBC, если он не входит в состав JDK, как правило, можно скачать с официального веб ресурса её разработчика. В частности, JDBC драйвер для Microsoft SQL Server можно скачать здесь.
Драйвер СУБД представляет собой обычный jar файл. Его подключение к проекту ничем не отличается от подключения любой другой библиотеки.
Подключение приложения к базе данных
Вначале требуется сформировать строку подключения. Для Microsoft SQL Server она имеет следующий вид.
1 2 3 4 5 6 |
String instanceName = "serverName\\instanseName"; String databaseName = "test"; String userName = "Usr"; String pass = "**********"; String connectionUrl = "jdbc:sqlserver://%1$s;databaseName=%2$s;user=%3$s;password=%4$s;"; String connectionString = String.format(connectionUrl, instanceName, databaseName, userName, pass); |
Рассмотрим подробнее шаблон строки подключения (переменная connectionUrl). Он начинается с двух ключевых параметров отделённых друг от друга и остальной части строки подключения двоеточиями:
- Стандарт подключения к базе данных (jdbc);
- Идентификатор драйвера (в данном случае sqlserver).
После идентификатора драйвера следует описание параметров подключения в соответствии с требованиями той или иной конкретной СУБД.
В случае Microsoft SQL Server имя сервера необходимо указывать в формате имя_хоста\имя_экземпляра. Например: ServerDB\SQLSERVER_1. При этом не играет роли, откуда осуществляется подключение, локально с самого хоста или по сети.
На это необходимо обратить особе внимание, так как даже в статье на TechNet строка подключения приведена с ошибкой. По крайней мере, с новым драйвером, который поддерживает последние версии Microsoft SQL Server и Java, приведённая в ней строка подключения по факту не работает.
После формирования строки подключения следует зарегистрировать драйвер СУБД.
1 |
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); |
Для Microsoft SQL Server такая регистрация является обязательной лишь для устаревшей версии драйвера. Для обновлённой (sqljdbc4.jar) в этом необходимости уже нет.
После завершения подготовительных операций можно с помощью объекта Connection открыть соединение с базой данных.
1 |
Connection con = DriverManager.getConnection(connectionString); |
При создании объекта Connection необходимо обрабатывать исключение SQLException.
Работа с базой данных
Отправка SQL запросов и получение результатов осуществляется при помощи объекта Statement (создание этого объекта требует обработки исключения SQLException).
1 |
Statement stmt = con.createStatement(); |
Если запрос не предполагает получение данных (не является запросом типа SELECT), для его выполнения использует метод execute, который в случае успешного или неудачного выполнения запроса вернёт значения true или false соответственно.
1 |
stmt.execute("INSERT INTO [Categories] ([Category]) VALUES ('Категория 1')"); |
Для выборки данных из таблицы следует воспользоваться методом executeQuery, который возвратит результаты выборки в виде объекта ResultSet.
1 |
ResultSet executeQuery = stmt.executeQuery("SELECT [Category] FROM [Categories]"); |
При использовании методов execute и executeQuery необходимо обрабатывать исключение SQLException.
Полученные с помощью метода executeQuery результаты выборки можно легко обойти в цикле и извлечь, вызывая геттер соответствующий типу извлекаемых данных (в данном случае String).
1 2 3 |
while (executeQuery.next()) { System.out.println(executeQuery.getString("Category")); } |
Каждый геттер имеет две перегрузки. Первая принимает имя, а вторая индекс столбца таблицы из которого извлекаются данные. В случае применения второй перегрузки следует иметь в виду, что индексация столбцов в результирующем наборе данных начинается с 1.
Полное описание интерфейса ResultSet и в частности геттеров можно найти в документации.
После того как все необходимые запросы к базе данных выполнены и данные из выборки (если она выполнялась) получены соединение с базой данных необходимо закрыть. Для этого служит метод close.
1 2 3 |
executeQuery.close(); stmt.close(); con.close(); |
Ниже в качестве примера приведен полный код выборки данных из таблицы Microsoft SQL Server.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; public class DbTest { public static void main(String[] args) { // Формирование строки подключения String instanceName = " serverName\\instanseName "; String databaseName = "Test"; String userName = "Usr"; String pass = "**********"; String connectionUrl = "jdbc:sqlserver://%1$s;databaseName=%2$s;user=%3$s;password=%4$s;"; String connectionString = String.format(connectionUrl, instanceName, databaseName, userName, pass); try { // Подключение к базе данных Connection con = DriverManager.getConnection(connectionString); // Отправка запроса на выборку и получение результатов Statement stmt = con.createStatement(); ResultSet executeQuery = stmt.executeQuery("SELECT * FROM [Categories]"); // Обход результатов выборки while (executeQuery.next()) { System.out.println(executeQuery.getString("Category")); } // Закрываем соединение executeQuery.close(); stmt.close(); con.close(); } catch (SQLException ex) { // Обработка исключений Logger.getLogger(DbTest.class.getName()).log(Level.SEVERE, null, ex); } } } |
JDBC позволяет выполнять весь спектр задач связанных с использованием баз данных, но предоставляет для этого низкоуровневый интерфейс требующий непосредственной работы с SQL. Это не всегда удобно и как следствие во многих проектах вместо JDBC используются более высокоуровневые технологии, такие как, например Hibernate.
Однако JDBC так или иначе является основой работы с базами данных в Java и потому знакомство с ним для Java программиста обязательно.
SQLException error:: No suitable driver found for jdbc:sqlserver: что не так я делаю? помогите пожалуйста!
что не так я делаю? Хороший вопрос. Но, судя по тексту ошибки, проблема скорее всего в совместимости драйверов для СУБД или их отсутствии либо неправильном подключении к проекту.
No suitable driver found выдается, если JDBC драйвер не найден (отсутствует в CLASSPATH). Во избежание таких ошибок рекомендуется использовать Maven, а не скачивать и подключать jar’ники вручную.
Заработало на SQL Server 2017 Express с такой строкой: String instanceName = «localhost\\SQLEXPRESS»; Но для этого нужна дополнительная настройка. Запустить SQL Server Configuration Manager, выбрать «Сетевая конфигурация SQL Server/Протоколы для SQLEXPRESS», включить там TCP/IP. Затем выбрать «Службы SQL Server», там запустить «Обозреватель SQL Server» (выбрав ручной режим запуска). И вместо «драйвер можно скачать здесь» вообще-то принято использовать Maven (или Gradle). В Maven нужно добавить зависимость в pom.xml: com.microsoft.sqlserver mssql-jdbc 7.0.0.jre8