Only JDBC (Edited On (03.11.10) )
Only JDBC (Edited On (03.11.10) )
JDBC is the java API that is used to connect Java Application to the database. This
API contains classes and interfaces which are used by Java Programmers to connect
Java Applications to the databases. Before understanding JDBC we must understand
its need.
JDBC NOTES 1
Disadvantage of using ODBC was that Application Programmers need to invoke C
functions from their applications.
JDBC NOTES 2
Advantage of Type 1 driver –
a. This is the simplest driver from implementation. Sun Microsystem provides
implementation of Type 1 JDBC driver with Core Java library.
b. Single implementation of Type1 driver can be used with all databases.
JDBC NOTES 3
In Type 2 Driver, driver classes provided by Vendor act as Java Wrapper of
Native Driver.
Advantage of Type 2 driver –
a. ODBC driver is not required.
b. Better performance is obtained as compared to Type 1 Driver.
JDBC NOTES 4
Advantage of Type 4 driver –
a. ODBC & Native Driver is not required.
b. Better performance is obtained as compared to other drivers.
JDBC NOTES 5
Dated : 18.07.10
For example –
JDBC NOTES 6
Define a class that creates & uses objects of any of these classes. User class must not be
modified to switch form one type of Number to Another.
JDBC NOTES 7
class NumberFactory
{
public static Number getNumber(int type)
{
if(type == 1)
return new Rational();
else if (type == 2)
return new Complex();
else
return new Real();
}
}
Now, let’s suppose we assume 2 different companies Microsoft and Oracle provides
the implementation for Connection class as follows:-
JDBC NOTES 8
Statement stmt = con.createStatement();
Example –
1st Step
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
2nd Step
getConnection( ) method of DriverManager class is used to create a Connection
object.
Syntax-
public static Connection getConnnection(String url) throws SQLException;
public static Connection getConnnection(String url, string username, String password) throws
SQLException;
URL represents the information that is used by the driver to establish a database
connection. Different drivers require different information in different formats.
3rd Step-
JDBC NOTES 9
Connection interface provide createStatement( ) factory method for creating
statement object.
Syntax –
public Statement createStatement();
Example:-
Statement stmt = con.createStatement();
4th Step –
Statement interface provides following methods for executing queries:-
public Resultset executeQuery(String selectQuery) throws SQLException;
public int executeUpdate(String NonSelectDMLQuery) throws
SQLException;
public void execute (String NonDMLQuery) throws SQLException
next() method of Resultset is used to advance the record pointer by one record.
public boolean next();
Resultset interface provides various methods to read the value of individual
fields of current record.
General signature of these methods is:-
public type getType(int fieldIndex) throws SQLException;
Actual Methods:-
public String getString(int index) throws SQLException;
JDBC NOTES 10
public int getInt(int index) throws SQLException;
public float getFloat(int index) throws SQLException;
etc.
Last step –
close( ) method of Connection interface is used to close the connection.
public void close( ) throws SQLException;
JDBC NOTES 11
JDBC NOTES 12
Example of type1
JDBC NOTES 13
Using Type4 JDBC Driver for Oracle oracle.jdbc.driver.OracleDriver class need to
be loaded.
JDBC NOTES 14
In order to use Type 4 JDBC Driver for Oracle jar file containing implementation classes
of driver need to be available in the classpath.
ojdbcversionNo.jar
ojdbc14.jar
ojdbc10.jar
ojdbc15.jar
etc.
(See the figure below to figure out the whole process)
1. How to set path of ojdbc14.jar
JDBC NOTES 15
Note : Each time we change database, we need to change URL in our program. To avoid
that problem, we can even change our approach. We can write program using properties
file.
JDBC NOTES 16
db.properties
driverClass = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@localhost:1521:orcl
user = scott
password = tiger
import java.util.*;
import java.io.*;
import java.sql.*;
}catch(Exception e)
{
System.out.println(e);
}
return con;
}
}
Now, JdbcType4DemoUsingPropertyFile.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
JDBC NOTES 17
{
Connection con = ConnectionProvider.getConnection( );
System.out.println("Connection object is of class:" +
con.getClass().getName( ));
Statement stmt = con.createStatement();
System.out.println("Statement object is of class: " +
stmt.getClass().getName());
ResultSet rset = stmt.executeQuery("select * from jdbcdemo");
System.out.println("Result set Object is of class : " +
rset.getClass().getName());
System.out.println("Following records are selected");
while(rset.next())
{
System.out.println(rset.getString(1) + "\t" + rset.getInt(2)
+ "\t" +
rset.getInt(3) + "\t" + rset.getString(4));
}
con.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
Output-
JDBC NOTES 18
package JDBC;
import java.sql.*;
JDBC NOTES 19
Connection con =
DriverManager.getConnection("jdbc:odbc:myDb", "scott", "tiger");
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("select * from emp");
System.out.println("Following records are selected...");
while(rset.next())
{
System.out.println(rset.getInt(1)+ "\t" +
rset.getString(2)+ "\t"
+ rset.getString(3)+ "\t" + rset.getInt(4)+"\t" + rset.getString(5)+ "\t" +
rset.getInt(6)+ "\t" + rset.getInt(7)+ "\t" + rset.getInt(8));
}
con.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
Output –
JDBC NOTES 20
JDBC NOTES 21
In order to use Type 4 JDBC Driver for Oracle jar file containing implementation classes
of driver need to be available in the classpath.
ojdbcversionNo.jar
ojdbc14.jar
ojdbc10.jar
ojdbc15.jar
etc.
(See the figure below to figure out the whole process - )
JDBC NOTES 22
JDBC NOTES 23
JDBC NOTES 24
Note : Each time we change database, we need to change URL in our program. So instead
of following that pattern we will modify the same program using properties file.
package JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
JDBC NOTES 25
}catch(Exception e)
{
System.out.println(e);
}
}
}
package JDBC;
import java.util.*;
import java.io.*;
import java.sql.*;
}catch(Exception e)
{
System.out.println(e);
}
return con;
}
}
JDBC NOTES 26
Dated: 24.07.10
Problem : Whenever we change the Query, we need to compile the code again.
Solution is PreparedStatement
Example –
PreparedStatement stmt = con.prepareStatement(“select * from emp where job = ?”);
Before executing a parameterized query using PreparedStatement, value of all the parameters
must be provided.
PreparedStatement interface provides methods for setting the value of parameters.
Example Program(InsertTest.java)
JDBC NOTES 27
Changes reflected in database after inserting 2 records.
JDBC NOTES 28
Query is compiled.
Query is optimized.
Query is executed.
o In case of Statement, all the four steps are performed each time query is executed
whereas in case of PreparedStatement first 3 steps are performed only once & only the
last step is performed each time query is executed i.e. PreparedStatement provides
better performance as compared to Statement if same query is to be executed multiple
times.
JDBC NOTES 29
Transacting queries : A transaction is a set of logically related operations or
statement which represent a single task from end user perspective.
Transactions must be atomic i.e. if in a transaction n queries are involved then either all the n
queries must be executed or none of them should be executed.
JDBC NOTES 30
import java.sql.*;
import java.io.*;
class TransferTest
{
public static void main(String arr[])
{
try
{
Connection con=ConenctionProvider.getConenction();
PreparedStatement stmt1=con.prepareStatement(“update account set balance=balance+? where
accno=?”);
PreparedStatement stmt2=con.prepareStatement(“update account set balance=balance-? where
accno=?”);
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
System.out.println(“Enter source A/c : ”);
int src=Integer.parseInt(b.readLine());
System.out.println(“Enter destination A/c : ”);
int trgt=Integer.parseInt(b.readLine());
System.out.println(“Insert Amount : ”);
int amt=Integer.parseInt(b.readLine());
stmt1.setInt(1,amt);
stmt1.setInt(2,trgt);
stmt1.executeUpdate();
stmt2.setInt(1,amt);
stmt2.setInt(2,trgt);
stmt2.executeUpdate();
con.close();
System.out.println(“Successfully transferred”);
}catch(Exception e) {System.out.println(e);}
}
}
}
JDBC NOTES 31
Following steps are required for transacting queries :-
Autocommit is to be disabled. By default query is automatically
commited after its successful excecution.
setAutoCommit():-Method of connection interface is used to change
auto commit status.
public void setAutoCommit(Boolean flag);
Explicitly commit queries after completion of transactions
commit() method of connection interface is used for this purpose
public void commit() throws SQLException
In case of transaction failure rollback successfully executed for
uncommitted queries
rollback() method of connection interface is used for this purpose
public void rollback() throws SQLException
import java.sql.*;
import java.io.*;
class TransferTest
{
public static void main(String arr[])
{
try
{
Connection con=ConenctionProvider.getConenction();
PreparedStatement stmt1=con.prepareStatement(“update account set balance=balance+? where
accno=?”);
PreparedStatement stmt2=con.prepareStatement(“update account set balance=balance-? where
accno=?”);
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
System.out.println(“Enter source A/c : ”);
int src=Integer.parseInt(b.readLine());
System.out.println(“Enter destination A/c : ”);
int trgt=Integer.parseInt(b.readLine());
System.out.println(“Insert Amount : ”);
int amt=Integer.parseInt(b.readLine());
con.setAutoCommit(false);
stmt1.setInt(1,amt);
stmt1.setInt(2,trgt);
stmt1.executeUpdate();
stmt2.setInt(1,amt);
JDBC NOTES 32
stmt2.setInt(2,trgt);
stmt2.executeUpdate();
con.commit();
}catch(Exception e)
{
System.out.println(“Transation failes,rolling back”);
try
{
con.rollback();
System.out.println(“Successfully rolled back”);
}catch(Exception e)
{
System.out.println(“Can’t be rollback”);
}
}
}
}
o Explicitly commit queries after all the queries of the transaction are successfully
completed.
JDBC NOTES 33
Major advantage of this model is the portability i.e. database
can be changed without affecting application functionality.
Major drawback of this model is performance degradation
because each data manipulation involves following 3 steps-
o Data is brought into the application from the
database.
o Business logic is applied.
o Manipulated data is persisted in the database.
Round trip of data from the database to the application &
again from the application to the database degrades
performance.
Thin Client – In Thin Client application, client contains only
presentation logic & persistence logic.
Business logic is implemented as part of the database.
JDBC NOTES 34
Dated: 25.07.10
Difference between PL/SQL procedures & functions
PL/SQL function explicitly returns a value whereas PL/SQL procedure
doesn’t.
PL/SQL procedure uses “OUT” type parameters for returning values.
In PL/SQL, parameters can be of 3 types-
Parameter Type Purpose
IN Used to provide input to procedures and functions.
OUT Used to receive result from procedures.
IN OUT Used to provide input as well as receive output from
procedures.
JDBC NOTES 35
Syntax of defining PL/SQL procedures:
create or replace procedure procedureName(ParameterName [IN, OUT
, IN OUT] DataType, ……..)
is
local variable declaration
begin
body of procedure
end;
Syntax of defining PL/SQL functions:
create or replace function functionName(Parameter IN DataType,
……..)
return ReturnType
is
local variable declaration
begin
body of function
end;
Callable Statement is used to invoke procedures and functions.
Invoking a procedure & function from a Java Application requires following step-
1. CallableStatement object is created.
prepareCall() method of Connection interface is used to obtain a
CallableStatement object.
JDBC NOTES 36
2. Value of all IN type parameters is set.
setter methods exposed by PreparedStatement interface is used for setting
the value of IN type parameters.
3. Type of value expected from each OUT type parameter is specified.
registerOutParameter() method of CallableStatement interface is used to
specify the type of OUT parameters.
public void registerOutParameter(int index, int type) throws SQLException;
java.sql.Types class defines static final int constants which are used to
specify type
Example –
Types.INTEGER
Types.VARCHAR
Types.BYTE
etc.
4. Execute the procedure or function.
execute() method is used for this purpose.
5. Read the value of OUT type parameters.
CallableStatement interface provides various methods to read the value of
OUT type parameters.
General signature of these methods
public Type getType (int parameterIndex) throws SQLException;
o Actual Methods
public int getInt (int parameterIndex) throws SQLException;
public String getString(int parameterIndex) throws SQLException;
public Date getDate(int parameterIndex) throws SQLException;
etc.
Example-
We want to give ID as input, and want to get Name from emp table.
select ename into n from emp where empId=id;
JDBC NOTES 37
JDBC NOTES 38
package JDBC;
import java.io.BufferedReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;
class ProcTest
{
public static void main(String[] args)
{
try
{
Connection con = ConnectionProvider.getConnection();
CallableStatement stmt = con.prepareCall("{call getName(?, ?)}");
BufferedReader b = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("Enter Id : ");
int id = Integer.parseInt(b.readLine());
stmt.setInt(1, id);
stmt.registerOutParameter(2, Types.VARCHAR);
stmt.execute();
System.out.println("Name is : " + stmt.getString(2));
con.close();
}catch(Exception e)
{
System.out.println(e);
}
JDBC NOTES 39
}
}
package JDBC;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;
class FuncTest
{
public static void main(String[] args)
{
try
{
Connection con = ConnectionProvider.getConnection();
CallableStatement stmt = con.prepareCall("{?= call
getJob(?)}");
BufferedReader b = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("Enter Id : ");
int id = Integer.parseInt(b.readLine());
stmt.setInt(2, id);
stmt.registerOutParameter(1, Types.VARCHAR);
stmt.execute();
System.out.println("Job is : " + stmt.getString(1));
con.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
PROGRAM
package JDBC;
import java.io.BufferedReader;
JDBC NOTES 40
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.Types;
class ProcCreator
{
public static void main(String[ ] args)
{
try
{
Connection con = ConnectionProvider.getConnection();
Statement stmt = con.createStatement();
FileInputStream f = new FileInputStream(args[0]);
byte a[ ] = new Byte[f.available( )];
f.read(a);
stmt.execute(new String(a));
con.close();
System.out.println("Successfully created.");
}catch(Exception e)
{
System.out.println(e);
}
}
}
}
ResultSetMetaData provides methods for obtaining information about the
result contained in a ResultSet.
getMetaData() method of ResultSet interface is used to obtain a
ResultSetMetaData object.
JDBC NOTES 41
public String getColumnTypeCount(int index);
Define a class name Selector that receives a Table name as command-line argument &
displays its record along with column header.
package JDBC;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.sql.Types;
class Selector
{
public static void main(String[] args)
{
try
{
Connection con =
ConnectionProvider.getConnection();
Statement stmt = con.createStatement();
String query = "select * from " + args[0];
ResultSetrset =stmt.executeQuery(query);
ResultSetMetaData rmd =rset.getMetaData();
int c = rmd.getColumnCount();
for(inti=1; i<c; i++)
System.out.println(rmd.getColumnName(i)+"\
t");
while(rset.next())
{
System.out.println();
for(inti=1; i<=c; i++)
System.out.println(rset.getString(i)+"\
t");
}
con.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
OUTPUT-
JDBC NOTES 42
DatabaseMetaData interface provides methods for obtaining information about
the database.
JDBC NOTES 43
This method receives 4 parameters, out of which first 3
are optional.
JDBC NOTES 44
First parameter represents group of schemas.
package JDBC;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
class DmdTest
{
public static void main(String[] args)
{
try
{
Connection con =
ConnectionProvider.getConnection(
);
DatabaseMetaData dmd
=con.getMetaData();
System.out.println("RDBMS Package
is : " +
dmd.getDatabaseProductName());
System.out.println("Driver is : "
+
dmd.getDriverName());
System.out.println("Tables of
system user whose name starts
with A....");
ResultSetrset =
dmd.getTables(null, "SYSTEM",
"S%", new String[]{"TABLE"});
while(rset.next())
{
System.out.println(rset.getString(3)+"\t");
}
con.close();
}catch(Exception e)
JDBC NOTES 45
{
System.out.println(e);
}
}
}
OUTPUT-
JDBC NOTES 46