Java SQL Server: выбор данных

В этом руководстве вы узнаете, как запрашивать данные из таблицы 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* для извлечения данных из каждой строки в наборе результатов.
Мирослав С.

Автор статей, ИБ-специалист