Introduction to JDBC• Standard framework for dealing with tabular and
generally, relational data• SQL (Structured Query Language) is standardized
language to interact with database• A database is essentially a smart container for
tables (file system).• A table is a container comprised of rows (file).• A row is (conceptually) a container comprised of
columns (record or structure). • A column is a single data item having a name,
type, and value (field or variable).
ODBC
• Open Database Connectivity
• C-based interface to SQL engines
• Individual vendors provide drivers or bridges to their database management system (dbms)
• Platform specific
JDBC
• java.sql or JDBC
• Portable version of ODBC
• JDBC Driver converts SQL requests for a particular database
Driver Types
• 1: JDBC-ODBC bridge plus ODBC driver: JDBC access via ODBC drivers
• 2: Native-API partly-Java driver: JDBC calls converted into dbms specific code
• 3: JDBC-Net pure Java Driver: JDBC calls to DBMS-independent net protocol. Server converts to DBMS protocol
• 4: Native-protocol pure Java driver: JDBC directly to network protocol used by DBMS
JDBC
• Java Database Connectivity
• JDBC 1.0 API compatible with jdk1.1 and jdk1.2
• JDBC 2.0 API compatible with jdk1.2 and greater
• Get JDBC API with respective JDK
JDBC 1.0• Driver • DriverManager • Connection • Statement • PreparedStatement • CallableStatement • ResultSet • DatabaseMetaData • ResultSetMetaData • Types
Steps
• Create the database
• Connect to database
• Create table
• Insert information into database
• Selectively retrieve information
• Example using J2SDKEE and Cloudscape database
Getting Started
• Install a driver for specific DBMS
• JDBC-ODBC Bridge driver more complicated. Comes with JDK, but ODBC needs some set up
• Install DBMS
Creating a Database
• DBMS-Specific
• Administrator Privledges
• Set database connection URL attribute that is passed to driver (create=true)
• Named database is created in DBMS default directory (J2EE_HOME/Cloudscpae)
Connecting to Database
• Load JDBC Driver:Class.forName( DriverClassName);Class.forName(DriverClassName).newInstance();
• From Command Line: java -Djdbc.drivers=DriverClassName AJavaAppCOM.cloudscape.core.RmiJdbcDriver
• Connect to Data sourceConnection con = DriverManager.getConnectio( URL, Username, Password );
• Database now created
Establish a Connection
• Load the Driver– Class.forName("sun.jdbc.odbc.JdbcOdbcDriver
");
– Class.forName("jdbc.DriverXYZ");
– Driver automatically loaded
• Establish Connection• Connection con = DriverManager.getConnection(url,
"myLogin", "myPassword");
• String url = "jdbc:odbc:Fred"; Connection con = DriverManager.getConnection(url, "Fernanda", "J8");
• Vendor specific subprotocol subs for “odbc”
• DriverManager manages all details of connection
• Driver class for Driver developers
Create a Table
• Get Statement object from connectionStatement stmt = con.createStatement();
• stmt.executeUpdate( "CREATE TABLE JJJJData (" +
• "Entry INTEGER NOT NULL, " +
• "Customer VARCHAR (20) NOT NULL, " +
• "DOW VARCHAR (3) NOT NULL, " +
• "Cups INTEGER NOT NULL, " +
• "Type VARCHAR (10) NOT NULL," +
• "PRIMARY KEY( Entry )" +
• ")" );
Insert Information
• Now that the table has been created, the data can be entered using the SQL INSERT statement:
• INSERT INTO JJJJData VALUES ( 1, 'John', 'Mon', 1, 'JustJoe' )
• INSERT INTO JJJJData VALUES ( 2, 'JS', 'Mon', 1, 'Cappuccino' )
• INSERT INTO JJJJData VALUES ( 3, 'Marie', 'Mon', 2, 'CaffeMocha' )
• ...
• In the example program, an array named SQLData contains the actual values, with each element in a form like this: "(1, 'John', 'Mon', 1, 'JustJoe')”
• The program code corresponding to the INSERT statements above is:
• stmt.executeUpdate(
• "INSERT INTO JJJJData VALUES " + SQLData[i] );
Entry Customer DOW CupsType
1 John Mon 1JustJ oe
2 JS Mon 1Cappuccino
3 Marie Mon 2CaffeMocha
4 Anne Tue 8Cappuccino
5 Holley Tue 2MoJava
6 jDuke Tue 3Cappuccino
7 Marie Wed 4Espresso
8 JS Wed 4Latte
9 Alex Thu 3Cappuccino
10 James Thu 1Cappuccino
11 jDuke Thu 4JustJ oe
12 JS Fri 9Espresso
import java.sql.*;
public class Create4JData{
static String[] SQLData = { "(1, 'John', 'Mon', 1, 'JustJoe')", "(2, 'JS', 'Mon', 1, 'Cappuccino')", "(3, 'Marie', 'Mon', 2, 'CaffeMocha')", "(4, 'Anne', 'Tue', 8, 'Cappuccino')", "(5, 'Holley', 'Tue', 2, 'MoJava')", "(6, 'jDuke', 'Tue', 3, 'Cappuccino')", "(7, 'Marie', 'Wed', 4, 'Espresso')", "(8, 'JS', 'Wed', 4, 'Latte')", "(9, 'Alex', 'Thu', 3, 'Cappuccino')", "(10, 'James', 'Thu', 1, 'Cappuccino')", "(11, 'jDuke', 'Thu', 4, 'JustJoe')", "(12, 'JS', 'Fri', 9, 'Espresso')", "(13, 'John', 'Fri', 3, 'Cappuccino')", "(14, 'Beth', 'Fri', 2, 'Cappuccino')", "(15, 'jDuke', 'Fri', 1, 'Latte')" };
public static void main(String[] args) {
Connection con = null; int iRowCount = 0; Statement stmt = null;
String sDriver = "COM.cloudscape.core.RmiJdbcDriver"; String sURL = "jdbc:cloudscape:rmi:jGuru;create=true"; String sUsername = "sa"; String sPassword = "admin";
try // Attempt to load the JDBC driver { // with newInstance by name Class.forName( sDriver ).newInstance(); } catch( Exception e ) // error { System.err.println( "Failed to load current driver."); return; } // end catch
try {
con = DriverManager.getConnection ( sURL, sUsername, sPassword); stmt = con.createStatement(); } catch ( Exception e) { System.err.println( "problems connecting to " + sURL + ":" ); System.err.println( e.getMessage() );
if( con != null) { try { con.close(); } catch( Exception e2 ) {} }
return; } // end catch
// to allow the program to be run more than once, // attempt to remove the table from the database try { stmt.executeUpdate( "DROP TABLE JJJJData" ); System.out.println( "Table JJJJData was removed."); } catch ( Exception e ) { /* don't care */ }
// execute SQL commands // to create table and insert data try { stmt.executeUpdate( "CREATE TABLE JJJJData (" + "Entry INTEGER NOT NULL, " + "Customer VARCHAR (20) NOT NULL, " + "DOW VARCHAR (3) NOT NULL, " + "Cups INTEGER NOT NULL, " + "Type VARCHAR (10) NOT NULL," + "PRIMARY KEY( Entry )" + ")" );
System.out.println( "Table JJJJData was created.");
for (int i = 0; i < SQLData.length; i++) { iRowCount += stmt.executeUpdate( "INSERT INTO JJJJData VALUES " + SQLData[i] ); }
System.out.println( iRowCount + " Rows inserted into JJJJData.");
} catch ( Exception e ) { System.err.println( "problem with SQL sent to " + sURL + ":" ); System.err.println( e.getMessage() ); }
finally { try { stmt.close(); } catch( Exception e ) {}
try { con.close(); } catch( Exception e ) {} } // end finally clause
} // end main
} // end class Create4JData
Retrieving Information
• Get maximum cups of coffee consumed by returning data in decreasing order by number of cups, and then get first row:
• ResultSet result = stmt.executeQuery(• "SELECT Entry, Customer, DOW, Cups, Type " +• "FROM JJJJData " +• "ORDER BY Cups DESC");• if( result.next() ) // get first row • { // if data was returned• sCustomer = result.getString("Customer");• iCups = result.getInt("Cups");• System.out.println(• "On " + result.getString("DOW") +• " 4J Customer " + sCustomer + • " consumed the most coffee." +
Data Navigation• while(result.next()) // for each row of data• {• iEntry = result.getInt("Entry");• sCustomer = result.getString("Customer");• sDOW = result.getString("DOW");• iCups = result.getInt("Cups");• iTotalCups += iCups; // increment total• sType = result.getString("Type");
• // Report each Customer• System.out.println( iEntry + ",\t" +• sCustomer + ",\t" +• sDOW + ",\t" +• iCups + ",\t" +• sType );• }
Data Extraction
• Once at a row, get data column at a time:
• iEntry = result.getInt("Entry");
• Customer = result.getString("Customer");
• DOW = result.getString("DOW");
• Cups = result.getInt("Cups");
• TotalCups += Cups; // increment total
• Type = result.getString("Type");
import java.sql.*;
public class Report4J{ public static void main (String args[]) { Connection con = null; int iCups, iTotalCups, iEntry; Statement stmt = null;
String sDriver = "COM.cloudscape.core.RmiJdbcDriver"; String sURL = "jdbc:cloudscape:rmi:jGuru";// "jdbc:rmi:jdbc:cloudscape:jGuru;create=true"; String sUsername = "sa"; String sPassword = "admin";
String sCustomer = null, sDOW = null, sType = null;
try // Attempt to load the JDBC driver { // with newInstance Class.forName( sDriver ).newInstance(); } catch( Exception e ) // error { System.err.println( "Failed to load current driver."); return; } // end catch
try { con = DriverManager.getConnection ( sURL, sUsername, sPassword); stmt = con.createStatement(); } catch ( Exception e) { System.err.println( "problems connecting to " + sURL + ":" ); System.err.println( e.getMessage() );
if( con != null) { try { con.close(); } catch( Exception e2 ) {} }
return; } // end catch
try { ResultSet result = stmt.executeQuery( "SELECT Entry, Customer, DOW, Cups, Type " + "FROM JJJJData " + "ORDER BY Cups DESC");
if( result.next() ) // get first row { // if data was returned sCustomer = result.getString("Customer"); iCups = result.getInt("Cups"); System.out.println( "On " + result.getString("DOW") + " 4J Customer " + sCustomer + " consumed the most coffee." +
" Cups: " + iCups + ", Type: " + result.getString("Type") + ".\n");
iTotalCups = iCups; // increment total
while(result.next()) // for each row of data { iEntry = result.getInt("Entry"); sCustomer = result.getString("Customer"); sDOW = result.getString("DOW"); iCups = result.getInt("Cups"); iTotalCups += iCups; // increment total sType = result.getString("Type");
// Report each Customer System.out.println( iEntry + ",\t" + sCustomer + ",\t" + sDOW + ",\t" + iCups + ",\t" + sType ); }
// Report total System.out.println( "\n4J Cafe Total Weekly Sales: " + iTotalCups + " cups of coffee.");
} // end if( result.next() )
} // end try catch (Exception e) { e.printStackTrace(); } finally { try { stmt.close(); } catch( Exception e ) {}
try { con.close(); } catch( Exception e ) {} } // end finally clause
} // end main
} // end class Report4J