Example 12-2 used a Connection object, representing a
physical connection to the database. Now you can use this Connection object to create
Statement objects. Statement objects are JDBC's way of
getting SQL statements to the database.
There are three main types of Statement objects: the base class
Statement, the PreparedStatement, and the
CallableStatement.
To create a Statement object, use the
createStatement method as shown in Example 12-3:
Example 12-3. A JDBC statement object
Statement s = c.createStatement();
Example 12-3 creates a Statement object
named s, from the Connection object
c. You can now use this Statement object to execute
queries and updates on the database.
There are two main methods in the Statement class that are important. The first is
executeQuery. This method takes one argument, the SQL statement to be executed, and
returns an object of type ResultSet, which is discussed later. This method is used for
executing queries which will return a set of data back, for instance, a SELECT statement.
The ResultSet object returned represents the data resulting from the query.
Example 12-4 retrieves some data from the booktown
database:
Example 12-4. A simple JDBC select
Statement s = null;
try {
s = c.createStatement();
} catch (SQLException se) {
System.out.println("We got an exception while creating a statement:" +
"that probably means we're no longer connected.");
se.printStackTrace();
System.exit(1);
}
ResultSet rs = null;
try {
rs = s.executeQuery("SELECT * FROM books");
} catch (SQLException se) {
System.out.println("We got an exception while executing our query:" +
"that probably means our SQL is invalid");
se.printStackTrace();
System.exit(1);
}
int index = 0;
try {
while (rs.next()) {
System.out.println("Here's the result of row " + index++ + ":");
System.out.println(rs.getString(1));
}
} catch (SQLException se) {
System.out.println("We got an exception while getting a result:this " +
"shouldn't happen: we've done something really bad.");
se.printStackTrace();
System.exit(1);
}
Example 12-4 creates a Statement object, and then uses that
Statement object's executeQuery method to execute the
query SELECT * FROM books. You get back a ResultSet, and
use that ResultSet to print out some of the information you got back.
The ResultSet object is our primary interface for fetching information from the
database. It has two main features. It can step through the set of rows returned, and it can return the value for a
specific column in that row. It works in a similar fashion to a standard Java Enumeration: it starts before the first
element, and you use the next method to step through the rest of the elements.
next returns true if the ResultSet was able to step
to the next results; that is to say, there are results to be read. The while loop in Example 12-4 will print out the first column of each of the rows returned. If no rows were returned,
next will return false initially, representing this fact, and therefore nothing will be
printed.
ResultSet can return values of all sorts of different types; Example 12-4 treats the first column as if it were a String. Fortunately,
all standard SQL data types can be represented as String, so regardless of the type of the
first column, you will be able to fetch the value of the first column and print it out. There are many other methods
available on ResultSet, including methods for fetching all of the various SQL data types
and converting them to native Java types. Consult the API documentation on ResultSet for
more information.
The other important method is executeUpdate. This method, again, takes one argument,
which is the SQL statement to be executed. The difference between executeQuery and
executeUpdate is that executeUpdate is for executing
statements that change data in the database. For example, use executeUpdate to execute a
CREATE an INSERT or an
UPDATE statement. executeUpdate returns an
int, and the value of that int corresponds to the number
of records that were modified.
Example 12-5 uses the executeUpdate method to insert a new row
into the books table.
Example 12-5. A simple JDBC insert
Statement s = null;
try {
s = c.createStatement();
} catch (SQLException se) {
System.out.println("We got an exception while creating a statement:" +
"that probably means we're no longer connected.");
se.printStackTrace();
System.exit(1);
}
int m = 0;
try {
m = s.executeUpdate("INSERT INTO books VALUES " +
"(41472, 'Practical PostgreSQL', 1212, 4)");
} catch (SQLException se) {
System.out.println("We got an exception while executing our query:" +
"that probably means our SQL is invalid");
se.printStackTrace();
System.exit(1);
}
System.out.println("Successfully modified " + m + " rows.\n");