Java JDBC ResultSet Example
In this example, we are going to demonstrate how to use Java JDBC ResultSet in order to get and manipulate data from a database. ResultSet
is essentially a table, which contains all the information that should be returned from a specific query, as well as some essential metadata.
You can also check this tutorial in the following video:
1. Why we use ResultSet interface
A ResultSet is a table of data representing a database result set, which is usually generated by executing a statement that queries the database. A ResultSet object maintains a cursor pointing to its current row of data, initially positioned before the first row. The ResultSet interface provides getter methods for retrieving column values from the current row. Values can be retrieved using the column name or the index number of the column. The usual syntax to get a ResultSet is as shown below:
Connection conn = DriverManager.getConnection(database specific URL); Statement stmt = conn.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); ResultSet rSet = stmt.executeQuery("query to execute passed as String"); while(rSet.next()){ // Fetch the results and perform operations ... }
A ResultSet is obtained after executing a query. Connection and Statement will need to be created before execution.
As shown above, the attributes that are set while creating a ResultSet are:
- Type (resultSetType): This indicates how a cursor in a result set can iterate. Possible values are TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE.
- Concurrency (resultSetConcurrency): This indicates a constant for concurrency mode and can take these values – CONCUR_READ_ONLY, CONCUR_UPDATABLE.
- Holdability (resultSetHoldability): To indicate whether cursor to hold or close after commit. Possible values are CLOSE_CURSORS_AT_COMMIT, HOLD_CURSORS_OVER_COMMIT.
2. Categories in ResultSet
ResultSet has methods that can be categorized under 3 categories:
- Navigational methods – to navigate through the result set. Sample methods are
beforeFirst()
,afterLast()
,first()
,last()
,next()
,previous()
. - Get methods – contains methods to inquire about current position of result set like
getRow()
,isAfterLast()
,isBeforeFirst()
,isFirst()
,isLast()
. - Update methods – contains a method
refreshRow()
to refresh value with the latest values.
3. Technologies used
For the purposes of this article, we are going to assume that the database in use is MySQL, since it is one of the most well-known and beginner-friendly databases out there. In general, we are using:
- MySQL 5.6
- Eclipse Luna
- Java 7
4. Creating a new project and adding the driver to the build path
First of all download the JDBC driver needed for your database. In our case, you will need the MySQL Connector, which can be found and downloaded here. Select the Platform Independent option, and download the zip file which contains, among others, the MySQL Connector jar file which will be added in the build path. Right now, the official version which will be downloaded will contain the mysql-connector-java-5.1.31-bin file (which is the file that should be added to the project).
Afterwards, you need to create a new Eclipse project and add the connector to the build path, by right-clicking on the project -> Build Path -> Add External Archives, as shown in the image below:
After that, you can see that the jar is added in the build path under the Referenced Libraries section, in the project structure.
5. Java JDBC ResultSet Example
There are certain steps to be taken in order to use ResultSet in Java:
- Load the MySQL driver to your program.
- Create a
Connection
to the database. - Make a query using a
Statement
. - Get the
ResultSet
and manipulate the data as needed.
For this example, we assume that we have a local database running, named “albums“, which contains a table named “the_classics”. The table contains the following:
name | artist | year |
---|---|---|
The Black Album | Metallica | 1991 |
The White Album | The Beatles | 1968 |
Rock in Rio | Iron Maiden | 2001 |
Let’s get to the code then!
ResultSetExample.java
01 02 03 04 05 06 07 08 09 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ResultSetExample { public static void main(String[] args) { // The credentials that we need to have available for the connection to the database. String username = "myusername" ; String password = "mypassword" ; String databaseName = "albums" ; Connection connect = null ; Statement statement = null ; try { // Load the MySQL driver. Class.forName( "com.mysql.jdbc.Driver" ); // Setup the connection to the database. // Take notice at the different variables that are needed here: // 1. The name of the database and its location (currently localhost) // 2. A valid username/password for the connection. connect = DriverManager.getConnection( "jdbc:mysql://localhost/" + databaseName + "?" + "user=" + username + "&password=" + password); // Create the statement to be used to get the results. statement = connect.createStatement(); // Create a query to use. String query = "SELECT * FROM the_classics ORDER BY year" ; // Execute the query and get the result set, which contains // all the results returned from the database. ResultSet resultSet = statement.executeQuery(query); // We loop through the rows that were returned, and we can access the information // depending on the type of each column. In this case: // Album: Varchar, so we use getString(). // Artist: Also Varchar, so getString() again. // Year: Int, so we use getInt(). // For other types of columns, such as boolean or Date, we use the appropriate methods. while (resultSet.next()) { System.out.println( "Printing result..." ); // Now we can fetch the data by column name, save and use them! String albumName = resultSet.getString( "name" ); String artist = resultSet.getString( "artist" ); int year = resultSet.getInt( "year" ); System.out.println( "\tAlbum: " + albumName + ", by Artist: " + artist + ", released in: " + year); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // We have to close the connection and release the resources used. // Closing the statement results in closing the resultSet as well. try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } try { connect.close(); } catch (SQLException e) { e.printStackTrace(); } } } } |
Output
1 2 3 4 5 6 | Printing result... Album: The White Album, by Artist: The Beatles, released in : 1968 Printing result... Album: The Black Album, by Artist: Metallica, released in : 1991 Printing result... Album: Rock in Rio, by Artist: Iron Maiden, released in : 2001 |
As stated above, the ResultSet
class has different methods for acquiring different kinds of data, depending on the column type in the table. It is very important to know what kind of data you want to retrieve, because, in case of a mismatch, an exception will be thrown. For example, in the above code, if we change this line:
1 | String albumName = resultSet.getString( "name" ); |
to this:
1 | int albumName = resultSet.getInt( "name" ); |
we will immediately get an exception when we try to retrieve the first result.
1 2 3 4 5 6 7 8 9 | Printing result... java.sql.SQLException: Invalid value for getInt() - 'The White Album' at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2821) at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2846) at ResultSetExample.main(ResultSetExample.java:51) |
Generally, you need to be sure about the data types and use the right method. Some of the most common MySQL – Java relations are these:
- Varchar ->
getString(columnName)
: String - Char ->
getString(columnName)
: String - Integer ->
getInt(columnName)
: int - Float ->
getFloat(columnName)
: float - Boolean ->
getBoolean(columnName)
: boolean - Date ->
getDate(columnType)
: Date
In some cases, you can use the getString(columnName)
method to get the String representation of numbers, like Integer or Float, but this course of action is better to be avoided.
6. Download the source code
This was an example of how to use JDBC ResultSet in Java.
Last updated on Jul. 06th, 2020