You are on page 1of 37

Java II--Copyright © 2001-2004 Tom Hunter

Chapter 18
JDBC

Java II--Copyright © 2001-2004 Tom Hunter


Background: databases

Java II--Copyright © 2001-2004 Tom Hunter


Background: databases
• Types of databases
--Hierarchical
--Relational
--Object Relational

Java II--Copyright © 2001-2004 Tom Hunter


Background: databases
• Types of databases
--Hierarchical-the first database, invented by IBM,
called IMS.

Java II--Copyright © 2001-2004 Tom Hunter


Background: databases
• Types of databases

--Relational-the most common, invented by IBM but


first marketed by Oracle. Examples:
Oracle
DB2
Sybase
Access*

* Toy Database
Java II--Copyright © 2001-2004 Tom Hunter
Background: databases
• Types of databases

--Object Relational-uncommon, attempts to place


objects in the database.

Java II--Copyright © 2001-2004 Tom Hunter


Relational Databases

Java II--Copyright © 2001-2004 Tom Hunter


Relational Databases: Entity Integrity
• Unit of the Table, smallest unit in a relational database
• For a table to be useful, it must enforce Entity Integrity.

Entity Integrity—each row in a table can be located


by using its Primary Key.
1st Law of Relational Databases
Each row in a table must have an attribute(s) that
uniquely locates one row. Values in this attribute must be
unique.

2nd Law of Relational Databases


The primary key attribute(s) cannot contain a null
value
Java II--Copyright © 2001-2004 Tom Hunter
Relational Databases: Entity Integrity
• Here is a sample
table, USER Primary Key—must uniquely
identify a row. No nulls allowed.
ID LastName FirstName Age
1 Jones Sam 32
2 Jones Angela 27
3 Smith Ann 22
4 Doe Jack 44

Java II--Copyright © 2001-2004 Tom Hunter


Relational Databases: Entity Integrity
• Here is another sample
table, CODE Primary Key—must uniquely
identify a row. No nulls.
Code Message
A Bill Paid
B Bill Overdue
C Account written off
D Account closed

Java II--Copyright © 2001-2004 Tom Hunter


Relational Databases: Referential Integrity
• A “foreign key” is when the primary key of one table is
repeated in a second table as a non primary key.
• Using foreign keys, or “referential integrity” allows us to
link tables.

3rd Law of Relational Databases


If you link two tables with a foreign key, any values
present in the foreign-key attribute column must link back
to existing primary-key values.

4th Law of Relational Databases


It is okay for a foreign key column to contain nulls.

Java II--Copyright © 2001-2004 Tom Hunter


Relational Databases: Referential Integrity
This is the primary key for another table. This column can
contain nulls. However, any values present must exist in the
table that is referred to. This is a “foreign key”.

IDID LastName
LastName FirstName
FirstName Age
Age Code
1 1 Jones
Jones Sam
Sam 32
32 A
2 2 Jones
Jones Angela
Angela 27
27 B
33 Smith
Smith Ann
Ann 22
22 A
44 Doe
Doe Jack
Jack 44
44

Java II--Copyright © 2001-2004 Tom Hunter


SQL Basics

Java II--Copyright © 2001-2004 Tom Hunter


SQL Basics: Structure of a SQL Statement
• When accessing a relational database, you must use the
“Structured Query Language” (SQL)

• Several types of SQL:


queries—for asking questions
updates—for making changes
insert—for adding new data
DDL—for creating tables

Java II--Copyright © 2001-2004 Tom Hunter


SQL Basics: Structure of a SQL Statement
• Queries: SELECT statements

SELECT columns FROM table;

Or if we wish not to select all columns:

SELECT columns
FROM table
WHERE expression

Java II--Copyright © 2001-2004 Tom Hunter


SQL Basics: Structure of a SQL Statement
• Queries: SELECT statements

SELECT FirstName, LastName


FROM USER
WHERE ID = 2;

Java II--Copyright © 2001-2004 Tom Hunter


SQL Basics: Structure of a SQL Statement
• Updates: UPDATE statements

UPDATE table SET column = value;

Example:

UPDATE table
SET LastName = ‘Jones’
WHERE ID = 2;

Java II--Copyright © 2001-2004 Tom Hunter


SQL Basics: Structure of a SQL Statement
• Insert: INSERT statements

INSERT INTO table VALUES(values);

Example:

INSERT INTO USER


VALUES( ‘6’, ‘Anderson’, ‘Joe’, 44, ‘A’)

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics:
Connection

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: Connection
• The first step toward connecting to a database is getting a
database connection.

• Before you can get a connection, you need a database


driver.

• The driver makes the connection between a particular


database and our Java program.

• These drivers are individual to each vendor’s database.

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: Connection
• To make sure your driver is available, you use the
following:

Class.forName( “sun.jdbc.odbc.JdbcOdbcDriver” );

• The above statement will merely ensure that the Java class
containing the driver is available to our program.

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: Connection
• The statement below results in a connection to the database.
import java.sql.Connection;

Connection con = DriverManager.getConnection( url, user, pass );

• To create a connection using this method, it is necessary to


pass three arguments to the method:

username
password
url

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: url
• The Url is a special string of characters that finds the
database.
• Here is a sample Url:

url = jdbc:oracle:thin:@myhostname:1521:OurDB

jdbc:oracle:thin:@ —This is database specific

myhostname —This is the name of the host where the database is located.

1521 —This is the port on the host where the database is listening.

OurDB —This is the name of the database.

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: Connection
• The DriverManager is convenient but not scalable.

import java.sql.Connection;

Connection con = DriverManager.getConnection( url, user, pass );

• Once you have opened a connection to the database, you


must realize this is a resource.

• You must close the connection you opened.

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: Statements
• After you have a connection, you need to create a statement.
• There are three alternatives, each with plusses and minuses.
Statement—used for a query that will be executed once.

PreparedStatement—used for a query that will be executed multiple times

CallableStatement—used for a query that executes a stored procedure.

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: Statement
• The Statement object is the easiest to work with.
• The Statement object is the least efficient.

String query = “SELECT * FROM MYTABLE WHERE ID = 2”;

Connection con = DriverManager.getConnection( url, user, pass );

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery( query );

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: PreparedStatement
• The PreparedStatement object requires more work.
• The PreparedStatement object is the most efficient.
• The query contains a question mark that is replaced.
String query = “SELECT * FROM MYTABLE WHERE ID = ?”;

Connection con = DriverManager.getConnection( url, user, pass );

PreparedStatement pstmt = con.prepareStatement( query );


pstmt.setString( 1, 494 );
This line substitutes 494 for the
first question mark in the query.

ResultSet rs = pstmt.executeQuery();

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: CallableStatement
• The CallableStatement object is only appropriate
for calling a stored procedure.
• The syntax of how you call the stored procedure is
database specific.
String call = “{ call myProcdure }”;

Connection con = DriverManager.getConnection( url, user, pass );

CallableStatement cstmt = con.prepareCall( call );

ResultSet rs = cstmt.executeQuery();

Java II--Copyright © 2001-2004 Tom Hunter


JDBC Basics: ResultSet
• The ResultSet object receives the results of the query.

String query = “SELECT COL1, COL2 FROM MYTABLE WHERE ID = 2”;

Connection con = DriverManager.getConnection( url, user, pass );

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery( query );

while( rs.next() ) next() returns true while there are results


{
String myCol1 = rs.getString( “COL1” );
String myCol2 = rs.getString( “COL2” );
}

These correspond to
columns in the original
query.
Java II--Copyright © 2001-2004 Tom Hunter
JDBC Basics: ResultSet
• No matter which kind of statement you choose, the
ResultSet object is used the same way.
• As with the Connection object, you must close your
ResultSet!

Java II--Copyright © 2001-2004 Tom Hunter


try
{
String output = null;
String query = “SELECT username from MYTABLE where pass=‘foo’ ”;
Connection con = DriverManager.getConnection( url, us, pass);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery( query );

while( rs.next() )
{
output = rs.getString( “username” );
}

rs.close();
stmt.close(); You must close these
con.close();
} three items, in the reverse
catch( SQLException sql ) order that you opened
{
System.out.println( “Uh oh…” ); them!
}

Java II--Copyright © 2001-2004 Tom Hunter


DataSource

Java II--Copyright © 2001-2004 Tom Hunter


DataSource
• As I said, the DriverManager is not the best choice for
a production system. It doesn’t scale well.

• A better alternative is using a DataSource.

• A DataSource offers connection pooling, where new


connections are not thrown away but are instead set aside for
the next time someone needs a connection.

Java II--Copyright © 2001-2004 Tom Hunter


DataSource: Need to Lookup in JNDI
• To use a DataSource, it is necessary to perform a lookup of
the resource in something called JNDI
[ JNDI = Java Naming and Directory Interface ]

• JNDI stores a list of names that associate with resources

Java II--Copyright © 2001-2004 Tom Hunter


DataSource: Need to Lookup in JNDI
• First we need to create an InitialContext so we can
lookup that DataSource This is the name I
assigned to the
Context ctx = new InitialContext();
DataSource when I
created it. Here, I’m just
String dbJNDI = "java:comp/env/OracleJDBC";
looking it up under the
name I stored it

DataSource ds = (DataSource) ctx.lookup( dbJNDI );

Connection con = ds.getConnection();

Java II--Copyright © 2001-2004 Tom Hunter


DataSource:Complexity of setup
• Using a DataSource is very valuable because it allows
connection pooling.
• The downside of using a DataSource is the complexity of
its setup. Also, each Application Server vendor has its own
unique setup. You will need to learn these*.

* Please refer to “Setting up a DataSource in WebSphere Application Server 5.1”

Java II--Copyright © 2001-2004 Tom Hunter

You might also like