- Uses of Interface java.sql.ResultSet
- Uses of ResultSet in java.sql
- Uses of ResultSet in javax.sql
- Uses of ResultSet in javax.sql.rowset
- Uses of ResultSet in javax.sql.rowset.serial
- Uses of ResultSet in javax.sql.rowset.spi
- Получаем данные из ResultSet
- Получение данных из текущей строки
- Получение разных данных о ResultSet
Uses of Interface
java.sql.ResultSet
Provides the API for accessing and processing data stored in a data source (usually a relational database) using the Java programming language.
Provides the API for server side data source access and processing from the Java programming language.
Provides utility classes to allow serializable mappings between SQL types and data types in the Java programming language.
The standard classes and interfaces that a third party vendor has to use in its implementation of a synchronization provider.
Uses of ResultSet in java.sql
Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
DatabaseMetaData. getAttributes (String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern)
Retrieves a description of the given attribute of the given type for a user-defined type (UDT) that is available in the given schema and catalog.
DatabaseMetaData. getBestRowIdentifier (String catalog, String schema, String table, int scope, boolean nullable)
DatabaseMetaData. getColumnPrivileges (String catalog, String schema, String table, String columnNamePattern)
DatabaseMetaData. getColumns (String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
DatabaseMetaData. getCrossReference (String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable)
Retrieves a description of the foreign key columns in the given foreign key table that reference the primary key or the columns representing a unique constraint of the parent table (could be the same or a different table).
Retrieves a description of the foreign key columns that reference the given table’s primary key columns (the foreign keys exported by a table).
DatabaseMetaData. getFunctionColumns (String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern)
Retrieves a description of the primary key columns that are referenced by the given table’s foreign key columns (the primary keys imported by a table).
DatabaseMetaData. getIndexInfo (String catalog, String schema, String table, boolean unique, boolean approximate)
DatabaseMetaData. getProcedureColumns (String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern)
DatabaseMetaData. getPseudoColumns (String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
Retrieves a description of the pseudo or hidden columns available in a given table within the specified catalog and schema.
Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
Retrieves a result set holding the elements of the subarray that starts at index index and contains up to count successive elements.
Retrieves a result set that contains the elements of the SQL ARRAY value designated by this Array object.
Retrieves a description of the user-defined type (UDT) hierarchies defined in a particular schema in this database.
DatabaseMetaData. getTables (String catalog, String schemaPattern, String tableNamePattern, String[] types)
DatabaseMetaData. getUDTs (String catalog, String schemaPattern, String typeNamePattern, int[] types)
Retrieves a description of a table’s columns that are automatically updated when any value in a row is updated.
Uses of ResultSet in javax.sql
Uses of ResultSet in javax.sql.rowset
The JoinRowSet interface provides a mechanism for combining related data from different RowSet objects into one JoinRowSet object, which represents an SQL JOIN .
Returns a ResultSet object containing the original value for the current row only of this CachedRowSet object.
Populates this WebRowSet object with the contents of the given ResultSet object and writes its data, properties, and metadata to the given OutputStream object in XML format.
Populates this WebRowSet object with the contents of the given ResultSet object and writes its data, properties, and metadata to the given Writer object in XML format.
Uses of ResultSet in javax.sql.rowset.serial
Retrieves a ResultSet object that contains all of the elements in the ARRAY value that this SerialArray object represents.
Retrieves a ResultSet object holding the elements of the subarray that starts at index index and contains up to count successive elements.
Retrieves a result set holding the elements of the subarray that starts at Retrieves a ResultSet object that contains a subarray of the elements in this SerialArray object, starting at index index and containing up to count successive elements.
Retrieves a ResultSet object that contains all of the elements of the SQL ARRAY value represented by this SerialArray object.
Uses of ResultSet in javax.sql.rowset.spi
Defines a framework that allows applications to use a manual decision tree to decide what should be done when a synchronization conflict occurs.
Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples. Other versions.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2023, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.
Получаем данные из ResultSet
Первую программу мы написали и она отлично отработала. Мы написали запрос, выполнили его, и в результате метод executeQuery() вернул нам объект ResultSet , который содержит все результаты запроса. И теперь мы попробуем разобраться, как эти результаты из него получить.
Результат запроса может содержать тысячи строк и сотни колонок различных типов, так что эта не такая тривиальная задача, как тебе кажется. Например, в базе могут храниться картинки, тогда ты можешь получить картинку в виде набора байт или же InputStream для ее загрузки.
Но начнем мы с самого простого — с понятия “текущей строки результата”. Так как строк у результата обычно очень много, то объект ResultSet имеет у себя внутри указатель на текущую строку. И последовательно переключает строки для их чтения с помощью метода next() .
Такой подход в первую очередь сделан для оптимизации. JDBC Driver может не загружать строки из базы, пока ты последовательно не дойдешь до их чтения. FileInputStream ты тоже читаешь последовательно с начала и до конца. Так что такой подход должен быть тебе знаком и понятен.
Однако же, если тебе очень нужно, то файлы можно читать в любом месте с помощью класса RandomAccessFile .
Класс ResultSet тоже позволяет что-то подобное и позволяет двигать текущую строку по результату куда угодно. Для этого у него есть такие методы:
Метод | Описание | ||
---|---|---|---|
1 | next() | Переключиться на следующую строку | |
2 | previous() | Переключиться на предыдущую строку | |
3 | isFirst() | Текущая строка первая? | |
4 | isBeforeFirst() | Мы перед первой строкой? | |
5 | isLast() | Текущая строка последняя? | |
6 | isAfterLast() | Мы после последней сроки? | |
7 | absolute(int n) | Делает N-ю строку текущей | |
8 | relative(int n) | Двигает текущую строку на N позиций вперед. N может быть getRow() | Возвращает номер строки |
Методы достаточно простые, однако нужно сделать два пояснения. Результаты как бы обрамлены пустыми строками с обоих сторон. Поэтому изначально текущая строка находится перед первой строкой результата. И чтобы получить первую строку, нужно хотя бы раз вызвать метод next() .
Если ты на последней стоке вызвал метод next() , то ты перешел на строку после последней. Данных из нее прочитать ты не можешь, но никакой ошибки не произойдет. Тут метод isAfterLast() будет возвещать true в качестве результата.
Statement statement = connection.createStatement(); ResultSet results = statement.executeQuery("SELECT * FROM user"); System.out.println( results.getRow() ); // 0 System.out.println( results.isBeforeFirst() ); // true System.out.println( results.isFirst() ); // false results.next(); System.out.println( results.getRow() ); // 1 System.out.println( results.isBeforeFirst() ); // false System.out.println( results.isFirst() ); // true results.next(); System.out.println( results.getRow() ); // 2 System.out.println( results.isBeforeFirst() ); // false System.out.println( results.isFirst() ); // false
Получение данных из текущей строки
Ты научился виртуозно управлять текущей строкой. Теперь давай разберем, как из нее получать данные. Для этого у объекта ResultSet есть специальные методы, которые все можно описать одним шаблоном:
Впрочем, если у колонки есть имя, то можно получать и по имени колонки:
Ниже я приведу таблицу, которая тебе поможет связать типы данных SQL и методы ResultSet:
SQL Datatype | getXXX() Methods |
---|---|
CHAR | getString() |
VARCHAR | getString() |
INT | getInt() |
FLOAT | getDouble() |
CLOB | getClob() |
BLOB | getBlob() |
DATE | getDate() |
TIME | getTime() |
TIMESTAMP | getTimestamp() |
Получение разных данных о ResultSet
Как читать данные из текущей строки мы разобрались: и по номеру колонки, и по ее имени. Кстати, а как узнать имя колонки по ее номеру? Или количество колонок в результате?
С одной стороны, если ты пишешь запрос, то ты вроде бы должен все это знать. С другой стороны, мы можем писать программу, которая отображает результат запроса на экран: запрос нам передают и мы хотим просто отобразить на экране (в консоли, веб-странице) все, что нам вернул SQL-сервер.
Для этого у JDBC есть специальный объект – интерфейс ResultSetMetaData . Получить объект этого типа достаточно просто:
Statement statement = connection.createStatement(); ResultSet results = statement.executeQuery("SELECT * FROM user"); ResultSetMetaData resultSetMetaData = results.getMetaData();
У интерфейса ResultSetMetaData есть очень интересные методы. Ниже приведу самые популярные из них:
1 | getColumnCount() | Возвращает количество колонок результата |
2 | getColumnName(int column) | Возвращает имя колонки |
3 | getColumnLabel(int column) | Возвращает description колонки |
4 | getColumnType() | Возвращает тип колонки: число (специальный код) |
5 | getColumnTypeName() | Возвращает тип колонки: строка |
6 | getColumnClassName() | Возвращает имя java-класса для типа колонки |
7 | getTableName() | Возвращает имя таблицы |
8 | getCatalogName() | Возвращает имя каталога колонки |
9 | getSchemaName() | Возвращает имя схемы базы данных |
10 | isAutoIncrement(int column) | Колонка поддерживает AUTO INCREMENT? |
11 | isNullable() | Колонка может содержать NULL? |
Давай с его помощью немного узнаем о нашей таблице:
ResultSetMetaData metaData = results.getMetaData(); int columnCount = metaData.getColumnCount(); for (int column = 1; column
Важно! Обрати внимание, что колонки нумеруются с 1. Строки, кстати, тоже. Как это необычно, да?
И вот какой результат я получил после запуска программы:
«C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe… | |||
id | java.lang.Integer | INT | 4 |
name | java.lang.String | VARCHAR | 12 |
level | java.lang.Integer | INT | 4 |
created_date | java.sql.Date | DATE | 91 |
Process finished with exit code 0 |