7MCE1C3-Advanced Java Programming
7MCE1C3-Advanced Java Programming
Applications of JDBC
• Fundamentally, JDBC is a specification that provides a complete set of interfaces that allows
for portable access to an underlying database. Java can be used to write different types of
executables, such as,
▪ Java Applications
▪ Java Applets
▪ Java Servlets
▪ Java ServerPages (JSPs)
▪ Enterprise JavaBeans (EJBs).
• All of these different executables are able to use a JDBC driver to access a database, and
take advantage of the stored data.
• JDBC provides the same capabilities as ODBC, allowing Java programs to contain database-
independent code.
• The [Link] and [Link] are the primary packages for JDBC 4.0.
• It offers the main classes for interacting with your data sources.
• The new features in these packages include changes in the following are as,
▪ Automatic database driver loading.
▪ Exception handling improvements.
▪ Enhanced BLOB/CLOB functionality.
1
Advanced Java Programming JDBC
JDBC Architecture
• The JDBC API supports both two-tier and three-tier processing models for database access
but in general, JDBC Architecture consists of two layers −
▪ JDBC API: This provides the application-to-JDBC Manager connection.
▪ JDBC Driver API: This supports the JDBC Manager-to-Driver Connection.
• The JDBC API uses a driver manager and database-specific drivers to provide transparent
connectivity to heterogeneous databases.
• The JDBC driver manager ensures that the correct driver is used to access each data source.
The driver manager is capable of supporting multiple concurrent drivers connected to
multiple heterogeneous databases.
• Following is the architectural diagram, which shows the location of the driver manager with
respect to the JDBC drivers and the Java application
JDBC Components
2
Advanced Java Programming JDBC
• Connection: This interface with all methods for contacting a database. The connection
object represents communication context, i.e., all communication with database is through
connection object only.
• Statement: You use objects created from this interface to submit the SQL statements to the
database. Some derived interfaces accept parameters in addition to executing stored
procedures.
• ResultSet: These objects hold data retrieved from a database after you execute an SQL
query using Statement objects. It acts as an iterator to allow you to move through its data.
• SQLException: This class handles any errors that occur in a database application.
JDBC Driver
• JDBC drivers implement the defined interfaces in the JDBC API, for interacting with your
database server.
• For example, using JDBC drivers enable you to open database connections and to interact
with it by sending SQL or database commands then receiving results with Java.
• The [Link] package that ships with JDK, contains various classes with their behaviours
defined and their actual implementaions are done in third-party drivers. Third party
vendors implement the [Link] interface in their database driver.
• JDBC driver implementations vary because of the wide variety of operating systems and
hardware platforms in which Java operates.
• Sun has divided the implementation types into four categories:
▪ Type 1: JDBC-ODBC Bridge Driver
▪ Type 2: JDBC-Native API
▪ Type 3: JDBC-Net pure Java
▪ Type 4: 100% Pure Java
• In a Type 1 driver, a JDBC bridge is used to access ODBC drivers installed on each client
machine.
• Using ODBC, requires configuring on your system a Data Source Name (DSN) that
represents the target database.
3
Advanced Java Programming JDBC
• When Java first came out, this was a useful driver because most databases only supported
ODBC access but now this type of driver is recommended only for experimental use or
when no other alternative is available.
• The JDBC-ODBC Bridge that comes with JDK 1.2 is a good example of this kind of driver.
• In a Type 2 driver, JDBC API calls are converted into native C/C++ API calls, which are
unique to the database.
• These drivers are typically provided by the database vendors and used in the same manner
as the JDBC-ODBC Bridge. The vendor-specific driver must be installed on each client
machine.
• If we change the Database, we have to change the native API, as it is specific to a database
and they are mostly obsolete now, but you may realize some speed increase with a Type 2
driver, because it eliminates ODBC's overhead.
• In a Type 3 driver, a three-tier approach is used to access databases. The JDBC clients use
standard network sockets to communicate with a middleware application server.
4
Advanced Java Programming JDBC
• The socket information is then translated by the middleware application server into the call
format required by the DBMS, and forwarded to the database server.
• This kind of driver is extremely flexible, since it requires no code installed on the client and
a single driver can actually provide access to multiple databases.
• You can think of the application server as a JDBC "proxy," meaning that it makes calls for
the client application. As a result, you need some knowledge of the application server's
configuration in order to effectively use this driver type.
• Your application server might use a Type 1, 2, or 4 driver to communicate with the
database, understanding the nuances will prove helpful.
• In a Type 4 driver, a pure Java-based driver communicates directly with the vendor's
database through socket connection. This is the highest performance driver available for
the database and is usually provided by the vendor itself.
• This kind of driver is extremely flexible, you don't need to install special software on the
client or server. Further, these drivers can be downloaded dynamically.
• MySQL's Connector/J driver is a Type 4 driver. Because of the proprietary nature of their
network protocols, database vendors usually supply type 4 drivers.
5
Advanced Java Programming JDBC
• Extract data from result set: Requires that you use the
appropriate [Link]() method to retrieve the data from the result set.
• Clean up the environment: Requires explicitly closing all database resources versus
relying on the JVM's garbage collection.
• The Import statements tell the Java compiler where to find the classes you reference in
your code and are placed at the very beginning of your source code.
• To use the standard JDBC package, which allows you to select, insert, update, and delete
data in SQL tables, add the following imports to your source code
import [Link].* ; // for standard JDBC programs
import [Link].* ; // for BigDecimal and BigInteger support
• You must register the driver in your program before you use it. Registering the driver is the
process by which the Oracle driver's class file is loaded into the memory, so it can be
utilized as an implementation of the JDBC interfaces.
• You need to do this registration only once in your program. You can register a driver in one
of two ways.
1. Approach I - [Link]()
• The most common approach to register a driver is to use Java's [Link]() method,
to dynamically load the driver's class file into memory, which automatically registers it.
This method is preferable because it allows you to make the driver registration
configurable and portable.
• The following example uses [Link]( ) to register the Oracle driver −
try {
[Link]("[Link]");
}
catch(ClassNotFoundException ex) {
[Link]("Error: unable to load driver class!");
[Link](1);
}
6
Advanced Java Programming JDBC
• You can use getInstance() method to work around noncompliant JVMs, but then you'll
have to code for two extra Exceptions as follows −
try {
[Link]("[Link]").newInstance();
}
catch(ClassNotFoundException ex) {
[Link]("Error: unable to load driver class!");
[Link](1);
catch(IllegalAccessException ex) {
[Link]("Error: access problem while loading!");
[Link](2);
catch(InstantiationException ex) {
[Link]("Error: unable to instantiate driver!");
[Link](3);
}
2. Approach II - [Link]()
• The second approach you can use to register a driver, is to use the
static [Link]() method.
• You should use the registerDriver() method if you are using a non-JDK compliant JVM, such
as the one provided by Microsoft.
• The following example uses registerDriver() to register the Oracle driver
try {
Driver myDriver = new [Link]();
[Link]( myDriver );
}
catch(ClassNotFoundException ex) {
[Link]("Error: unable to load driver class!");
[Link](1);
}
• The most commonly used form of getConnection() requires you to pass a database URL,
a username, and a password:
• Assuming you are using Oracle's thin driver, you'll specify a host:port:databaseName value
for the database portion of the URL.
• If you have a host at TCP/IP address [Link] with a host name of amrood, and your Oracle
listener is configured to listen on port 1521, and your database name is EMP, then complete
database URL would be:
jdbc:oracle:thin:@amrood:1521:EMP
• Now call getConnection() method with appropriate username and password to get
a Connection object as follows:
String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
String USER = "username";
String PASS = "password"
Connection conn = [Link](URL, USER, PASS);
8
Advanced Java Programming JDBC
• At the end of your JDBC program, it is required explicitly to close all the connections to the
database to end each database session. However, if you forget, Java's garbage collector will
close the connection when it cleans up stale objects.
• Relying on the garbage collection, especially in database programming, is a very poor
programming practice. You should make a habit of always closing the connection with the
close() method associated with connection object.
• To ensure that a connection is closed, you could provide a 'finally' block in your code.
A finally block always executes, regardless of an exception occurs or not.
• To close the above opened connection, you should call close() method as follows:
[Link]();
• Explicitly closing a connection conserves DBMS resources, which will make your database
administrator happy.
Metadata
• Generally, Data about data is known as metadata.
• JDBC has two types of Meta data:
▪ DatabaseMetaData
▪ ResultsetMetaData
DatabaseMetaData
• The DatabaseMetaData interface provides methods to get information about the database
you have connected with like, database name, database driver version, maximum column
length etc...
• Following are some methods of DatabaseMetaData class.
Method Description
getDriverName() Retrieves the name of the current JDBC driver
getDriverVersion() Retrieves the version of the current JDBC
9
Advanced Java Programming JDBC
driver
getUserName() Retrieves the user name.
getDatabaseProductName() Retrieves the name of the current database.
getDatabaseProductVersion() Retrieves the version of the current database.
getNumericFunctions() Retrieves the list of the numeric functions
available with this database.
getStringFunctions() Retrieves the list of the numeric functions
available with this database.
getSystemFunctions() Retrieves the list of the system functions
available with this database.
getTimeDateFunctions() Retrieves the list of the time and date
functions available with this database.
getURL() Retrieves the URL for the current database.
supportsSavepoints() Verifies weather the current database
supports save points
supportsStoredProcedures() Verifies weather the current database
supports stored procedures.
supportsTransactions() Verifies weather the current database
supports transactions.
ResultsetMetaData
• The ResultSetMetaData provides information about the obtained ResultSet object like, the
number of columns, names of the columns, datatypes of the columns, name of the table etc…
• Following are some methods of ResultSetMetaData class.
Method Description
getColumnCount() Retrieves the number of columns in the current ResultSet object.
getColumnLabel() Retrieves the suggested name of the column for use.
getColumnName() Retrieves the name of the column.
getTableName() Retrieves the name of the table.
SQLException
• Exception handling allows you to handle exceptional conditions such as program-defined
errors in a controlled fashion.
• When an exception condition occurs, an exception is thrown. The term thrown means that
current program execution stops, and the control is redirected to the nearest applicable
catch clause. If no applicable catch clause exists, then the program's execution ends.
• JDBC Exception handling is very similar to the Java Exception handling but for JDBC, the
most common exception you'll deal with is [Link].
SQLException Methods
• An SQLException can occur both in the driver and the database. When such an exception
occurs, an object of type SQLException will be passed to the catch clause.
• The passed SQLException object has the following methods available for retrieving
additional information about the exception:
Method Description
getErrorCode( ) Gets the error number associated with the
10
Advanced Java Programming JDBC
exception.
getMessage( ) Gets the JDBC driver's error message for an
error, handled by the driver or gets the Oracle
error number and message for a database error.
getSQLState( ) Gets the XOPEN SQLstate string. For a JDBC
driver error, no useful information is returned
from this method. For a database error, the five-
digit XOPEN SQLstate code is returned. This
method can return null.
getNextException( ) Gets the next Exception object in the exception
chain.
printStackTrace( ) Prints the current exception, or throwable, and
it's backtrace to a standard error stream.
printStackTrace(PrintStream s) Prints this throwable and its backtrace to the
print stream you specify.
printStackTrace(PrintWriter w) Prints this throwable and it's backtrace to the
print writer you specify.
• By utilizing the information available from the Exception object, you can catch an exception
and continue your program appropriately. Here is the general form of a try block −
try {
// Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
// Your exception handling code goes between these
// curly braces, similar to the exception clause
// in a PL/SQL block.
}
finally {
// Your must-always-be-executed code goes between these
// curly braces. Like closing database connection.
}
SQLWarning
11
Advanced Java Programming JDBC
JDBC Statements
Statement Objects
Just as you close a Connection object to save database resources, for the same reason you should
also close the Statement object.
A simple call to the close() method will do the job. If you close the Connection object first, it will
close the Statement object as well. However, you should always explicitly close the Statement
object to ensure proper cleanup.
Statement stmt = null;
try {
stmt = [Link]( );
...
}
catch (SQLException e) {
...
}
finally {
[Link]();
}
The PreparedStatement interface extends the Statement interface, which gives you added
functionality with a couple of advantages over a generic Statement object.
This statement gives you the flexibility of supplying arguments dynamically.
13
Advanced Java Programming JDBC
• All of the Statement object's methods for interacting with the database (a) execute(), (b)
executeQuery(), and (c) executeUpdate() also work with the PreparedStatement object.
However, the methods are modified to use SQL statements that can input the parameters.
• Just as you close a Statement object, for the same reason you should also close the
PreparedStatement object.
• A simple call to the close() method will do the job. If you close the Connection object first, it
will close the PreparedStatement object as well. However, you should always explicitly
close the PreparedStatement object to ensure proper cleanup.
PreparedStatement pstmt = null;
try {
String SQL = "Update Employees SET age = ? WHERE id = ?";
pstmt = [Link](SQL);
...
}
catch (SQLException e) {
...
}
finally {
[Link]();
}
• Just as a Connection object creates the Statement and PreparedStatement objects, it also
creates the CallableStatement object, which would be used to execute a call to a database
stored procedure.
DELIMITER ;
• Three types of parameters exist: IN, OUT, and INOUT.
• The PreparedStatement object only uses the IN parameter.
• The CallableStatement object can use all the three. The following are the definitions:
Parameter Description
• The following code snippet shows how to employ the [Link]() method
to instantiate a CallableStatement object based on the preceding stored procedure −
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = [Link] (SQL);
...
}
catch (SQLException e) {
...
}
finally {
...
}
• The String variable SQL, represents the stored procedure, with parameter placeholders.
• Using the CallableStatement objects is much like using the PreparedStatement objects. You
must bind values to all the parameters before executing the statement, or you will receive
an SQLException.
• If you have IN parameters, just follow the same rules and techniques that apply to a
PreparedStatement object; use the setXXX() method that corresponds to the Java data type
you are binding.
• When you use OUT and INOUT parameters you must employ an additional
CallableStatement method, registerOutParameter(). The registerOutParameter() method
binds the JDBC data type, to the data type that the stored procedure is expected to return.
• Once you call your stored procedure, you retrieve the value from the OUT parameter with
the appropriate getXXX() method. This method casts the retrieved value of SQL type to a
Java data type.
15
Advanced Java Programming JDBC
• Just as you close other Statement object, for the same reason you should also close the
CallableStatement object.
• A simple call to the close() method will do the job. If you close the Connection object first, it
will close the CallableStatement object as well. However, you should always explicitly close
the CallableStatement object to ensure proper cleanup.
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = [Link] (SQL);
...
}
catch (SQLException e) {
...
}
finally {
[Link]();
}
JDBC Resutset
• The SQL statements that read data from a database query, return the data in a result set.
The SELECT statement is the standard way to select rows from a database and view them in
a result set. The [Link] interface represents the result set of a database query.
• A ResultSet object maintains a cursor that points to the current row in the result set. The
term "result set" refers to the row and column data contained in a ResultSet object.
• The methods of the ResultSet interface can be broken down into three categories −
▪ Navigational methods: Used to move the cursor around.
▪ Get methods: Used to view the data in the columns of the current row being
pointed by the cursor.
▪ Update methods: Used to update the data in the columns of the current row.
The updates can then be updated in the underlying database as well.
• The cursor is movable based on the properties of the ResultSet. These properties are
designated when the corresponding Statement that generates the ResultSet is created.
• JDBC provides the following connection methods to create statements with desired
ResultSet −
▪ createStatement(int RSType, int RSConcurrency);
▪ prepareStatement(String SQL, int RSType, int RSConcurrency);
▪ prepareCall(String sql, int RSType, int RSConcurrency);
• The first argument indicates the type of a ResultSet object and the second argument is one
of two ResultSet constants for specifying whether a result set is read-only or updatable.
Types of ResultSet
• The possible RSType are given below. If you do not specify any ResultSet type, you will
automatically get one that is TYPE_FORWARD_ONLY.
16
Advanced Java Programming JDBC
Type Description
ResultSet.TYPE_FORWARD_ONLY The cursor can only move forward in the result set.
ResultSet.TYPE_SCROLL_INSENSITIVE The cursor can scroll forward and backward, and the result
set is not sensitive to changes made by others to the
database that occur after the result set was created.
ResultSet.TYPE_SCROLL_SENSITIVE. The cursor can scroll forward and backward, and the result
set is sensitive to changes made by others to the database
that occur after the result set was created.
Concurrency of ResultSet
• The possible RSConcurrency are given below. If you do not specify any Concurrency type,
you will automatically get one that is CONCUR_READ_ONLY.
Concurrency Description
ResultSet.CONCUR_READ_ONLY Creates a read-only result set. This is the default
ResultSet.CONCUR_UPDATABLE Creates an updateable result set.
• There are several methods in the ResultSet interface that involve moving the cursor,
including
S. No Methods & Description
public void beforeFirst() throws SQLException:
1
Moves the cursor just before the first row.
public void afterLast() throws SQLException
2
Moves the cursor just after the last row.
public boolean first() throws SQLException
3
Moves the cursor to the first row.
public void last() throws SQLException
4
Moves the cursor to the last row.
public boolean absolute(int row) throws SQLException
5
Moves the cursor to the specified row.
6 public boolean relative(int row) throws SQLException
17
Advanced Java Programming JDBC
Moves the cursor the given number of rows forward or backward, from where it is
currently pointing.
public boolean previous() throws SQLException
7 Moves the cursor to the previous row. This method returns false if the previous
row is off the result set.
public boolean next() throws SQLException
8 Moves the cursor to the next row. This method returns false if there are no more
rows in the result set.
public int getRow() throws SQLException
9
Returns the row number that the cursor is pointing to.
public void moveToInsertRow() throws SQLException
10 Moves the cursor to a special row in the result set that can be used to insert a new
row into the database. The current cursor location is remembered.
public void moveToCurrentRow() throws SQLException
11 Moves the cursor back to the current row if the cursor is currently at the insert
row; otherwise, this method does nothing
• The ResultSet interface contains dozens of methods for getting the data of the current row.
• There is a get method for each of the possible data types, and each get method has two
versions −
▪ One that takes in a column name.
▪ One that takes in a column index.
• For example, if the column you are interested in viewing contains an int, you need to use
one of the getInt() methods of ResultSet
S. No Methods & Description
public int getInt(String columnName) throws SQLException
1
Returns the int in the current row in the column named columnName.
public int getInt(int columnIndex) throws SQLException
2 Returns the int in the current row in the specified column index. The column index starts
at 1, meaning the first column of a row is 1, the second column of a row is 2, and so on.
• Similarly, there are get methods in the ResultSet interface for each of the eight Java
primitive types, as well as common types such as [Link], [Link], and
[Link].
• There are also methods for getting SQL data types [Link], [Link],
[Link], [Link], and [Link]. Check the documentation for more
information about using these SQL data types.
• The ResultSet interface contains a collection of update methods for updating the data of a
result set.
• As with the get methods, there are two update methods for each data type −
▪ One that takes in a column name.
▪ One that takes in a column index.
• For example, to update a String column of the current row of a result set, you would use one
of the following updateString() methods:
18
Advanced Java Programming JDBC
19