Sie sind auf Seite 1von 45


Java DataBase Connectivity

What is JDBC?

An API that lets you access virtually any tabular data source from the Java programming language

JDBC Data Access API JDBC Technology Homepage

Whats an API?  See J2SE documentation  Whats a tabular data source? access virtually any data source, from relational databases to spreadsheets and flat files.

JDBC Documentation

Well focus on accessing Oracle databases


General Architecture


What design pattern is implied in this architecture? What does it buy for us? Why is this architecture also multi-tiered?

Part I: Overview of Databases and Java

Databases in the Enterprise


All corporate data stored in DB SQL standardizes format (sort of)

Database Architectures

Two-tier Three-tier N-tier

Two-Tier Architecture


Client connects directly to server e.g. HTTP, email Pro:


simple client-side scripting offloads work onto the client fat client inflexible


Three-Tier Architecture

Application Server sits between client and database

Three-Tier Pros


flexible: can change one part without affecting others can connect to different databases without changing code specialization: presentation / business logic / data management can cache queries can implement proxies and firewalls

Three-Tier Cons

higher complexity higher maintenance lower network efficiency more parts to configure (and buy)

N-Tier Architecture


Design your application using as many tiers as you need Use Object-Oriented Design techniques Put the various components on whatever host makes sense Java allows N-Tier Architecture, especially with RMI and JDBC

Relational Databases

invented by Dr. E.F.Codd data stored in records which live in tables maps row (record) to column (field) in a single table relation (as in relational) means row to column (not table to table)

Joining Tables

you can associate tables with one another allows data to nest allows arbitrarily complicated data structures not object-oriented

Join example


name homeaddress workaddress id street state zip




Structured Query Language Standardized syntax for querying (accessing) a relational database Supposedly database-independent Actually, there are important variations from DB to DB

SQL Syntax
INSERT INTO table ( field1, field2 ) VALUES ( value1, value2 ) inserts a new record into the named table UPDATE table SET ( field1 = value1, field2 = value2 ) WHERE condition

changes an existing record or records DELETE FROM table WHERE condition

removes all records that match condition SELECT field1, field2 FROM table WHERE condition

retrieves all records that match condition



Transaction = more than one statement which must all succeed (or all fail) together If one fails, the system must reverse all previous actions Also cant leave DB in inconsistent state halfway through a transaction COMMIT = complete transaction ROLLBACK = abort

Part II: JDBC Overview

JDBC Goals

SQL-Level 100% Pure Java Keep it simple High-performance Leverage existing database technology

why reinvent the wheel?


Use strong, static typing wherever possible Use multiple methods to express multiple functionality

JDBC Architecture
Application JDBC Driver


Java code calls JDBC library JDBC loads a driver Driver talks to a particular database Can have more than one driver -> more than one database Ideal: can change database engines without changing any application code


The Microsoft Access Northwind Database


Using Microsoft Access via ODBC

Click Start, Settings, Control Panel, Administrative Tools, Data Sources, System DSN, and select Add


Using Microsoft Access via ODBC (Continued)

Select Microsoft Access Driver, Finish, type a name under Data Source Name, and hit Select


Using Microsoft Access via ODBC (Continued)

Navigate to the Samples directory of MS Office, select Northwind.mdb, hit OK, then hit OK in following two windows



Basic steps to use a database in Java


1.Establish a connection 2.Create JDBC Statements 3.Execute SQL Statements 4.GET ResultSet 5.Close connections


1. Establish a connection

import java.sql.*; Load the vendor specific driver


What do you think this statement does, and how? Dynamically loads a driver class, for Oracle database

Make the connection

Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@oracle-prod:1521:OPROD", username, passwd);


What do you think this statement does? Establishes connection to database by obtaining a Connection object

2. Create JDBC statement(s)

Statement stmt = con.createStatement() ;

Creates a Statement object for sending SQL statements to the database


Executing SQL Statements

String createLehigh = "Create table Lehigh " + "(SSN Integer not null, Name VARCHAR(32), " + "Marks Integer)"; stmt.executeUpdate(createLehigh); //What does this statement do? String insertLehigh = "Insert into Lehigh values + "(123456789,abc,100)"; stmt.executeUpdate(insertLehigh);

Get ResultSet
String queryLehigh = "select * from Lehigh"; ResultSet rs = Stmt.executeQuery(queryLehigh); //What does this statement do? while ( { int ssn = rs.getInt("SSN"); String name = rs.getString("NAME"); int marks = rs.getInt("MARKS"); }

Close connection

stmt.close(); con.close();


Transactions and JDBC



JDBC allows SQL statements to be grouped together into a single transaction Transaction control is performed by the Connection object, default mode is auto-commit, I.e., each sql statement is treated as a transaction We can turn off the auto-commit mode with con.setAutoCommit(false); And turn it back on with con.setAutoCommit(true); Once auto-commit is off, no SQL statement will be committed until an explicit is invoked con.commit(); At this point all changes done by the SQL statements will be made permanent in the database.


Handling Errors with Exceptions

Programs should recover and leave the database in a consistent state. If a statement in the try block throws an exception or warning, it can be caught in one of the corresponding catch statements E.g., you could rollback your transaction in a catch { } block or close database connection


Using Microsoft Access via ODBC (Continued)

Use sun.jdbc.odbc.JdbcOdbcDriver as the class name of the JDBC driver. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Use "jdbc:odbc:Northwind" as the database address, and use empty strings for the username and password. Connection connection = DriverManager.getConnection("jdbc:odbc:Northwind", "","");


Simple Standalone Northwind Test

import java.sql.*; public class NorthwindTest { public static void main(String[] args) { String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; String url = "jdbc:odbc:Northwind"; String username = ""; String password = ""; showEmployeeTable(driver, url, username, password); }


public static void showEmployeeTable(String driver, String url, String username, String password) { try { // Load database driver if not already loaded. Class.forName(driver); // Establish network connection to database. Connection connection = DriverManager.getConnection(url, username, password); System.out.println("Employees\n" + "========="); Statement statement = connection.createStatement(); String query = "SELECT firstname, lastname FROM employees"; // Send query to database and store results. ResultSet resultSet = statement.executeQuery(query);

// Print results. while( { // First name System.out.print(resultSet.getString(1) + " "); // Last name System.out.println(resultSet.getString(2)); } } catch(ClassNotFoundException cnfe) { System.err.println("Error loading driver: " + cnfe); } catch(SQLException sqle) { System.err.println("Error connecting: " + sqle); } }


Simple Standalone Northwind Test: Results

Prompt> java NorthwindTest Employees ========= Nancy Davolio Andrew Fuller Janet Leverling Margaret Peacock Steven Buchanan Michael Suyama Robert King Laura Callahan Anne Dodsworth

Mapping types JDBC - Java


JDBC 2 Scrollable Result Set

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String query = select students from class where type= not sleeping ; ResultSet rs = stmt.executeQuery( query ); rs.previous(); / / go back in the RS (not possible in JDBC 1 ) rs.relative(-5); / / go 5 records back rs.relative(7); / / go 7 records forward rs.absolute(100); / / go to 100th record

JDBC 2 Updateable ResultSet

Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); String query = " select students, grade from class where type= really listening this presentation ; ResultSet rs = stmt.executeQuery( query ); while ( ) { int grade = rs.getInt( grade ); rs.updateInt( grade , grade+10); rs.updateRow(); }

Metadata from DB

A Connection's database is able to provide schema information describing its tables, its supported SQL grammar, its stored procedures the capabilities of this connection, and so on

What is a stored procedure? Group of SQL statements that form a logical unit and perform a particular task

This information is made available through a DatabaseMetaData object.


Metadata from DB - example

Connection con = .;

DatabaseMetaData dbmd = con.getMetaData(); String catalog = null; String schema = null; String table = sys% ; String[ ] types = null; ResultSet rs = dbmd.getTables(catalog , schema , table , types );


JDBC Metadata from RS

public static void printRS(ResultSet rs) throws SQLException { ResultSetMetaData md = rs.getMetaData(); // get number of columns int nCols = md.getColumnCount(); // print column names for(int i=1; i < nCols; ++i) System.out.print( md.getColumnName( i)+","); / / output resultset while ( ) { for(int i=1; i < nCols; ++i) System.out.print( rs.getString( i)+","); System.out.println( rs.getString(nCols) ); } }