1 JDBC Java Database Connectivity
1
JDBCJava Database Connectivity
2
Agenda
Relational Database Model Structured Query Language JDBC
API OverviewJDBC ArchitectureJDBC Features
Using JDBC API
3
Relational Database Model
Database modelsHierarchal, network, relational (most popular)Focus on relational
Relational Database ModelLogical representation of dataConsider relationships between data
Not concerned with implementation
4
Relational Database Model
Relational databaseComposed of tables
Rows called records Columns are fields (attributes)
First field usually primary key Unique for each record Primary key can be more than one field (column) Primary key not required
5
Relational Database Model
Number Name DepartmentSalary Location
2360324568
35761
34589
47132
78321
JONES, A.
KERWIN, R.
LARSON, P.
MYERS, B.
NEUMANN, C.
STEPHENS, T.
413
413
642
611
413
611
1100
2000
1800
1400
9000
8000
NEW JERSEY
NEW JERSEY
LOS ANGELES
ORLANDO
NEW JERSEY
ORLANDO
Table: Employee
A record
A columnPrimary Key
Relational Database Structure
6
Relational Database Overview Books.mdb database Structure:
Primary key in boldRule of Entity Integrity
Every record has unique entry in primary key field
7
Structured Query Language
Overview of SQL Context of Books.mdb database SQL keywords discussed in context of complete queries
Some keywords beyond scope of text Used to
Query a database Insert records into a database Update existing records in a database
SQL keywords SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY
INSERT, UPDATE, DELETE, etc
8
Structured Query Language Example SQL Query:
SELECT * FROM Titles WHERE Title LIKE '*How to Program' ORDER BY Title ASC
SQL Result:
ISBN
Title
Edition Number
Year Published
Publisher ID
0-13-118043-6 C How to Program 1 1992 1
0-13-226119-7 C How to Program 2 1994 1
0-13-528910-6 C++ How to Program 2 1997 1
0-13-016143-8 Internet and World Wide Web How to Program
1 1999 1
0-13-012507-5 Java How to Program 3 1999 1
0-13-899394-7 Java How to Program 2 1997 1
0-13-456955-5 Visual Basic 6 How to Program 1 1998 1
9
JDBC – API Overview
JDBC API makes it possible to do three things: Establish a connection with a database or
access any tabular data source Send SQL statements Process the results
10
JDBC Architecture for Java Application
Type 1 Type 2
11
JDBC Architecture for Java Applet
Type 4 Type 3
12
JDBC Features
Leverage Existing Enterprise Data
Simplified Enterprise Development : Easy to use API
Zero Configuration for Network Computers
Full Access to Metadata No Installation Database Connection
Identified by URL Supported by many industry
13
JDBC Features
From java.sql.*: (standard) Scrollable result set: MoveNext, MovePrev Updatable result set Supported BLOB and CLOB Batch updates: performance improvement, sending multiple
updated instead of single updated to DB Savepoints: Ability to roll transactions back to where a
savepoint is set From javax.sql.* (optional):
Connection pooling Distributed transactions JNDI support
14
Using JDBC API
Setup Database and JDBC Driver Ex: Books.mdb using JdbcOcbd bridge
Loading Driver Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Making Connection Connection con =
DriverManager.getConnection(“jdbc:odbc:books”, “userName”, “password”);
Send/Execute Query Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(“SELECT * from
Authors”);
15
The data source must be registered with system. Go to Control Panel -> ODBC Data Source Administrator.
This allows us to register our User Data Source Name.
Go to the User DSN tab and click Add...
We are using Access, so select Microsoft Access Driver, then Finish
Setup dialog appears. Enter name used to reference database and description (optional).
Use Select... to choose database file.
Use Advanced... to create a username (anonymous) and password (guest). When done, click OK
ODBC Data Source Administrator now has Books. We can now access ODBC data source using JDBC to ODBC driver.
Setup Books.mdb Database
16
Statement for SELECT Query
For Forward Only and Read Only ResultSetStatement stmf = con.createStatement();
For Updateable ResultSet (JDBC 2.0)Statement stmt =
con.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
17
ResultSet Record Navigation
Record NavigationMoveNext next();MovePrev previous();Last Record afterLast(); isAfterLast()First Record beforeFirst(); isBeforeFirst()Go to N position absolute(n), relative(n)Record Count int recCount = rs.getRow();
18
First Sample
Perform query on Books.mdb databaseConnect to databaseQuery to Table “Authors”Display results
19
Authors tableFour fields
AuthorID - ID number FirstName LastName YearBorn
AuthorID
FirstName
LastName
YearBorn 1 Harvey Deitel 1946
2 Paul Deitel 1968
3 Tem Nieto 1969
First Sample
20
1 // Fig. 18.24: TableDisplay.java
2 // This program displays the contents of the Authors table
3 // in the Books database.
44 import java.sql.*;
5 import javax.swing.*;
6 import java.awt.*;
7 import java.awt.event.*;
8 import java.util.*;
9
10 public class TableDisplay extends JFrame {
11 private Connection connection;
12 private JTable table;
13
14 public TableDisplay()
15 {
16 // The URL specifying the Books database to which
17 // this program connects using JDBC to connect to a
18 // Microsoft ODBC database.
1919 String url = "jdbc:odbc:Books";
20 String username = "anonymous";
21 String password = "guest";
22
23 // Load the driver to allow connection to the database
24 try {
2525 Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
26
2727 connection = DriverManager.getConnection(
28 url, username, password );
Import the sql package.
Specify url, username, and password. The database has password protection (next section).
Load class definition for database driver (static method Class.forName).
Attempt to connect to database. Use static method getConnection, of class DriverManager (java.sql).
21
29 }
30 catch ( ClassNotFoundException cnfex ) {
31 System.err.println(
32 "Failed to load JDBC/ODBC driver." );
33 cnfex.printStackTrace();
34 System.exit( 1 ); // terminate program
35 }
36 catch ( SQLException sqlex ) {
37 System.err.println( "Unable to connect" );
38 sqlex.printStackTrace();
39 }
4041 getTable();
42
43 setSize( 450, 150 );
44 show();
45 }
46
47 private void getTable()
48 {
49 Statement statement;
50 ResultSet resultSet;
51
52 try {
53 String query = "SELECT * FROM Authors";
54
5555 statement = connection.createStatement();
5656 resultSet = statement.executeQuery( query );
Create a Statement object that will query the database.
Returns a ResultSet object containing results.
22
57 displayResultSet( resultSet );
5858 statement.close();
59 }
60 catch ( SQLException sqlex ) {
61 sqlex.printStackTrace();
62 }
63 }
64
65 private void displayResultSet( ResultSet rs )
66 throws SQLException
67 {
68 // position to first record
69 boolean moreRecords = rs.next();
70
71 // If there are no records, display a message
72 if ( ! moreRecords ) {
73 JOptionPane.showMessageDialog( this,
74 "ResultSet contained no records" );
75 setTitle( "No records to display" );
76 return;
77 }
78
79 setTitle( "Authors table from Books" );
80
8181 Vector columnHeads = new Vector();
82 Vector rows = new Vector();
83
84 try {
85 // get column heads
8686 ResultSetMetaData rsmd = rs.getMetaData();
statement closed when not needed.
Positions to first record in ResultSet (initially before first record).
Create new Vectors, similar to dynamic arrays.
Get meta data, which describes contents of ResultSet.
23
87
88 for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
8989 columnHeads.addElement( rsmd.getColumnName( i ) );
90
91 // get row data
92 do {
9393 rows.addElement( getNextRow( rs, rsmd ) );
94 } while ( rs.next() );
95
96 // display table with ResultSet contents
9797 table = new JTable( rows, columnHeads );
98 JScrollPane scroller = new JScrollPane( table );
99 getContentPane().add(
100 scroller, BorderLayout.CENTER );
101 validate();
102 }
103 catch ( SQLException sqlex ) {
104 sqlex.printStackTrace();
105 }
106 }
107
108 private Vector getNextRow( ResultSet rs,
109 ResultSetMetaData rsmd )
110 throws SQLException
111 {
112112 Vector currentRow = new Vector();
113
Get names of column heads, add to Vector.
Utility method getNextRow returns a Vector with row data. Creates a Vector of Vectors (like double scripted array).
Create a JTable, takes Vector of Vectors and Vector of column heads.
Create Vector to hold one row of data.
24
114 for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
115115 switch( rsmd.getColumnType( i ) ) {
116 case Types.VARCHAR:
117 currentRow.addElement( rs.getString( i ) );
118 break;
119 case Types.INTEGER:
120 currentRow.addElement(
121 new Long( rs.getLong( i ) ) );
122 break;
123 default:
124 System.out.println( "Type was: " +
125 rsmd.getColumnTypeName( i ) );
126 }
127
128 return currentRow;
129 }
130
131 public void shutDown()
132 {
133 try {
134 connection.close();
135 }
136 catch ( SQLException sqlex ) {
137 System.err.println( "Unable to disconnect" );
138 sqlex.printStackTrace();
139 }
140 }
141
Test for column type, add appropriate type of element to Vector.
25
142 public static void main( String args[] )
143 {
144 final TableDisplay app = new TableDisplay();
145
146 app.addWindowListener(
147 new WindowAdapter() {
148 public void windowClosing( WindowEvent e )
149 {
150 app.shutDown();
151 System.exit( 0 );
152 }
153 }
154 );
155 }
156}
26
Update Query
For INSERT, DELETE, UPDATE use: stmt.executeUpdate(“DELETE from Authors where
YearBorn=1946”); Bacth Update (JDBC 2.0):
Statement stmt = con.createStatement(); con.setAutoCommit(false); stmt.addBatch("INSERT INTO employees VALUES (1000,
'Joe Jones')");stmt.addBatch("INSERT INTO departments VALUES (260,
'Shoe')"); int [] updateCounts = stmt.executeBatch();
27
Using Transaction
Transaction processing Changes can be undone Interface Connection
Method setAutoCommit true - each SQL statements performed individually false - several statements grouped as a transaction
Terminating Statement that executes SQL statements Method commit - commit changes to database Method rollback - return database to previous state
Method getAutoCommit Returns auto commit state
28
Using Transaction
con.setAutoCommit(false);PreparedStatement updateSales = con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");updateSales.setInt(1, 50);updateSales.setString(2, "Colombian");updateSales.executeUpdate();PreparedStatement updateTotal = con.prepareStatement( "UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME
LIKE ?");updateTotal.setInt(1, 50);updateTotal.setString(2, "Colombian");updateTotal.executeUpdate();con.commit();con.setAutoCommit(true);
29
Reference
http://java.sun.com/jdbc