В этом руководстве вы узнаете, как запрашивать данные из таблицы SQL Server с помощью JDBC API.
Это руководство начинается с того места, где закончилось руководство «Выполнение пакетных операций в Java».
Ниже приведены шаги для запроса данных из таблицы SQL Server с использованием JDBC:
- Сначала подключитесь к базе данных SQL Server.
- Во-вторых, создайте новый объект PreparedStatement(или объект Statement) с помощью оператора SELECT.
- В-третьих, задайте значения параметров оператора, вызвав методы set* объекта PreparedStatement.
- В-четвертых, выполните оператор SELECT в SQL Server, вызвав метод executeQuery() объекта Statement. Метод возвращает объект ResultSet.
- В-пятых, выполните итерацию по строкам из ResultSet, вызвав его метод next() и обработав каждую строку по отдельности.
- Наконец, закройте набор результатов, оператор и подключение к базе данных. Если вы используете try-with-resources, вам не нужно закрывать их вручную.
Выбор всех строк из таблицы
Мы покажем вам, как запросить все строки из таблицы Authors и вернуть список объектов Author:
Шаг 1. Измените класс AuthorDB, добавив метод findAll(), который возвращает все строки из таблицы Authors в виде списка объектов Author:
public List findAll() throws DBException { var sql = "SELECT AuthorID, FirstName, LastName, BirthDate FROM Authors"; var authors = new ArrayList(); try(var statement = connection.createStatement(); var resultset = statement.executeQuery(sql)) { // while(resultset.next()) { // create the author object authors.add(createAuthorFrom(resultset)); } return authors; } catch(SQLException e) { throw new DBException(e.getMessage()); } }
Как это работает.
Сначала создайте оператор SELECT, который возвращает все строки из таблицы Authors:
var sql = "SELECT AuthorID, FirstName, LastName, BirthDate FROM Authors";
Во-вторых, создайте новый ArrayList объектов Author:
var authors = new ArrayList();
В-третьих, создайте объект Statement, вызвав метод createStatement объекта Connection, и выполните оператор SELECT, вызвав метод executeQuery() объекта Statement:
try(var statement = connection.createStatement(); var resultset = statement.executeQuery(sql)) {
Метод executeQuery() возвращает объект ResultSet.
Поскольку мы используем try-with-resources для управления объектами Statement и ResultSet, нам не нужно вручную закрывать их.
В-четвертых, выполните итерацию по строкам в наборе результатов, вызвав метод next(), создайте объект Author из ResultSet и добавьте его в список:
while(resultset.next()) { authors.add(createAuthorFrom(resultset)); }
Обратите внимание, что вскоре мы определим метод createAuthorFrom().
В-пятых, верните список авторов из метода:
return authors;
Наконец, вызовите исключение DBException, если при запросе данных из таблицы Authors возникает ошибка:
} catch(SQLException e) { throw new DBException(e.getMessage()); }
Шаг 2. Определите метод createAuthorFrom(), который создает новый объект Author из объекта ResultSet:
private Author createAuthorFrom(ResultSet resultset) throws SQLException { return new Author( resultset.getInt("AuthorID"), resultset.getString("FirstName"), resultset.getString("LastName"), resultset.getDate("BirthDate").toLocalDate() ); }
В этом методе мы вызываем метод get* объекта ResultSet для извлечения AuthorID, FirstName, LastName и BirthDate и возвращаем новый объект Author, созданный на основе этих значений.
Шаг 3. Измените метод main() класса Main, чтобы использовать метод findAll():
import java.sql.SQLException; public class Main { public static void main(String[] args) { try(var connection = SQLServerConnection.connect()) { var authorDB = new AuthorDB(connection); var authors = authorDB.findAll(); for(var author: authors){ System.out.println(author); } } catch(SQLException | DBException e) { System.err.println(e.getMessage()); } } }
Как это работает.
Сначала подключитесь к SQL Server:
try(var connection = SQLServerConnection.connect()) {
Во-вторых, создайте новый объект AuthorDB:
var authorDB = new AuthorDB(connection);
В-третьих, найдите всех авторов из таблицы Authors, вызвав метод findAll():
var authors = authorDB.findAll();
В-четвертых, отобразить всех авторов:
for(var author: authors) { System.out.println(author); }
Наконец, отобразите сообщение об ошибке, если при выборе данных возникнет какое-либо исключение:
} catch(SQLException | DBException e) { System.err.println(e.getMessage()); }
Шаг 4. Запустите программу Java.
Вот частичный вывод:
Author{authorId=1, firstName='John', lastName='Doe', birthDate=1990-12-31} Author{authorId=2, firstName='Lisa', lastName='Rodriguez', birthDate=1989-04-07} Author{authorId=3, firstName='Susan', lastName='Williams', birthDate=1941-08-16} ...
Выбор одной строки из таблицы
Мы выберем автора по идентификатору.
Шаг 1. Измените класс AuthorDB и определите метод findById для поиска автора по идентификатору:
public Author findById(int authorId) throws DBException { var sql = "SELECT AuthorID, FirstName, LastName, BirthDate FROM Authors WHERE AuthorID = ?"; try(var statement = connection.prepareStatement(sql)) { // Bind values to parameters statement.setInt(1, authorId); // Execute the query try(var resultset = statement.executeQuery()) { // if(!resultset.next()) { throw new DBException("The author with id " + authorId + " not found."); } // create the author object return createAuthorFrom(resultset); } } catch(SQLException e) { throw new DBException(e.getMessage()); } }
Как это работает.
Сначала создайте оператор SELECT, который возвращает все строки из таблицы Authors:
var sql = "SELECT AuthorID, FirstName, LastName, BirthDate FROM Authors WHERE AuthorID = ?";
Во-вторых, создайте объект PreparedStatement, вызвав метод prepareStatement() объекта Connection:
try(var statement = connection.prepareStatement(sql)) {
В этом примере мы используем PreparedStatement, поскольку запрос имеет параметр AuthorID.
В-третьих, привяжите значение к запросу:
statement.setInt(1, authorId);
В-четвертых, выполните запрос для выбора данных из таблицы Authors, вызвав метод executeQuery() объекта PreparedStatement:
try(var resultset = statement.executeQuery()) {
В-пятых, сгенерируйте исключение, если автора с указанным идентификатором не существует:
if(!resultset.next()) { throw new DBException("The author with id " + authorId + " not found."); }
В-шестых, верните объект Author, созданный из результата:
return createAuthorFrom(resultset);
В-седьмых, выдайте исключение DBException, если при выборе данных произошла ошибка:
} catch(SQLException e) { throw new DBException(e.getMessage()); }
Шаг 2. Измените метод main() класса Main, чтобы использовать метод findById():
import java.sql.SQLException; public class Main { public static void main(String[] args) { try(var connection = SQLServerConnection.connect()) { var authorDB = new AuthorDB(connection); // find author by Id var author = authorDB.findById(1); System.out.println(author); } catch(SQLException | DBException e) { System.err.println(e.getMessage()); } } }
Шаг 3. Запустите программу Java.
Вот что получилось:
Author{authorId=1, firstName='John', lastName='Doe', birthDate=1990-12-31}
Если вы измените идентификатор автора на несуществующее значение, например:
var author = authorDB.findById(-1);
вы получите следующее сообщение:
The author with id -1 not found.
Загрузите исходный код проекта
Загрузите исходный код проекта
Краткое содержание
- Вызовите метод executeQuery() объекта Statement или PreparedStatement, чтобы выполнить запрос и вернуть объект ResultSet.
- Вызовите метод next() объекта ResultSet для перебора строк из набора результатов.
- Используйте метод get* для извлечения данных из каждой строки в наборе результатов.