
- •Contents at a Glance
- •Contents
- •About the Authors
- •About the Technical Reviewer
- •Acknowledgments
- •Introduction
- •Oracle Java Certifications: Overview
- •FAQ 1. What are the different levels of Oracle Java certification exams?
- •FAQ 4. Is OCPJP 7 prerequisite for other Oracle certification exams?
- •FAQ 5. Should I take the OCPJP 7 or OCPJP 6 exam?
- •The OCPJP 7 Exam
- •FAQ 7. How many questions are there in the OCPJP 7 exam?
- •FAQ 8. What is the duration of the OCPJP 7 exam?
- •FAQ 9. What is the cost of the OCPJP 7 exam?
- •FAQ 10. What are the passing scores for the OCPJP 7 exam?
- •FAQ 11. What kinds of questions are asked in the OCPJP 7 exam?
- •FAQ 12. What does the OCPJP 7 exam test for?
- •FAQ 13. I’ve been a Java programmer for last five years. Do I have to prepare for the OCPJP 7 exam?
- •FAQ 14. How do I prepare for the OCPJP 7 exam?
- •FAQ 15. How do I know when I’m ready to take the OCPJP 7 exam?
- •Taking the OCPJP 7 Exam
- •FAQ 16. What are my options to register for the exam?
- •FAQ 17. How do I register for the exam, schedule a day and time for taking the exam, and appear for the exam?
- •The OCPJP 7 Exam: Pretest
- •Answers with Explanations
- •Post-Pretest Evaluation
- •Essentials of OOP
- •FunPaint Application: An Example
- •Foundations of OOP
- •Abstraction
- •Encapsulation
- •Inheritance
- •Polymorphism
- •Class Fundamentals
- •Object Creation
- •Constructors
- •Access Modifiers
- •Public Access Modifier
- •Private Access Modifier
- •Protected and Default Access Modifier
- •Overloading
- •Method Overloading
- •Constructor Overloading
- •Overload resolution
- •Points to Remember
- •Inheritance
- •Runtime Polymorphism
- •An Example
- •Overriding Issues
- •Overriding: Deeper Dive
- •Invoking Superclass Methods
- •Type Conversions
- •Upcasts and Downcasts
- •Casting Between Inconvertible Types
- •Using “instanceof” for Safe Downcasts
- •Java Packages
- •Working with Packages
- •Static Import
- •Summary
- •Abstract Classes
- •Points to Remember
- •Using the “final” Keyword
- •Final Classes
- •Final Methods and Variables
- •Points to Remember
- •Using the “static” Keyword
- •Static Block
- •Points to Remember
- •Flavors of Nested Classes
- •Static Nested Classes (or Interfaces)
- •Points to Remember
- •Inner Classes
- •Points to Remember
- •Local Inner Classes
- •Points to Remember
- •Anonymous Inner Classes
- •Points to Remember
- •Enum Data Types
- •Points to Remember
- •Summary
- •Interfaces
- •Declaring and Using Interfaces
- •Points to Remember
- •Abstract Classes vs. Interfaces
- •Choosing Between an Abstract Class and an Interface
- •Object Composition
- •Composition vs. Inheritance
- •Points to Remember
- •Design Patterns
- •The Singleton Design Pattern
- •Ensuring That Your Singleton Is Indeed a Singleton
- •The Factory Design Pattern
- •Differences Between Factory and Abstract Factory Design Patterns
- •The Data Access Object (DAO) Design Pattern
- •Points to Remember
- •Summary
- •Generics
- •Using Object Type and Type Safety
- •Using the Object Class vs. Generics
- •Container Implementation Using the Object Class
- •Container Implementation Using Generics
- •Creating Generic Classes
- •Diamond Syntax
- •Interoperability of Raw Types and Generic Types
- •Generic Methods
- •Generics and Subtyping
- •Wildcard Parameters
- •Limitations of Wildcards
- •Bounded Wildcards
- •Wildcards in the Collections Class
- •Points to Remember
- •The Collections Framework
- •Why Reusable Classes?
- •Basic Components of the Collections Framework
- •Abstract Classes and Interfaces
- •Concrete Classes
- •List Classes
- •ArrayList Class
- •The ListIterator Interface
- •The LinkedList Class
- •The Set Interface
- •The HashSet Class
- •The TreeSet Class
- •The Map Interface
- •The HashMap Class
- •Overriding the hashCode() Method
- •The NavigableMap Interface
- •The Queue Interface
- •The Deque Interface
- •Comparable and Comparator Interfaces
- •Algorithms (Collections Class)
- •The Arrays Class
- •Methods in the Arrays Class
- •Array as a List
- •Points to Remember
- •Summary
- •Generics
- •Collections Framework
- •Processing Strings
- •String Searching
- •The IndexOf() Method
- •The regionMatches() Method
- •String Parsing
- •String Conversions
- •The Split() Method
- •Regular Expressions
- •Understanding regex Symbols
- •Regex Support in Java
- •Searching and Parsing with regex
- •Replacing Strings with regex
- •String Formatting
- •Format Specifiers
- •Points to Remember
- •Summary
- •Reading and Writing from Console
- •Understanding the Console Class
- •Formatted I/O with the Console Class
- •Special Character Handling in the Console Class
- •Using Streams to Read and Write Files
- •Character Streams and Byte Streams
- •Character Streams
- •Reading Text Files
- •Reading and Writing Text Files
- •“Tokenizing” Text
- •Byte Streams
- •Reading a Byte Stream
- •Data Streams
- •Writing to and Reading from Object Streams: Serialization
- •Serialization: Some More Details
- •Points to Remember
- •Summary
- •A Quick History of I/O APIs
- •Using the Path Interface
- •Getting Path Information
- •Comparing Two Paths
- •Using the Files Class
- •Checking File Properties and Metadata
- •Copying a File
- •Moving a File
- •Deleting a File
- •Walking a File Tree
- •Revisiting File Copy
- •Finding a File
- •Watching a Directory for Changes
- •Points to Remember
- •Summary
- •Introduction to JDBC
- •The Architecture of JDBC
- •Two-Tier and Three-Tier JDBC Architecture
- •Types of JDBC Drivers
- •Setting Up the Database
- •Connecting to a Database Using a JDBC Driver
- •The Connection Interface
- •Connecting to the Database
- •Statement
- •ResultSet
- •Querying the Database
- •Updating the Database
- •Getting the Database Metadata
- •Points to Remember
- •Querying and Updating the Database
- •Performing Transactions
- •Rolling Back Database Operations
- •The RowSet Interface
- •Points to Remember
- •Summary
- •Define the Layout of the JDBC API
- •Connect to a Database by Using a JDBC driver
- •Update and Query a Database
- •Customize the Transaction Behavior of JDBC and Commit Transactions
- •Use the JDBC 4.1 RowSetProvider, RowSetFactory, and RowSet Interfaces
- •Introduction to Exception Handling
- •Throwing Exceptions
- •Unhandled Exceptions
- •Try and Catch Statements
- •Programmatically Accessing the Stack Trace
- •Multiple Catch Blocks
- •Multi-Catch Blocks
- •General Catch Handlers
- •Finally Blocks
- •Points to Remember
- •Try-with-Resources
- •Closing Multiple Resources
- •Points to Remember
- •Exception Types
- •The Exception Class
- •The RuntimeException Class
- •The Error Class
- •The Throws Clause
- •Method Overriding and the Throws Clause
- •Points to Remember
- •Custom Exceptions
- •Assertions
- •Assert Statement
- •How Not to Use Asserts
- •Summary
- •Introduction
- •Locales
- •The Locale Class
- •Getting Locale Details
- •Resource Bundles
- •Using PropertyResourceBundle
- •Using ListResourceBundle
- •Loading a Resource Bundle
- •Naming Convention for Resource Bundles
- •Formatting for Local Culture
- •The NumberFormat Class
- •The Currency Class
- •The DateFormat Class
- •The SimpleDateFormat Class
- •Points to Remember
- •Summary
- •Introduction to Concurrent Programming
- •Important Threading-Related Methods
- •Creating Threads
- •Extending the Thread Class
- •Implementing the Runnable Interface
- •The Start( ) and Run( ) Methods
- •Thread Name, Priority, and Group
- •Using the Thread.sleep() Method
- •Using Thread’s Join Method
- •Asynchronous Execution
- •The States of a Thread
- •Two States in “Runnable” State
- •Concurrent Access Problems
- •Data Races
- •Thread Synchronization
- •Synchronized Blocks
- •Synchronized Methods
- •Synchronized Blocks vs. Synchronized Methods
- •Deadlocks
- •Other Threading Problems
- •Livelocks
- •Lock Starvation
- •The Wait/Notify Mechanism
- •Let’s Solve a Problem
- •More Thread States
- •timed_waiting and blocked States
- •waiting State
- •Using Thread.State enum
- •Understanding IllegalThreadStateException
- •Summary
- •Using java.util.concurrent Collections
- •Semaphore
- •CountDownLatch
- •Exchanger
- •CyclicBarrier
- •Phaser
- •Concurrent Collections
- •Apply Atomic Variables and Locks
- •Atomic Variables
- •Locks
- •Conditions
- •Multiple Conditions on a Lock
- •Use Executors and ThreadPools
- •Executor
- •Callable, Executors, ExecutorService, ThreadPool, and Future
- •ThreadFactory
- •The ThreadLocalRandom Class
- •TimeUnit Enumeration
- •Use the Parallel Fork/Join Framework
- •Useful Classes of the Fork/Join Framework
- •Using the Fork/Join Framework
- •Points to Remember
- •Summary
- •Using java.util.concurrent Collections
- •Applying Atomic Variables and Locks
- •Using Executors and ThreadPools
- •Using the Parallel Fork/Join Framework
- •Chapter 3: Java Class Design
- •Chapter 4: Advanced Class Design
- •Chapter 5: Object-Oriented Design Principles
- •Chapter 6: Generics and Collections
- •Chapter 7: String Processing
- •Chapter 8: Java I/O Fundamentals
- •Chapter 9: Java File I/O (NIO.2)
- •Chapter 10: Building Database Applications with JDBC
- •Chapter 11: Exceptions and Assertions
- •Chapter 12: Localization
- •Chapter 13: Threads
- •Chapter 14: Concurrency
- •OCPJP7 Exam (1Z0-804 a.k.a. Java SE 7 Programmer II) Topics
- •OCPJP 7 Exam (1Z0-805, a.k.a. Upgrade to Java SE 7 Programmer) Topics
- •Answers and Explanations
- •Answer Sheet
- •Answers and Explanations
- •Index

Chapter 10
Building Database Applications with JDBC
Define the layout of the JDBC API
Connect to a database by using a JDBC driver
Update and query a database
Exam Topics
Customize the transaction behavior of JDBC and commit transactions
Use the JDBC 4.1 RowSetProvider,
RowSetFactory, and RowSet interfaces
JDBC (Java DataBase Connectivity) is an important Java API that defines how a client accesses a database. As such, it is critical in building large-scale enterprise Java solutions. As an Oracle certified programmer, it is expected that you understand JDBC and its related features. You can use JDBC to perform database operations such as inserting, updating, and creating database entities as well as executing SQL queries. Using JDBC support, you can also perform transactions on the database.
This chapter discusses JDBC features in terms of ResultSet, Connection, and Statement implementations. JDBC 4.1 introduces RowSet and its related utility classes such as RowSetFactory and RowSetProvider, which are also discussed in this chapter.
The JDBC classes are part of the packages java.sql.* and javax.sql.*. In this chapter, we assume that you’re already familiar with SQL queries and have some basic understanding of database concepts.
Introduction to JDBC
When you write applications for solving real-world problems, you routinely come upon requirements where you need to store, navigate, and modify data. In an enterprise environment, you need to work with DBMSs (Database Management Systems) to handle the large amounts of data you have. However, interacting with DBMSs (henceforth,
281

Chapter 10 ■ Building Database Applications with JDBC
we simply refer to DBMSs as databases) is not really trivial or straightforward. Numerous enterprise and open source database systems are available today and they differ from each other: DB2, SQL Server, MySQL, Oracle, and many more. This heterogeneity of popular databases makes it difficult write code that can be used with any database.
To solve these problems and to make your life easy, Java offers JDBC. JDBC is a set of APIs provided by Java to programmatically interact with various databases.
At a high level, interacting with a database involves the following steps:
•Establishing a connection to a database.
•Executing SQL queries to retrieve, create, or modify a database.
•Closing the connection to the database.
Java provides a set of APIs (i.e., JDBC) to carry out these activities with databases. In other words, you can use JDBC to establish a connection to a database, execute your SQL query, and close the connection with the database. The beauty of JDBC is that you are not writing a program for a specific database. JDBC creates loose coupling between your Java program and the type of database used. For instance, databases may differ in how they establish a connection (for instance, the API name may differ with databases). JDBC hides all the heterogeneity of these databases and offers a single set of APIs to interact with all types of databases.
The Architecture of JDBC
Let’s examine the vital components of JDBC and how these components work together to achieve seamless integration with databases. A simplified architecture of JDBC is graphically represented in Figure 10-1. A Java application uses JDBC APIs to interact with databases. JDBC APIs interact with the JDBC driver manager to transparently connect and perform various database activities with different types of databases. The JDBC driver manager uses various JDBC drivers to connect to their specific DBMSs.
Java Applications
JDBC APIs
JDBC Driver Manager
JDBC Driver |
|
JDBC Driver |
|
JDBC Driver |
|||
(ODBC) |
|
(Oracle) |
|
(MySQL) |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ODBC |
|
Oracle |
|
MySQL |
|||
|
|
|
|
|
|
|
|
Figure 10-1. JDBC architecture
In this context, JDBC drivers and the driver manager play a key role in realizing the objective of JDBC. JDBC drivers are specifically designed to interact with their respective DBMSs. The driver manager works as a directory of JDBC drivers—in other words, it maintains a list of available data sources and their drivers. The driver manager
282
Chapter 10 ■ Building Database Applications with JDBC
chooses an appropriate driver to communicate to the respective DBMS. It can manage multiple concurrent drivers connected to their respective data sources.
You can observe here that the complexity of heterogeneous interactions is delegated to the JDBC driver manager and JDBC drivers; hence all the details and complications are hidden by the JDBC API from the application developer.
Two-Tier and Three-Tier JDBC Architecture
Broadly, JDBC architectures can be seen in two major configurations: two-tier and three-tier. In a two-tier configuration, a Java application along with a JDBC driver constitutes the first tier as a client. On the other hand, the database works as a server that fulfills the requirements sent from the clients. Typically, the database resides on a different machine connected through the network.
The first tier in a three-tier configuration is a lightweight Java application (an applet, for instance) that communicates to the application server (the second tier). The application server in turn forwards the request to the database (the third tier). In this configuration, the middle tier plays a vital role since the behavior of the configuration can be fine-tuned based on the requirements (for instance, enforcing access control).
Types of JDBC Drivers
There are a number of types of JDBC drivers that have emerged, and they are being used by the industry based on preference and needs. They can be categorized based on the technology used to communicate to the actual respective DBMS. The type of these drivers can play a critical role when selecting an appropriate DBMS for a Java application. There are four types of JDBC drivers:
•JDBC-ODBC bridge drivers (type 1): You may already know about ODBC (Open Database Connectivity), which is a portable middleware API written in C for accessing databases. The first category belongs to the drivers that are designed to work with ODBC drivers; they play the role of a bridge from a Java application to an ODBC driver. Such drivers are useful especially in cases when the ODBC driver for the DBMS is available. The JDBC driver calls the ODBC native calls using Java Native Interface (JNI). The drivers from this category might not be suitable for applets since often client-side software and an ODBC driver are required for this bridge to work properly.
•Native-API driver (type 2): The database drivers belonging to this category use client-side libraries of a specific database and convert JDBC calls to native database calls. Mostly, these drivers are not written entirely in Java, and hence are not portable. These drivers are not suitable for Java applets since they require proprietary client software installed on client machines. However, these drivers are typically faster than type 1 drivers.
•The network-protocol driver (type 3): This type of database driver implements a three-tier architecture where JDBC calls are converted to native database calls via a middleware implementation. In other words, the driver calls database middleware and the middleware actually converts JDBC calls to database specific native calls. Typically, the driver is implemented in Java, which does not require any other client implementation at client side; hence they could be employed in Internet-based applications. However, these drivers are typically slower than type 2 drivers.
•Native-protocol driver (type 4): Such drivers are implemented in Java completely, so they are platform independent. Drivers belonging to this category directly make database specific calls over the network without any support of additional client side libraries. These drivers are the most flexible database drivers among all other database types. These drivers perform better than other driver types. However, these drivers may be lacking in covering the security aspects of database access.
For an enterprise application, you need to select an appropriate driver based on the requirements.
283
Chapter 10 ■ Building Database Applications with JDBC
Setting Up the Database
Before you start exploring JDBC APIs and their usage with the help of examples, first you must configure a database with which you will work. The database needs to be configured properly before you start writing JDBC programs. You can use any widely available database. In this chapter, we will use MySQL to explain various aspects of JDBC APIs since this database is free and widely available. Hence, we are showing steps to set up a MySQL database on your machine assuming that you use Windows (if you are using another operating system, these steps will slightly differ):
•The first step is to download the appropriate installer for your platform. For MySQL database, you may download the latest installer from the MySQL download page (www.mysql.com/ downloads/mysql/).
•Once the installer gets downloaded, the next step is to install it. You must have admin privileges in your machine to install the software. You need to invoke the installer and follow all the steps shown by the installation wizard. Keep the default values and complete the installation. The installer will ask you to provide a root password; remember it because it will be used in these examples.
•The next step is to download the database connector. The database connector only will allow you to connect to the database. You can download the connector for MySQL from its connector download page (http://dev.mysql.com/downloads/connector/j/).
•Do not forget to add the path of the connector to the classpath. If the connector name is mysql-connector-java-5.1.21-bin.jar stored in C:\mysql-connector-java-5.1.21, then add c:\ mysql-connector-java-5.1.21\mysql-connector-java-5.1.21-bin.jar to the classpath.
•Invoke the command-line client of MySQL (in our case, it is “MySQL 5.5 Command Line Client” shown in start menu). You will get a MySQL prompt once you provide the root password, as shown here:
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1
Server version: 5.5.27 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> /* Let's create a database for our use.*/
mysql> create database addressBook;
Query OK, 1 row affected (0.01 sec)
mysql> /* Now, let's create a table in this database and insert two records for our use later. */
mysql> use addressBook;
Database changed
mysql> create table contact (id int not null auto_increment, firstName varchar(30) Not null, lastName varchar(30), email varchar(30), phoneNo varchar(13), primary key (id));
Query OK, 0 rows affected (0.20 sec)
284