JDBC
JDBC
3) JDBC ........................................................................................................................... 9
21) Working with Large Objects (BLOB and CLOB) ......................................................... 110
The Applications which are running on a Single Machine are called Stand Alone Applications.
Eg: Calculator, MS Word
Any Core Java Application
If we want to develop Web Applications then we should go for Advanced Java.
The Applications which are providing Services over the Web are called Web Applications.
◈ JDBC
◈ Servlets
◈ JSP's
Where ever Presentation Logic is required i.e. to display something to the End User then we
should go for JSP i.e. JSP meant for View Component.
Where ever some Processing Logic is required then we should go for Servlet i.e. Servlet meant for
Processing Logic/ Business Logic. Servlet will always work internally.
From Java Application (Normal Java Class OR Servlet) if we want to communicate with Database
then we should go for JDBC.
Name: Ravi DB
Read Data JDBC
Lucky No: 7 Process Data
get Results
MoB: May
from DB
Hello Ravi
Get Astrology Your Astrology
results.jsp
JDBC 4.2 V
Servlets 3.1 V
JSP's 2.3 V
Gold
Road 1KG/ Rs.1
Ameerpet Translator Diamonds
each Rs.1
Connection
Driver XYZ Place
Java
Database
Application
Driver (Translator):
To convert Java specific calls into Database specific calls and Database specific calls into Java calls.
Connection (Road):
By using Connection, Java Application can communicate with Database.
Statement (Vehicle):
By using Statement Object we can send our SQL Query to the Database and we can get Results
from Database.
ResultSet:
ResultSet holds Results of SQL Query.
Demo Program:
1) import java.sql.*;
2) public class JdbcDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
7) Connection con=DriverManager.getConnection("jdbc:odbc:demodsn","scott","tiger");
8) Statement st = con.createStatement();
9) ResultSet rs= st.executeQuery("select * from employees");
10) while(rs.next())
11) {
12) System.out.println(rs.getInt(1)+".."+rs.getString(2)+".."+rs.getDouble(3)+"..."+rs.get
String(4));
13) }
14) con.close();
15) }
16) }
To store this Data, we required Storage Areas. There are 2 types of Storage Areas.
File Systems:
File Systems can be provided by Local operating System.
File Systems are best suitable to store very less Amount of Information.
Limitations:
1) We cannot store huge Amount of Information.
2) There is no Query Language support and hence operations will become very complex.
3) There is no Security for Data.
4) There is no Mechanism to prevent duplicate Data. Hence there may be a chance of Data
Inconsistency Problems.
Databases:
1) We can store Huge Amount of Information in the Databases.
2) Query Language Support is available for every Database and hence we can perform Database
Operations very easily.
Limitations of Databases:
1) Database cannot hold very Huge Amount of Information like Terabytes of Data.
2) Database can provide support only for Structured Data (Tabular Data OR Relational Data) and
cannot provide support for Semi Structured Data (like XML Files) and Unstructured Data (like
Video Files, Audio Files, Images etc)
To overcome this Problems we should go for more Advanced Storage Areas like Big Data
Technologies, Data warehouses etc..
Java DB
JDBC
Application (Oracle, DB2,
MySql, Etc)
JDBC Features:
1) JDBC API is Standard API. We can communicate with any Database without rewriting our
Application i.e. it is Database Independent API.
2) JDBC Drivers are developed in Java and hence JDBC Concept is applicable for any Platform. i.e.
JDBC Is Platform Independent Technology.
3) By using JDBC API, we can perform basic CRUD Operations very easily.
C ➔ Create (Insert)
R ➔ Retrieve (Select) CRUD Operations
U➔ Update (Update) officially Name given
by JDBC API
D ➔ Delete (Delete)
These Operations also known as CURD/ SCUD Operations (Ameerpet People created Terminology)
We can also perform Complex Operations (like Inner Joins, Outer Joins, calling Stored Procedures
etc) very easily by using JDBC API.
4) JDBC API supported by Large Number of Vendors and they developed multiple Products based
on JDBC API.
Evolution of JDBC:
C/ C++ Application
Oracle
(Use Oracle Libraries)
In the above Diagram C OR C++ Application uses Oracle specific Libraries directly.
The Problem in this Approach is, if we want to migrate Database to another Database then we
have to rewrite Total Application once again by using new Database specific Libraries.
C/ C++ Application
MySql
(Use Oracle Libraries)
The Application will become Database Dependent and creates Maintenance Problems.
With ODBC API, Application can communicate with any Database just by selecting
corresponding ODBC Driver.
We are not required to use any Database specific Libraries in our Application. Hence our
Application will become Database Independent.
Oracle
ODBC Driver Oracle
MySql
C/ C++ ODBC Driver MySql
Application
Sybase
ODBC Driver Sybase
Because of above Reasons, ODBC Concept is not suitable for Java Applications.
JDBC Drivers are implemented in Java. If we use JDBC for Java Applications, then internal
Conversions are not required and hence there is no Effect on Performance.
Oracle
JDBC Driver Oracle
MySql
Java JDBC Driver MySql
Application
Sybase
JDBC Driver Sybase
***Note:
1) ODBC Concept is applicable for any Database and for any Language, but only for Windows
Platform.
2) JDBC Concept is Applicable for any Platform and for any Database, but only for Java Language.
JDBC API
DriverManager
Java Application can communicate with any Database with the help of DriverManager and
Database Specific Driver.
DriverManager:
DriverManager is responsible to establish Connection to the Database with the help of Driver
Software.
Connection con = DriverManager.getConnection (jdbcurl, username, pwd);
Note:
1) Java Application is Database Independent but Driver Software is Database Dependent.
Because of Driver Software only Java Application will become Database Independent.
2) Java Application is Platform Independent but JVM is Platform Dependent. Because of JVM only
Java Application will become Platform Independent.
1) java.sql Package:
It contains basic Classes and Interfaces which can be used for Database Communication.
Interfaces Classes
1) Driver 1) DriverManager
2) Connection 2) Date
3) Statement 3) Time
4) PreparedStatement 4) TimeStamp
5) CallableStatement 5) Types
6) ResultSet
7) ResultSetMetaData
8) DataBaseMetaData
2) javax.sql Package:
It defines more advanced Classes and Interfaces which can be used for Database
Communication.
javax.sql.rowset;
javax.sql.rowset.serial;
javax.sql.rowset.spi;
Interfaces Classes
1) DataSource 1) ConnectionEvent
2) RowSet 2) RowSetEvent
3) RowSetListener 3) StatementEvent
4) ConnectionEventListener :::::::::::::::::::
5) StatementEventListener
Most of the times Database Vendor is responsible to provide Implementation as the Part of
Driver Software.
Every Driver Software is a Collection of Classes implementing various Interfaces of JDBC API,
which can be used to communicate with a particular Database.
Java Driver
Database
Application Software
For Example, Driver Software of Oracle means Collection of Implementation Classes of JDBC
API, which can be used to communicate with Oracle Database.
Every Driver Software is identified with some Special Class which is nothing but Driver Class. It
is the Implementation Class of Driver Interface present in. java.sql Package.
As the Part of JDK, SUN People provided one Built-In Driver Software which implements JDBC
API, which is nothing but Type-1 Driver (JDBC-ODBC Bridge Driver).
sun.jdbc.odbc. JdbcOdbcDriver
1) Driver Interface:
This Interface present in java.sql Package.
This Interface acts as Requirement Specification to implement Driver Class.
2) Driver Class:
It is the Implementation Class of Driver Interface
Eg: sun.jdbc.odbc.jdbcodbcdriver
Eg:
Inet Oraxo For Oracle Database
Inet Merlia For Microsoft SQL Server
Inet Sybelux For Sybase Database
While developing Driver Software, Vendors may use only Java OR Java with other Languages
like C OR C++.
If Driver Software is developed only in Java Language then such Type of Drivers are called Pure
Java Drivers.
If Driver Software developed with Java and other Languages, then such Type of Driver
Softwares are called Partial Java Drivers.
3) Type-3 Driver (All Java Net Protocol Driver OR Network Protocol Driver OR Middleware Driver)
4) Type-4 Driver (All Java Native Protocol Driver OR Pure Java Driver OR Thin Driver)
Note:
Progress Data direct Software Company introduced Type-5 Driver, but it is not Industry Recognized
Driver.
Type-1 Driver:
Also known as JDBC-ODBC Bridge Driver OR Bridge Driver.
Client Machine
This Driver provided by Sun Micro Systems as the Part of JDK. But this Support is available until 1.7
Version only.
Internally this Driver will take Support of ODBC Driver to communicate with Database.
Type-1 Driver converts JDBC Calls (Java Calls) into ODBC Calls and ODBC Driver converts ODBC Calls
into Database specific Calls.
2. We are not required to install any separate Software because it is available as the Part of JDK.
3. Type-1 Driver won't communicates directly with the Database. Hence it is Database
Independent Driver. Because of this migrating from one Database to another Database will
become Easy.
Limitations:
1. It is the slowest Driver among all JDBC Drivers (Snail Driver), because first it will convert JDBC
Calls into ODBC Calls and ODBC Driver converts ODBC Calls into Database specific Calls.
2. This Driver internally depends on ODBC Driver, which will work only on Windows Machines.
Hence Type-1 Driver is Platform Dependent Driver.
Note:
Because of above Limitations it is never recommended to use Type-1 Driver.
Type-2 Driver:
It is also known as Native API -Partly Java Driver OR Native Driver.
Client Machine
Type-2 Driver is exactly same as Type-1 Driver except that ODBC Driver is replaced with Vendor
specific Native Libraries.
Type-2 Driver internally uses Vendor specific Native Libraries to Communicate with Database.
Native Libraries means the Set of Functions written in Non-Java (Mostly C OR C++).
Type-2 Driver converts JDBC Calls into Vendor specific Native Library Calls, which can be
understandable directly by Database Engine.
3. When compared with Type-1 Driver, Portability is more because Type-1 Driver is applicable only
for Windows Machines.
Limitations:
1. Internally this Driver using Database specific Native Libraries and hence it is Database
Dependent Driver. Because of this migrating from one Database to another Database will become
Difficult.
3. On the Client Machine compulsory we should install Database specific Native Libraries.
4. There is no Guarantee for every Database Vendor will provide This Driver.
(Oracle People provided Type-2 Driver but MySql People won't provide this Driver)
Eg: OCI (Oracle Call Interface) Driver is Type-2 Driver provided by Oracle.
OCI Driver internally uses OCI Libraries to communicate with Database.
OCI Driver and corresponding OCI Libraries are available in the following Jar File. Hence we have to
place this Jar File in the Class Path.
Note: The only Driver which is both Platform Dependent and Database Dependent is Type-2
Driver. Hence it is not recommended to use Type-2 Driver.
Type-3 Driver:
Also known as All Java Net Protocol Driver OR Network Protocol Driver OR Middleware Driver
Client Machine
DURGASOFT, # 202, 2nd Floor, HUDA Maitrivanam, Ameerpet, Hyderabad - 500038,
20 040 – 64 51 27 86, 80 96 96 96 96, 92 46 21 21 43 | www.durgasoft.com
Type-3 Driver converts JDBC Calls into Middleware Server specific Calls. Middleware Server can
convert Middleware Server specific Calls into Database specific Calls.
Internally Middleware Server may use Type-1, 2 OR 4 Drivers to communicates with Database.
Advantages:
1. This Driver won't communicate with Database directly and hence it is Database Independent
Driver.
Limitations:
1. Because of having Middleware Server in the Middle, there may be a chance of Performance
Problems.
2. We need to purchase Middleware Server and hence the cost of this Driver is more when
compared with remaining Drivers.
Note: The only Driver which is both Platform Independent and Database Independent is Type-3
Driver. Hence it is recommended to use.
Type-4 Driver:
Also known as Pure Java Driver OR Thin Driver.
Client Machine
This Driver is developed to talk with the Database directly without taking Support of ODBC Driver
OR Vendor Specific Native Libraries OR Middleware Server.
This Driver uses Database specific Native Protocols to communicate with the Database.
This Driver converts JDBC Calls directly into Database specific Calls.
This Driver developed only in Java and hence it is also known as Pure Java Driver. Because of this,
Type-4 Driver is Platform Independent Driver.
Advantages:
1. It won't require any Native Libraries, ODBC Driver OR Middleware Server
3. It uses Database Vendor specific Native Protocol and hence Security is more.
Limitation:
The only Limitation of this Driver is, it is Database Dependent Driver because it is communicating
with the Database directly.
2. If we are using multiple Databases in our Application then Type-3 Driver is recommended to
use.
3. If Type-3 and Type-4 Drivers are not available then only we should go for Type-2 Driver.
If Driver require some extra Component (like ODBC Driver OR Vendor specific Native Libraries
OR Middleware Server), such Type of Driver is called Thick Driver.
Eg: Type-1, Type-2 and Type-3 Drivers
Java
Database
Application
Middleware
Type 3 Driver Server
This is 3 - Tier
Architecture
We have to make this Driver Software available to our Java Program. For this we have to place
corresponding Jar File in the Class Path.
Note:
Type-1 Driver is available as the Part of JDK and hence we are not required to set any Class Path
explicitly.
Every Driver Software is identified by some special Class, which is nothing but Driver Class.
sun.jdbc.odbc.JdbcOdbcDriver
We can load any Java Class by using Class.forName() Method. Hence by using the same Method
we can load Driver Class.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Whenever we are loading Driver Class automatically Static Block present in that Driver Class will
be executed.
1) class JdbOdbcDriver
2) {
3) static
4) {
5) JdbOdbcDriver driver= new JdbOdbcDriver();
6) DriverManager.registerDriver(driver);
7) }
8) }
If we want to register explicitly without using Class.forName() then we can do as follows by using
registerDriver() Method of DriverManager Class.
Note: From JDBC 4.0 V (Java 1.6 V) onwards Driver Class will be loaded automatically from Class
Path and we are not required to perform this step explicitly.
public static Connection getConnection(String jdbcurl, String username, String pwd) throws
SQLException
Note:
DriverManager will use Driver Class internally to connect with Database.
DriverManager Class getConnection() Method internally calls Driver Class connect() Method.
JDBC
Java ODBC ODBC
Application Bridge Driver DB
Driver
ODBC Driver needs Database Name & its Location to connect with Database.
ODBC Driver collect this Information from DSN i.e. internally ODBC Driver will use DSN to get
Database Information (DSN Concept applicable only for Type-1 Driver)
1. User DSN
2. System DSN
3. File DSN
1) User DSN:
It is the non-sharable DSN and available only for Current User.
2) System DSN:
It is the sharable DSN and it is available for all Users who can access that System.
It is also known as Global DSN.
3) File DSN:
It is exactly same as User DSN but will be stored in a File with .dsn Extension.
Write A Java Program To Establish Connection To The Oracle Database By Using Type-1 Driver?
1) import java.sql.*;
2) public class DbConnectDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
7) Connection con=DriverManager.getConnection("jdbc:odbc:demodsn7","scott","tiger"
);
8) if(con != null)
9) {
10) System.out.println("Connection established Successfully");
11) }
12) else
13) {
14) System.out.println("Connection not established");
15) }
16) }
17) }
In the above Program Line 1 is Optional, because from JDBC 4.0V/ Java 1.6V onwards Driver Class
will be loaded automatically from the Class Path based on "jdbcurl".
Note:
To Compile and Run above Program we are not required to Place/Set any Jar File in the Class Path,
because Type-1 Driver is available by default as the Part of JDK.
This Implementation Class is available as the Part of Driver Software. Driver Software Vendor is
responsible to provide Implementation Class.
Interface Reference can be used to hold implemented Class Object. This Property is called
Polymorphism.
In JDBC Programs, Interface Names are fixed and these are provided by JDBC API. But
Implementation Classes are provided by Driver Software Vendor and these Names are varied from
Vendor to Vendor.
If we Hard Code Vendor provided Class Names in our Program then the Program will become
Driver Software Dependent and won't work for other Drivers.
If we want to change Driver Software then Total Program has to rewrite once again, which is
difficult. Hence it is always recommended to use JDBC API provided Interface Names in our
Application.
To send SQL Query to the Database and to bring Results from Database to Java Application some
Vehicle must be required, which is nothing but Statement Object.
According to Java Developer Point of View, all SQL Operations are divided into 2 Types...
2) To Drop/Delete Table:
drop table movies;
3) To Insert Data:
insert into movies values(1,'bahubali2','prabhas','anushka');
4) To Delete Data:
delete from movies where no=3;
5) To Update Data:
update movies set heroine='Tamannah' where no=1;
Non-Select Operations:
Whenever we are performing Non-Select Operation then we will get Numeric Value that
represents the Number of Rows affected.
Once we create Statement Object, we can call the following Methods on that Object to execute
our Queries.
1. executeQuery()
2. executeUpdate()
3. execute()
1) executeQuery() Method:
We can use this Method for Select Operations.
Because of this Method Execution, we will get a Group of Records, which are represented by
ResultSet Object.
2) executeUpdate() Method:
We can use this Method for Non-Select Operations (Insert|Delete|Update)
Because of this Method Execution, we won't get a Group of Records and we will get a Numeric
Value represents the Number of Rows effected. Hence Return Type of this Method is int
3) execute() method:
We can use this Method for both Select and Non-Select Operations.
If we don't know the Type of Query at the beginning and it is available dynamically at runtime
then we should use this execute() Method.
Eg:
2. If we know the Type of Query at the beginning and it is always Non-Select Query then we should
use executeUpdate() Method.
3. If we don't know the Type of SQL Query at the beginning and it is available dynamically at
Runtime (May be from Properties File OR From Command Prompt Etc) then we should go for
execute() Method.
Note:
Based on our Requirement we have to use corresponding appropriate Method.
st.executeQuery();
st.executeUpdate();
st.execute();
st.getResultSet();
st.getUpdateCount();
For Type-1 Driver we will get SQLException. But for Type-4 Driver we won't get any Exception and
Empty ResultSet will be returned.
For Type-1 Driver we will get SQLException where as for Type-4 Driver we won't get any Exception
and simply returns the Number of Rows selected.
For Type-1 Driver, we will get -1 and For Type-4 Driver, we will get 0
i.e. ResultSet holds Result of executeQuery() Method, which contains a Group of Records.
By using ResultSet we can get Results.
This Method Returns True if the next Record is available, otherwise returns False.
1) while(rs.next())
2) {
3) read data from that record
4) }
If next Record is available then we can get Data from that Record by using the following Getter
Methods.
1. getXxx(String columnName)
2. getXxx(int columnIndex)
Note:
In JDBC, Index is always one based but not Zero based i.e. Index of First Column is 1 but not 0.
1) while(rs.next())
2) {
3) SOP(rs.getInt("ENO")+".."+rs.getString("ENAME")+".."+rs.getDouble("ESAL")+".."+rs.getS
tring("EADDR"));
4) OR
5) SOP(rs.getInt(1)+".."+rs.getString(1)+".."+rs.getDouble(3)+".."+rs.getString(4));
6) }
Note:
Readability wise it is recommended to use Column Names, but Performance wise it is
recommended to use Column Index. (Because comparing Numbers is very easy than comparing
String Values)
Hence if we are handling very large Number of Records then it is highly recommended to use
Index.
Conclusions:
1. ResultSet follows "Iterator" Design Pattern.
2. ResultSet Object is always associated with Statement Object.
3. Per Statement only one ResultSet is possible at a time. if we are trying to open another
ResultSet then automatically first ResultSet will be closed.
Eg:
Statement st = con.createStatement();
RS rs1 = st.executeQuery("select * from movies");
RS rs2 = st.executeQuery("select * from employees");
In the above Example Rs1 will be closed automatically whenever we are trying to open Rs2.
1.rs.close();
2. st.close();
It closes the Statement and won't allow sending further Queries to the Database.
3. con.close();
It closes the Connection and won't allow for further Communication with the Database.
Conclusions:
1) try
2) {
3) Open Database Connection
4) }
5) catch(X e)
6) {
7) }
8) finally
9) {
10) Close That Database Connection
11) }
The Advantage of this Concept is, whatever Resources we opened as the Part of try Block, will be
closed automatically once Control reaches End of try Block either Normally OR Abnormally. We
are not required to close explicitly.
Hence until 1.6 Version finally Block is just like Hero but from 1.7 Version onwards finally Block
became Zero.
try (Resource)
{
}
Eg:
try (Connection con = DM.getConnection(-,-,-))
{
Use con based on our Requirement
Once Control reaches End of try Block, automatically con will be closed, we are not
required to close explicitly
}
Client Machine
Also known as JDBC ODBC Bridge Driver.
Type-1 Driver is available as the Part of JDK and hence we are not required to set any Class Path
explicitly.
Note: We should Create Movies Table in the Database and Insert some Sample Data...
create table movies(no number, name varchar2(20),hero varchar2(20),heroine varchar2(20));
Eg:
1) import java.sql.*;
2) public class Type1DriverDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
7) Connection con= DriverManager.getConnection("jdbc:odbc:demodsn","scott","tiger");
8) Statement st = con.createStatement();
9) ResultSet rs = st.executeQuery("select * from movies");
10) while(rs.next())
11) {
12) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.get
String(4));
13) }
14) con.close();
15) }
16) }
Client Machine
Oracle People provided Type-2 Driver is OCI (Oracle Call Interface) Driver.
Internally OCI Driver uses OCI Native Libraries.
OCI Driver and corresponding Native Libraries are available in the following Jar File.
To make Driver Software available to our Program we have to place ojdbc6.jar in Class Path.
We have to collect Jar File from the following Location of Oracle Installation.
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar
D:\Tomcat 7.0\lib\servlet-api.jar;
D:\Tomcat 7.0\lib\jsp-api.jar;
D:\mysql-connector-java-bin.jar;.;
Every Database has a Unique System ID. We can find SID of our Database in the following 2 ways.
1st way:
We have to execute the following Command from SQL Plus Command Prompt
SQL> select * from global_name;
C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\tnsnames.ora
1) import java.sql.*;
2) public class Type2DriverDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("oracle.jdbc.OracleDriver");
7) Connection con= DriverManager.getConnection("jdbc:oracle:oci:@XE","scott","tiger");
8) Statement st = con.createStatement();
9) ResultSet rs = st.executeQuery("select * from movies");
10) while(rs.next())
11) {
12) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.get
String(4));
13) }
14) con.close();
15) }
16) }
Client Machine
Type-2 and Type-4 Drivers of Oracle having same Jar File, same Driver Class Name, but different
JDBC URL's.
1) import java.sql.*;
2) public class Type4DriverDemo
3) {
4) public static void main(String[] args) throws Exception
Client Machine
idssoftware.com ➔ Download ➔ IDS Server Trial ➔ IDS Server 4.2.2 Lite Evaluation ➔ Windows
(2008/2003/XP/2000/NT)
We have to set Driver Software in the Class Path. For this the following Jar File should be placed in
the Class Path.
C:\IDSServer\classes\jdk13drv.jar
Internally IDS Server will use Type-1 Driver to communicate with Database. For this we have to
configure "System DSN" and we have to choose "Oracle In XE".
We have to Download Driver Software from Progress Data Direct Web Site as follows...
We will get Setup File and execute so that Driver Software available in our System.
Type-5 Driver Software available in oracle.jar which is available in the following Location.
C:\Program Files\Progress\DataDirect\Connect_for_JDBC_51\lib\oracle.jar
jdbc_url: jdbc:datadirect:oracle://localhost:1521;ServiceName=XE
1) import java.sql.*;
2) public class Type5DriverDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("com.ddtek.jdbc.oracle.OracleDriver");
1) import java.util.*;
2) class Test
3) {
4) public static void main(String[] args)
5) {
6) Scanner sc = new Scanner(System.in);
7) System.out.println("Enter Employee Number:");
8) int eno=sc.nextInt();
9) System.out.println("Enter Employee Name:");
10) String ename=sc.next();
11) System.out.println("Enter Employee Salary:");
12) double esal=sc.nextDouble();
13) System.out.println("Enter Employee Address:");
14) String eaddr=sc.next();
15) System.out.println(eno+"\t"+ename+"\t"+esal+"\t"+eaddr);
16) }
17) }
It is highly recommended to use String Class format() Method while writing SQL Queries with
Dynamic Input.
Note:
From SQL Plus Command Prompt, if we are performing any Database Operations then compulsory
we should perform Commit Operation explicitly because Auto Commit Mode is not enabled.
From JDBC Application if we perform any Database Operations then the Results will be committed
automatically and we are not required to Commit explicitly, because in JDBC Auto Commit is
enabled by default.
Note: For Ascending Order Query Is : select * from employees order by esal ASC;
Database Table Columns Order and ResultSet Columns Order need not be same. We have to give
Importance only for ResultSet Columns Order.
In this case Database Table contains 4 Columns and ResultSet also contains 4 Columns and Order is
also same.
DB:(eno,ename,esal,eaddr)
RS:(eno,ename,esal,eaddr)
while(rs.next())
{
SOP(rs.getInt(1)+"..."+rs.getString(2)+"..."+rs.getDouble(3)+".."+rs.getString(4));
}
In this case Database Table contains 4 Columns and ResultSet also contains 4 Columns, but Order
is not same.
DB:(eno,ename,esal,eaddr)
RS:(esal,eno,eaddr,ename)
while(rs.next())
{
SOP(rs.getDouble(1)+"..."+rs.getInt(2)+"..."+rs.getString(3)+".."+rs.getString(4));
}
In this case Database Table contains 4 Columns, but ResultSet contains 2 Columns.
DB:(eno,ename,esal,eaddr)
RS:(ename,eaddr)
while(rs.next())
{
SOP(rs.getString(1)+"..."+rs.getString(2));
}
Eg:
String sqlQuery="select count(*) from employees";
ResultSet rs =st.executeQuery(sqlQuery);
if(rs.next())
{
System.out.println(rs.getInt(1));
}
Note: SQL Aggregate Function: count(*) Returns Number of Rows Present in the Table
1) import java.sql.*;
2) public class RowCountDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) String driver="oracle.jdbc.OracleDriver";
7) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
8) String user="scott";
9) String pwd="tiger";
10) Class.forName(driver);
11) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
12) Statement st = con.createStatement();
13) String sqlQuery="select count(*) from employees";
14) ResultSet rs =st.executeQuery(sqlQuery);
15) if(rs.next())
16) {
17) System.out.println(rs.getInt(1));
18) }
19) con.close();
20) }
21) }
1) import java.sql.*;
2) public class HighestSalaryEmpDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) String driver="oracle.jdbc.OracleDriver";
7) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
8) String user="scott";
9) String pwd="tiger";
10) Class.forName(driver);
11) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
12) Statement st = con.createStatement();
13) String sqlQuery="select * from employees where esal in (select max(esal) from emplo
yees)";
14) ResultSet rs =st.executeQuery(sqlQuery);
15) if(rs.next())
16) {
17) System.out.println("Highest sal employee information");
18) System.out.println("----------------------------------------");
19) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getDouble(3)+"\t"+rs.ge
tString(4));
20) }
21) con.close();
22) }
23) }
String sqlQuery="select * from employees where esal in (select min(esal) from employees)";
1) import java.sql.*;
2) import java.util.*;
3) public class NthHighestSalaryEmpDemo
4) {
5) public static void main(String[] args) throws Exception
6) {
7) String driver="oracle.jdbc.OracleDriver";
8) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
9) String user="scott";
10) String pwd="tiger";
11) Class.forName(driver);
12) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
13) Statement st = con.createStatement();
14) Scanner sc = new Scanner(System.in);
Note: The Rank Function will assign a ranking to each Row starting from 1.
Application-18: How to Display retrieved Data from the Database through HTML
1) import java.sql.*;
2) import java.io.*;
3) public class SelectAllRowsToHtmlDemo
4) {
5) public static void main(String[] args) throws Exception
6) {
7) String driver="oracle.jdbc.OracleDriver";
8) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
9) String user="scott";
10) String pwd="tiger";
11) String sqlQuery="select * from employees";
12) Class.forName(driver);
13) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
14) Statement st = con.createStatement();
15) ResultSet rs =st.executeQuery(sqlQuery);
16) String data="";
17) data = data+"<html><body><center><table border='1' bgcolor='green'>";
18) data=data+"<tr><td>ENO</td><td>ENAME</td><td>ESAL</td><td>EADDR</td></tr>";
19) while(rs.next())
20) {
Application-19: How to execute Select and Non-Select Queries by using execute() Method
1) import java.sql.*;
2) import java.util.*;
3) public class SelectNonSelectDemo {
4) public static void main(String[] args) throws Exception
5) {
6) String driver="oracle.jdbc.OracleDriver";
7) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
8) String user="scott";
9) String pwd="tiger";
10) Class.forName(driver);// This step is optional
11) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
12) Statement st = con.createStatement();
13) Scanner sc = new Scanner(System.in);
14) System.out.println("Enter the Query: ");
15) String sqlQuery=sc.nextLine();
16) boolean b = st.execute(sqlQuery);
17) if(b== true)//select query
18) {
19) ResultSet rs =st.getResultSet();
20) while(rs.next())
21) {
22) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getDouble(3)+"\t"+rs.
getString(4));
23) }
24) }
25) else //non-select query
26) {
27) int rowCount=st.getUpdateCount();
28) System.out.println("The number of records effected is:"+rowCount);
29) }
30) con.close();
31) }
32) }
For Type-1:
1) import java.sql.*;
2) public class ExecuteMethodLoopHoles2T1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) String driver="sun.jdbc.odbc.JdbcOdbcDriver";
7) String jdbc_url="jdbc:odbc:demodsn";
8) String user="scott";
9) String pwd="tiger";
10) Class.forName(driver);
11) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
12) Statement st = con.createStatement();
13) ResultSet rs=st.executeQuery("update employees set esal=7777 where ename='durga'");
14) con.close();
15) }
16) }
In the case of Type-4 Driver provided by Oracle then we won't get any Exception and Returns the
Number of Records retrieved from the Database.
For Type-1:
1) import java.sql.*;
2) public class ExecuteMethodLoopHoles3T1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) String driver="sun.jdbc.odbc.JdbcOdbcDriver";
7) String jdbc_url="jdbc:odbc:demodsn";
8) String user="scott";
9) String pwd="tiger";
10) Class.forName(driver);
11) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
12) Statement st = con.createStatement();
13) int rowCount=st.executeUpdate("select * from employees");
14) System.out.println(rowCount);
15) con.close();
16) }
17) }
1) import java.sql.*;
2) public class ExecuteMethodLoopHoles1T1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) String driver="sun.jdbc.odbc.JdbcOdbcDriver";
7) String jdbc_url="jdbc:odbc:demodsn";
8) String user="scott";
9) String pwd="tiger";
10) Class.forName(driver);
11) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
12) Statement st = con.createStatement();
13) int updateCount=st.executeUpdate("create table emp1(eno number)");
14) System.out.println(updateCount);//-1
15) con.close();
16) }
17) }
2. It is recommended to use explicit Class Imports than implicit Class Imports because these
Imports improve Readability of the Code.
Eg:
import java.sql.*; ➔ Implicit Class Import
import java.sql.Connection; ➔ Explicit Class Import
3. It is recommended to use try-catch over throws Statement, because there is a Guarantee for the
Normal Termination of the Program.
Even we are using throws Statement, somewhere compulsory we should handle that Exception by
using try-catch.
Eg:
1) m1()
2) {
3) try
4) {
5) m2();
6) }
7) catch(Exception e)
8) {
9) }
10) }
11)
12) m2() throws Exception
13) {
14) ....
15) }
4. Avoid Duplicate Code as much as possible, otherwise Maintenance Problems may rise.
5. We have to use meaningful Names for Classes, Methods, Variables etc. It improves Readability
of the Code.
If any Code repeatedly required, we have to separate that Code inside some other Class and we
can call its Functionality where ever it is required.
In JDBC Applications, getting Connection and closing the Resources are common Requirement.
Hence we can separate this Code into some util Class, and we can reuse that Code where ever it is
required.
1) package com.durgasoft.jdbc;
2) import java.sql.Connection;
3) import java.sql.DriverManager;
4) import java.sql.Statement;
5) import java.sql.ResultSet;
6) import java.sql.SQLException;
7) /**
8) * @ Author: Durga
9) * @ Company: DURGASOFT
10) * @ see: www.durgasoft.com
11) */
12) public class JDBCCodingStandardsDemo1
13) {
14) public static void main(String[] args)
15) {
16) try
17) {
18) Class.forName("oracle.jdbc.OracleDriver");
19) }
20) catch(ClassNotFoundException e)
21) {
22) e.printStackTrace();
23) }
24) Connection con=null;
25) Statement st = null;
26) ResultSet rs=null;
27) try
28) {
29) con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","scott","
tiger");
30) st=con.createStatement();
31) rs=st.executeQuery("select * from employees");
32) while(rs.next())
33) {
34) System.out.println(rs.getInt(1)+".."+rs.getString(2)+"..."+rs.getDouble(3)+".."+rs.g
etString(4));
35) }
36) }
37) catch(SQLException e)
38) {
39) e.printStackTrace();
40) }
41) finally
42) {
43) try
44) {
45) if(rs!= null)
javac -d . JDBCCodingStandardsDemo1.java
java com.durgasoft.jdbc.JDBCCodingStandardsDemo1
Note:
If any code repeatedly required then it is not recommended to write that code every time
separately. We have to define that code inside a separate component and we can call that code
where ever it is required without rewriting. It promotes reusability of the code.
JDBCCodingStandardsDemo2.java:
1) package com.durgasoft.jdbc;
2) import java.sql.Connection;
3) import java.sql.DriverManager;
4) import java.sql.Statement;
5) import java.sql.ResultSet;
6) import java.sql.SQLException;
7) /**
8) * @ Author: Durga
9) * @ Company: DURGASOFT
10) * @ see: www.durgasoft.com
11) */
12) public class JDBCCodingStandardsDemo2
13) {
14) public static void main(String[] args)
15) {
16) Connection con=null;
17) Statement st = null;
18) ResultSet rs=null;
19) try
20) {
21) con=JdbcUtil.getOracleConnection();
22) st=con.createStatement();
JdbcUtil.java:
1) package com.durgasoft.jdbc;
2) import java.sql.Connection;
3) import java.sql.DriverManager;
4) import java.sql.Statement;
5) import java.sql.ResultSet;
6) import java.sql.SQLException;
7) public class JdbcUtil
8) {
9) static
10) {
11) try
12) {
13) Class.forName("oracle.jdbc.OracleDriver");
14) }
15) catch(ClassNotFoundException e)
16) {
17) e.printStackTrace();
18) }
19) }
20) public static Connection getOracleConnection()throws SQLException
21) {
22) Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE"
,"scott","tiger");
23) return con;
24) }
25) public static void cleanup(Connection con,Statement st,ResultSet rs)
26) {
27) try
28) {
javac -d . JDBCCodingStandardsDemo2.java
java com.durgasoft.jdbc.JDBCCodingStandardsDemo2
Note:
In MySql, everything we have to work with our own Databases, which are also known as Logical
Databases.
durgadb
mysql Logical DB
information_schema test
Physical DB
Here only one Physical Database but 4 Logical Databases are available.
6. To Insert Data
insert into employees values(100,'durga',1000,'Hyd');
JDBC Information:
In general, we can use Type-4 Driver to communicates with MySQL Database which is provided by
MySQL Vendor, and its Name is connector/J
mysql-connector-java-5.1.41-bin.jar
If MySQL is available in Local System then we can specify JDBC URL as above.
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sqlQuery);
1. Compilation
2. Execution
3. Fetch Result
1. Compilation:
As the part of compilation, 0database engine will perform the following activities
A.Query Tokenization:
In this step total SQL Query will be divided into number of tokens and generate a Stream of tokens
as output.
B.Query Parsing:
In this step, database engine will create parse tree (query tree) with stream of tokens. If the Query
Tree is proper then there are no syntactical mistakes in that query.
If the query tree construction fails then it indicates that there are some syntactical errors present
in SQL Query and SQLException will be raised.
C.Query Optimization:
The main purpose of query optimization is to improve performance. In this step optimized query
tree will be constructed.
Compilation Parsing
SQL Query
Java Database Optimized Query Tree
Application Engine Query Tree
ResultSet Query
OR Execution Optimization
rowCount
Statement st = con.createStatement();
ResultSet rs = st.executeQuery ("select * from employees");
Sometimes in our application,we required to execute same query multiple times with same or
different input values.
Eg1:
In IRCTC application,it is common requirement to list out all possible trains between 2 places
Query is same but source and destination places may be different. This query is required to
execute lakhs of times per day.
Eg2:
For the above requirements if we use Statement object, then the query is required to compile and
execute every time, which creates performance problems.
The main advantage of PreparedStatement is the query will be compiled only once even though
we are executing multiple times, so that overall performance of the application will be improved.
At this line,sqlQuery will send to the database. Database engine will compile that query and stores
in the database.
That pre compiled query will be returned to the java application in the form of PreparedStatement
object.
Whenever we call execute methods,database engine won't compile query once again and it will
directly execute that query,so that overall performance will be improved.
Request Time
Java
Application Database Execution Time
Response Time
3.If the query is parameterized query then we have to set input values to these parameters by
using corresponding setter methods.
We have to consider these positional parameters from left to right and these are 1 index based. i.e
index of first positional parameter is 1 but not zero.
pst.setInt(1,100);
pst.setString(2,"durga");
pst.setDouble(3,1000);
pst.setString(4,"Hyd");
Note:
Before executing the query, for every positional parameter we have to provide input values
otherwise we will get SQLException
executeQuery()
executeUpdate()
execute()
Note:
We can execute same parameterized query multiple times with different sets of input values.
In this case query will be compiled only once and we can execute multiple times.
Note:
We can use ? only in the place of input values and we cannot use in the place of sql
keywords,table names and column names.
2. Network traffic will be reduced between java application and database b'z we are not required
to send query every time to the database.
3. We are not required to provide input values at the beginning and we can provide dynamically
so that we can execute same query multiple times with different sets of values.
4. It allows to provide input values in java style and we are not required to convert into database
specific format.
Limitation of PreparedStatement:
We can use PreparedStatement for only one sql query (Like CDMA Phone), but we can use simple
Statement to work with any number of queries (Like GSM Phone).
Eg:
Statement st = con.createStatement();
st.executeUpdate("insert into ...");
st.executeUpdate("update employees...");
st.executeUpdate("delete...");
Note:
Simple Statement can be used only for static queries where as PreparedStatement can used for
both static and dynamic queries.
2) Whenever we are using execute Method, 2) Whenever we are using execute Method,
every time Query will be compiled and Query won't be compiled just will be executed.
executed.
3) Statement Object can work only for Static 3) PS Object can work for both Static and
Queries. Dynamic Queries.
4) Relatively Performance is Low. 4) Relatively Performance is High.
5) Best choice if we want to work with 5) Best choice if we want to work with only
multiple Queries. one Query but required to execute multiple
times.
6) There may be a chance of SQL Injection 6) There is no chance of SQL Injection
Attack. Attack.
7) Inserting Date and Large Objects (CLOB and 7) Inserting Date and Large Objects (CLOB and
BLOB) is difficult. BLOB) is easy.
Every time the query will be compiled and executed. Some times end user may provide special
characters as the part user input,which may change behaviour of sql query.This is nothing but SQL
Injection Attack,which causes security problems.
But in the case of PreparedStatement query will be compiled at the beginning only without
considering end user's input. User provided data will be considered at the time of execution only.
Hence as the part of user input,if he provides any special characters as the part of input,query
behaviour wont be changed. Hence there is no chance of SQL Injection Attack in
PreparedStatement.
If the end user provides username as durga and pwd as java then the query will become
It is not meaningful query b'z it is validating only username but not pwd. i.e with end user's
provided input the query behaviour is changing,which is nothing but sql injection attack.
Note:
Eg 2:
1=1 is always true and hence it returns complete table information like username,pwe,uid
etc...which may create security problems.
SQL Script
SQLInjectionDemo1.java
1) import java.sql.*;
2) import java.util.*;
3) public class SQLInjectionDemo1
4) {
5) public static void main(String[] args) throws Exception
6) {
7) String driver="oracle.jdbc.OracleDriver";
8) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
9) String user="scott";
10) String pwd="tiger";
11) Class.forName(driver);
12) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
13) Statement st = con.createStatement();
14) Scanner sc = new Scanner(System.in);
15) System.out.println("Enter username:");
16) String uname=sc.next();
17) System.out.println("Enter pwd:");
18) String upwd=sc.next();
19) String sqlQuery="select count(*) from users where uname='"+uname+"' and upwd='"+
upwd+"'";
20) ResultSet rs =st.executeQuery(sqlQuery);
21) int c=0;
22) if(rs.next())
23) {
24) c=rs.getInt(1);
25) }
26) if(c==0)
27) System.out.println("Invalid Credentials");
28) else
29) System.out.println("Valid Credentials");
30) con.close();
31) }
32) }
Similarly in the database programming,if any group of sql statements is repeatedly required then
we can define those sql statements in a single group and we can call that group repeatedly based
on our requirement.
This group of sql statements that perform a particular task is nothing but Stored Procedure.Hence
stored procedure is the best reusable component at database level.
Hence Stored Procedure is a group of sql statements that performs a particular task.
These procedures stored in database permanently for future purpose and hence the name stored
procedure.
Similar to methods stored procedure has its own parameters. Stored Procedure has 3 Types of
parameters.
Eg 1 :
Z:=X+Y;
Eg 2:
X:=X+X;
X is INOUT parameter
Note:
SQL and PL/SQL are not case-sensitive languages. We can use lower case and upper case also.
After writing Stored Procedure, we have to compile for this we required to use "/" (forward slash)
/ ➔ For compilation
while compiling if any errors occurs,then we can check these errors by using the following
command
Once we created Stored Procedure and compiled successfully,we have to register OUT parameter
to hold result of stored procedure.
Eg 2:
SQUARE
----------
100
Statement (I)
PreparedStatement (I)
CallableStatement (I)
cst.setInt(1, 100);
cst.setInt(2, 200);
index value
Note:
Before executing procedure call, all input parameters should set with values and every OUT
parameter we have to register with jdbc type.
6. Get the result from OUT parameter by using the corresponding getXxx() method.
Stored Procedures App1: JDBC Program to call StoredProcedure which can take two input
numbers and produces the result.
Stored Procedure:
StoredProceduresDemo1.java
1) import java.sql.*;
2) class StoredProceduresDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
7) CallableStatement cst=con.prepareCall("{call addProc(?,?,?)}");
8) cst.setInt(1,100);
9) cst.setInt(2,200);
10) cst.registerOutParameter(3,Types.INTEGER);
11) cst.execute();
12) System.out.println("Result.."+cst.getInt(3));
13) con.close();
14) }
15) }
Stored Procedure:
StoredProceduresDemo2.java
1) import java.sql.*;
2) class StoredProceduresDemo2
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
7) CallableStatement cst=con.prepareCall("{call getSal(?,?)}");
8) cst.setInt(1,100);
9) cst.registerOutParameter(2,Types.FLOAT);
10) cst.execute();
11) System.out.println("Salary ..."+cst.getFloat(2));
12) con.close();
13) }
14) }
Stored Procedures App3: JDBC Program to call StoredProcedure which can take employee
number as input and provides corresponding name and salary.
Stored Procedure:
StoredProceduresDemo3.java
1) import java.sql.*;
2) class StoredProceduresDemo3
3) {
4) public static void main(String[] args) throws Exception
5) {
To access Results of this context area,Some pointers are required and these pointers are nothing
but cursors.
1. Implicit cursors
2. Explicit cursors
1. Implicit cursors:
These cursors will be created automatically by database software to hold results whenever a
particular type of sql query got executed.
2. Explicit Cursors:
These cursors will be created explicitly by the developer to hold results of particular sql queries.
Eg 1: SYS_REFCURSOR can be used to access result of select query i.e to access ResultSet.
Eg 3: %FOUND is an implicit cursor provided by Oracle to represent whether any rows effected or
not b'z of insert,delete and update operations(non-select query)
SYS_REFCURSOR VS OracleTypes.CURSOR:
To register SYS_REFCURSOR type OUT parameter JDBC does not contain any type.
OracleTypes.CURSOR
If OUT parameter is SYS_REFCURSOR type,then we can get ResultSet by using getObject() method.
But return type of getObject() method is Object and hence we should perform typecasting.
ResultSet rs = (ResultSet)cst.getObject(1);
Eg:
Stored Procedures App4: JDBC Program to call StoredProcedure which returns all
Employees info by using SYS_REFCURSOR
Stored Procedure:
2) BEGIN
3) open emps for
4) select * from employees where esal<sal;
5) END;
6) /
StoredProceduresDemo4.java
1) import java.sql.*;
2) import oracle.jdbc.*;// for OracleTyes.CURSOR and it is present in ojdbc6.jar
3) class StoredProceduresDemo4
4) {
5) public static void main(String[] args) throws Exception
Stored Procedures App5: JDBC Program to call StoredProcedure which returns all
Employees info by using SYS_REFCURSOR based initial characters of the name
Stored Procedure:
StoredProceduresDemo5.java
1) import java.sql.*;
2) import java.util.*;
3) import oracle.jdbc.*;// for OracleTyes.CURSOR and it is present in ojdbc6.jar
4) class StoredProceduresDemo5
5) {
6) public static void main(String[] args) throws Exception
7) {
8) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
Procedure can also returns values indirectly in the form of OUT parameters.
Usually we can use procedure to define business logic and we can use functions to perform some
calculations like getAverage() , getMax() etc..
Function call can return some value.Hence the syntax of function call is
Stored Procedures App6: JDBC Program to call Function which returns average salary of
given two employees
Stored Procedure
1) import java.sql.*;
2) class StoredProceduresDemo6
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
7) CallableStatement cst=con.prepareCall("{?=call getAvg(?,?)}");
8) cst.setInt(2,100);
9) cst.setInt(3,200);
10) cst.registerOutParameter(1,Types.FLOAT);
11) cst.execute();
12) System.out.println("Salary ..."+cst.getFloat(1));
13) con.close();
14) }
15) }
Stored Procedures App7: JDBC Program to call function returns all employees information
based on employee numbers
Stored Procedure
StoredProceduresDemo7.java
1) import java.sql.*;
2) import oracle.jdbc.*;// for OracleTyes.CURSOR and it is present in ojdbc6.jar
3) class StoredProceduresDemo7
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
8) CallableStatement cst=con.prepareCall("{?=call getAllEmpInfo4(?,?)}");
9) cst.setInt(2,1000);
10) cst.setInt(3,2000);
11) cst.registerOutParameter(1,OracleTypes.CURSOR);
12) cst.execute();
Stored Procedure
StoredProceduresDemo8.java
1) import java.sql.*;
2) import oracle.jdbc.*;// for OracleTyes.CURSOR and it is present in ojdbc6.jar
3) class StoredProceduresDemo8
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
8) CallableStatement cst=con.prepareCall("{?=call getDeletedEMPInfo(?,?)}");
9) cst.setInt(2,100);
10) cst.registerOutParameter(1,OracleTypes.CURSOR);
11) cst.registerOutParameter(3,Types.INTEGER);
i.e if we want to work with multiple queries then we should go for Statement object.
2. If we want to work with only one query,but should be executed multiple times then we should
go for PreparedStatement.
3. If we want to work with stored procedures and functions then we should go for
CallableStatement.
Request Time
Java
Application Database Execution Time
Response Time
In the above 2 cases , we are trying to submit 1000 queries to the database one by one. For
submitting 1000 queries we need to communicate with the database 1000 times. It increases
network traffic Between java application and database and even creates performance problems
also.
Query - 1
Query - 2
Java App :
: Database
:
Query - n
Batch of Queries
2. int[] executeBatch()
to execute a batch of sql queries
1) import java.sql.*;
2) public class BatchUpdatesDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
7) Statement st = con.createStatement();
1) import java.sql.*;
2) import java.util.*;
3) public class BatchUpdatesDemo2
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
8) PreparedStatement pst = con.prepareStatement("insert into employees values(?,?,?,?
)");
9) Scanner sc = new Scanner(System.in);
10) while(true)
11) {
12) System.out.println("Employee Number:");
13) int eno=sc.nextInt();
14) System.out.println("Employee Name:");
15) String ename=sc.next();
16) System.out.println("Employee Sal:");
17) double esal=sc.nextDouble();
18) System.out.println("Employee Address:");
19) String eaddr=sc.next();
20) pst.setInt(1,eno);
21) pst.setString(2,ename);
22) pst.setDouble(3,esal);
23) pst.setString(4,eaddr);
24) pst.addBatch();
25) System.out.println("Do U want to Insert one more record[Yes/No]:");
26) String option = sc.next();
27) if(option.equalsIgnoreCase("No"))
28) {
29) break;
30) }
2. In batch if one sql query execution fails then remaining sql queries wont be executed.
3. execute()
➔ For both select and non-select queries
➔ For calling Stored Procedures
It is not recommended to maintain date values in the form of String,b'z comparisons will become
difficult.
1. java.util.Date
2. java.sql.Date
java.util.Date
java.sql.Date
java.sql.Date is specially designed class for handling Date values wrt database.
Otherthan database operations,if we want to represent Date in our java program then we should
go for java.util.Date.
java.util.Date can represent both Date and Time where as java.sql.Date represents only Date but
not time.
1) class Test
2) {
3) public static void main(String[] args)
4) {
5) java.util.Date udate=new java.util.Date();
6) System.out.println("util Date:"+udate);
7) long l =udate.getTime();
8) java.sql.Date sdate= new java.sql.Date(l);
9) System.out.println("sql Date:"+sdate);
10) }
11) }
java.util.Date java.sql.Date
1) It is general Utility Class to handle Dates in 1) It is specially designed Class to handle Dates
our Java Program. w.r.t DB Operations.
2) It represents both Data and Tieme. 2) It represents only Date but not Time.
Note: In sql package Time class is availble to represent Time values and TimeStamp class is
available to represent both Date and Time.
Eg:
Oracle: dd-MMM-yy 28-May-90
MySQL: yyyy-mm-dd 1990-05-28
If we use simple Statement object to insert Date values then we should provide Date value in the
database supported format,which is difficult to the programmer.
If we use PreparedStatement,then we are not required to worry about database supported form,
just we have to call
pst.setDate (2, java.sql.Date);
This method internally converts date value into the database supported format.
Hence it is highly recommendedto use PreparedStatement to insert Date values into database.
System.out.println("Enter DOP(dd-mm-yyyy):");
String dop=sc.next();
2. Convert date from String form to java.util.Date form by using SimpleDateFormat object.
long l = udate.getTime();
java.util.Date
java.sql.Date
Database specific
form
DateInsertDemo.java
1) import java.sql.*;
2) import java.util.*;
3) import java.text.*;
4) public class DateInsertDemo
5) {
6) public static void main(String[] args) throws Exception
7) {
8) String driver="oracle.jdbc.OracleDriver";
9) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
10) String user="scott";
11) String pwd="tiger";
12) Class.forName(driver);
***Note: If end user provides Date in the form of "yyyy-MM-dd" then we can convert directly
that String into java.sql.Date form as follows...
String s = "1980-05-27";
java.sql.Date sdate=java.sql.Date.valueOf(s);
DateInsertDemo1.java
1) import java.sql.*;
2) import java.util.*;
3) import java.text.*;
4) public class DateInsertDemo1
5) {
6) public static void main(String[] args) throws Exception
7) {
8) String driver="oracle.jdbc.OracleDriver";
9) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
10) String user="scott";
11) String pwd="tiger";
The retrieved Date values are Stored in ResultSet in the form of "java.sql.Date" and we can get
this value by using getDate() method.
Once we got java.sql.Date object,we can format into our required form by using
SimpleDateFormat object.
Database
s.date = rs.getDate(2);
java.sql.Date
FAQs:
1. In Java how many Date classes are available?
2. What is the difference Between java.util.Date and java.sql.Date?
3. What is the relation Between java.util.Date and java.sql.Date?
4.How to perform the following conversions?
1. java.util.Date to java.sql.Date
2. String to Date
3. Date to String
sdf.parse (string)
sdf.format (date)
Eg:
upload image in matrinomial web sites
upload resume in job related web sites
CLOB can be used to store large text documents(may plain text or xml documents)
Eg: hydhistory.txt
pst.setString(1,"katrina");
To set values to BLOB datatype, we can use the following method: setBinaryStream()
Eg:
pst.setBinaryStream(2,fis); ➔ Oracle 11g
pst.setBinaryStream(2,fis,(int)f.length()); ➔ Oracle 10g
BLOBDemo1.java
1) import java.sql.*;
2) import java.io.*;
3) public class BLOBDemo1
4) {
5) public static void main(String[] args) throws Exception
6) {
7) String driver="oracle.jdbc.OracleDriver";
8) Class.forName(driver);
9) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
10) String user="scott";
11) String pwd="tiger";
12) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
13) String sqlQuery="insert into persons values(?,?)";
14) PreparedStatement ps = con.prepareStatement(sqlQuery);
15) ps.setString(1,"Katrina");
16) File f = new File("katrina.jpg");
17) FileInputStream fis = new FileInputStream(f);
18) ps.setBinaryStream(2,fis);
19) System.out.println("inserting image from :"+f.getAbsolutePath());
20) int updateCount=ps.executeUpdate();
21) if(updateCount==1)
1 KB
Because of Buffer we have to perform only 10 Read Operations & 10 Write Operations
InputStream FOS
fos.write(byte[])
InputStream is =
Target
Database rs.getBinaryStream(); byte[]
File
Image is.read(buffer);
Buffer
1. Prepare ResultSet object with BLOB type
String name=rs.getString(1);
5. Read Binary Data from InputStream and write that Binary data to output Stream.
1) import java.sql.*;
2) import java.io.*;
3) public class BLOBDemo2
4) {
5) public static void main(String[] args) throws Exception
6) {
7) String driver="oracle.jdbc.OracleDriver";
CLOB can be used to store large text documents(may plain text or xml documents)
Eg: hydhistory.txt
CLOBDemo1.java
1) import java.sql.*;
2) import java.io.*;
3) public class CLOBDemo1
4) {
5) public static void main(String[] args) throws Exception
6) {
7) String driver="oracle.jdbc.OracleDriver";
8) Class.forName(driver);
9) String jdbc_url="jdbc:oracle:thin:@localhost:1521:XE";
10) String user="scott";
11) String pwd="tiger";
12) Connection con = DriverManager.getConnection(jdbc_url,user,pwd);
13) String sqlQuery="insert into cities values(?,?)";
14) PreparedStatement ps = con.prepareStatement(sqlQuery);
15) ps.setString(1,"Hyderabad");
16) File f = new File("hyd_history.txt");
17) FileReader fr = new FileReader(f);
18) ps.setCharacterStream(2,fr);
19) System.out.println("file is inserting from :"+f.getAbsolutePath());
20) int updateCount=ps.executeUpdate();
21) if(updateCount==1)
22) {
23) System.out.println("Record Inserted");
24) }
25) else
26) {
27) System.out.println("Record Not Inserted");
28) }
29)
30) }
31) }
Where as we can use CLOB Type to represent Character data like text file, xml file etc...
jobseeker
(name varchar2(20),dob Date,image BLOB,resume CLOB);
name="durga";
dob="28-05-1968";
image="durga.jpg";
resume="resume.txt";
1) if(rs.next())
2) {
3) //reading name
4) String name=rs.getString(1);
5) //reading dob
6) java.sql.Date sdate=rs.getDate(2);
7) String dob=sdf.format(sdate);
8) //reading BLOB(image)
9) InputStream is = rs.getBinaryStream(3);
10) byte[] b = new byte[1024];
11) while(is.read(b)>0)
12) {
13) fos.write(b);
14) }
15) fos.flush();
16) //reading CLOB(txt file)
Connection Pool is a pool of already created Connection objects which are ready to use.
Hence the main advantage of Connection Pool is we can reuse same Connection object multiple
times, so that overall performance of application will be improved.
This class present inside oracle.jdbc.pool package and it is the part of ojdbc6.jar.
Note: This way of implementing Connection Pool is useful for Standalone applications. In the case
of web and enterprise applications, we have to use server level connection pooling. Every web and
application server can provide support for Connection Pooling.
Q. What is the difference Between getting Connection object by using DriverManager and
DataSource object?
The problem in this approach is if there is any change in java program,to reflect that change we
have to recompile,rebuild and redeploy total application and even some times server restart also
required,which creates a big business impact to the client.
To overcome this problem, we should go for Properties file. The variable things we have to
configure in Properties file and we have to read these properties from java program.
The main advantage of this approach is if there is any change in Properties file and to reflect that
change just redeployment is enough, which won't create any business impact to the client.
JdbcPropertiesDemo.java:
1) import java.sql.*;
2) import java.util.*;
3) import java.io.*;
4) class JdbcPropertiesDemo
5) {
6) public static void main(String[] args) throws Exception
7) {
8) Properties p = new Properties();
9) FileInputStream fis = new FileInputStream("db.properties");
10) p.load(fis);// to load all properties from properties file into java Properties object
11) String url=p.getProperty("url");
12) String user=p.getProperty("user");
13) String pwd=p.getProperty("pwd");
14) Connection con=DriverManager.getConnection(url,user,pwd);
15) Statement st =con.createStatement();
16) ResultSet rs=st.executeQuery("select * from employees");
17) System.out.println("ENO\tENAME\tESAL\tEADDR");
18) System.out.println("---------------------------");
If we change the properties in properties file for mysql database then the program will fetch data
from mysql database.
db.properties:
url= jdbc:mysql://localhost:3306/durgadb
user= root
pwd= root
JdbcPropertiesDemo1.java:
1) import java.sql.*;
2) import java.util.*;
3) import java.io.*;
4) class JdbcPropertiesDemo1
5) {
6) public static void main(String[] args) throws Exception
7) {
8) Properties p = new Properties();
9) FileInputStream fis = new FileInputStream("db1.properties");
10) p.load(fis);// to load all properties from properties file into java Properties object
11) Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE"
,p);
12) Statement st =con.createStatement();
13) ResultSet rs=st.executeQuery("select * from employees");
14) System.out.println("ENO\tENAME\tESAL\tEADDR");
15) System.out.println("---------------------------");
16) while(rs.next())
17) {
18) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getS
tring(4));
19) }
Eg:
Connection
con=DM.getConnection("jdbc:mysql://localhost:3306/durgadb?user=root&password=root");
Eg:
Connection con=DriverManager.getConnection("jdbc:oracle:thin:scott/tiger@localhost:1521:XE");
Hence transaction is a single unit of work and it will work on the rule "either all or none".
All operations should be performed as a single unit only. If debit from sender's account completed
and credit into receiver's account fails then there may be a chance of data inconsistency problems.
All operations should be performed as a single unit only. If some operations success and some
operations fails then there may be data inconsistency problems.
Transaction Properties:
Every Transaction should follow the following four ACID properties.
1. A ➔ Atomiticity
Either all operations should be done or None.
2. C ➔ Consistency(Reliabile Data)
It ensures bringing database from one consistent state to another consistent state.
3. I ➔ isolation (Sepatation)
Ensures that transaction is isolated from other transactions
4. D ➔ Durability
It means once transaction committed, then the results are permanent even in the case of
system restarts, errors etc..
1. Local Transactions
2. Global Transactions
1. Local Transactions:
All operations in a transaction are executed over same database.
Eg: Funds transfer from one accoun to another account where both accounts in the same bank.
2. Global Transactions:
All operations is a transaction are expected over different databases.
Eg: Funds Transfer from one account to another account and accounts are related to different
banks.
Note:
JDBC can provide support only for local transactions.
If we want global transactions then we have to go for EJB or Spring framework.
By default auto commit mode is enabled. i.e after executing every sql query, the changes will be
committed automatically in the database.
We can disable auto commit mode as follows
con.setAutoCommit(false);
2. If all operations completed then we can commit the transaction by using the following method.
con.commit();
3. If any sql query fails then we have to rollback operations which are already completed by using
rollback() method.
con.rollback();
TransactionDemo1.java
1) import java.sql.*;
2) import java.util.*;
3) public class TransactionDemo1
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
8) Statement st = con.createStatement();
9) System.out.println("Data before Transaction");
10) System.out.println("-------------------------");
11) ResultSet rs =st.executeQuery("select * from accounts");
12) while(rs.next())
13) {
14) System.out.println(rs.getString(1)+"..."+rs.getInt(2));
15) }
16) System.out.println("Transaction begins...");
17) con.setAutoCommit(false);
18) st.executeUpdate("update accounts set balance=balance-
10000 where name='durga'");
19) st.executeUpdate("update accounts set balance=balance+10000 where name='sunny'
");
20) System.out.println("Can you please confirm this transaction of 10000....[Yes|No]");
21) Scanner sc = new Scanner(System.in);
22) String option = sc.next();
23) if(option.equalsIgnoreCase("yes"))
24) {
25) con.commit();
26) System.out.println("Transaction Commited");
27) }
28) else
29) {
30) con.rollback();
31) System.out.println("Transaction Rolled Back");
32) }
33) System.out.println("Data After Transaction");
34) System.out.println("-------------------------");
35) ResultSet rs1 =st.executeQuery("select * from accounts");
36) while(rs1.next())
Savepoint(I):
Savepoint is an interface present in java.sql package.
Introduced in JDBc 3.0 Version.
Driver Software Vendor is responsible to provide implementation.
Savepoint concept is applicable only in Transactions.
Savepoint sp = con.setSavepoint();
To perform rollback operation for a particular group of operations wrt Savepoint, we can use
rollback() method as follows.
con.rollback(sp);
We can release or delete Savepoint by using release Savepoint() method of Connection interface.
con.releaseSavepoint(sp);
Case Study:
con.setAutoCommit(false);
Operation-1;
Operation-2;
Operation-3;
Savepoint sp = con.setSavepoint();
Operation-4;
Operation-5;
if(balance<10000)
{
con.rollback(sp);
}
else
{
con.releaseSavepoint(sp);
}
operation-6;
At line-1 if balance <10000 then operations 4 and 5 will be Rollback, otherwise all operations will
be performed normally.
1) import java.sql.*;
2) public class SavePointDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
7) Statement st = con.createStatement();
8) con.setAutoCommit(false);
9) st.executeUpdate("insert into politicians values ('kcr','trs')");
10) st.executeUpdate("insert into politicians values ('babu','tdp')");
11) Savepoint sp = con.setSavepoint();
12) st.executeUpdate("insert into politicians values ('siddu','bjp')");
13) System.out.println("oops ..wrong entry just rollback");
14) //con.rollback(sp);
15) con.releaseSavepoint(sp);
16) //System.out.println("Operations are roll back from Savepoint");
17) con.commit();
18) con.close();
19) }
20) }
Note:
Some drivers won't provide support for Savepoint. Type-1 Driver won't provide support, but Type-
4 Driver can provide support.
Type-4 Driver of Oracle provide support only for setSavepoint() and rollback() methods but not for
releaseSavepoint() method.
durga:50000
At the end, T1 point of view, durga has 50000 balance and T2 point of view durga has 1Lakh. There
may be a chance of data inconsistency problem. This is called Dirty Read Problem.
Eg:
T1: select * from employees;
T2: update employees set esal=10000 where ename='durga';
T1: select * from employees;
In the above example Transaction-1 got different results at different times for the same query.
In the above code whenever transaction-1 performing read operation second time, a new row will
come in the result.
To overcome these problems we should go for Transaction isolation levels.
1. TRANSACTION_READ_UNCOMMITTED ➔ 1
2. TRANSACTION_READ_COMMITTED ➔ 2
3. TRANSACTION_REPEATABLE_READ ➔ 4
4. TRANSACTION_SERIALIZABLE ➔ 8
Before committing the transaction its intermediate results can be used by other transactions.
It does not prevent Dirty Read Problem, Non-Repeatable Read Problem and Phantom Read
Problem.
We can use this isolation level just to indicate database supports transactions.
2. TRANSACTION_READ_COMMITTED:
This isolation level ensures that only committed data can be read by other transactions.
It prevents Dirty Read Problem. But there may be a chance of Non Repeatable Read Problem and
Phantom Read Problem.
3. TRANSACTION_REPEATABLE_READ:
This is the default value for most of the databases. Internally the result of SQL Query will be locked
for only one transaction. If we perform multiple read operations, then there is a guarantee that for
same result.
It prevents Dirty Read Problem and Non Repeatable Read Problems. But still there may be a
chance of Phantom Read Problem.
4. TRANSACTION_SERIALIZABLE:
It is the highest level of isolation.
The total table will be locked for one transaction at a time.
It prevents Dirty Read, Non-Repeatable Read and Phantom Read Problems.
getTransactionIsolation()
Connection interface defines the following method to set our own isolation level.
setTransactionIsolation(int level)
Note:
For Oracle database, the default isolation level is: 2(TRANSACTION_READ_COMMITED).
Oracle database provides support only for isolation levels 2 and 8.
1) TRANSACTION_NONE ➔ 0
It indicates that database won't provide support for transactions.
2) TRANSACTION_READ_UNCOMMITTED ➔ 1
3) TRANSACTION_READ_COMMITTED ➔ 2
4) TRANSACTION_REPEATABLE_READ ➔ 4
5) TRANSACTION_SERIALIZABLE ➔ 8
Eg:
Metadata about database is nothing but database product name, database version etc..
Metadata about ResultSet means no of columns, each column name, column type etc..
1. DatabaseMetaData
2. ResultSetMetaData
3. ParameterMetaData
1. DatabaseMetaData
It is an interface present in java.sql package.
Driver Software vendor is responsible to provide implementation.
We can use DatabaseMetaData to get information about our database like database product
name, driver name, version, number of tables etc..
Once we got DatabaseMetaData object we can call several methods on that object like
getDatabaseProductName()
getDatabaseProductVersion()
getMaxColumnsInTable()
supportsStoredProcedures()
etc...
1) import java.sql.*;
2) class DatabaseMetaDataDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
7) DatabaseMetaData dbmd=con.getMetaData();
8) System.out.println("Database Product Name:"+dbmd.getDatabaseProductName());
9) System.out.println("DatabaseProductVersion:"+dbmd.getDatabaseProductVersion());
10) System.out.println("DatabaseMajorVersion:"+dbmd.getDatabaseMajorVersion());
11) System.out.println("DatabaseMinorVersion:"+dbmd.getDatabaseMinorVersion());
12) System.out.println("JDBCMajorVersion:"+dbmd.getJDBCMajorVersion());
13) System.out.println("JDBCMinorVersion:"+dbmd.getJDBCMinorVersion());
14) System.out.println("DriverName:"+dbmd.getDriverName());
15) System.out.println("DriverVersion:"+dbmd.getDriverVersion());
16) System.out.println("URL:"+dbmd.getURL());
17) System.out.println("UserName:"+dbmd.getUserName());
18) System.out.println("MaxColumnsInTable:"+dbmd.getMaxColumnsInTable());
19) System.out.println("MaxRowSize:"+dbmd.getMaxRowSize());
20) System.out.println("MaxStatementLength:"+dbmd.getMaxStatementLength());
21) System.out.println("MaxTablesInSelect"+dbmd.getMaxTablesInSelect());
22) System.out.println("MaxTableNameLength:"+dbmd.getMaxTableNameLength());
23) System.out.println("SQLKeywords:"+dbmd.getSQLKeywords());
24) System.out.println("NumericFunctions:"+dbmd.getNumericFunctions());
25) System.out.println("StringFunctions:"+dbmd.getStringFunctions());
26) System.out.println("SystemFunctions:"+dbmd.getSystemFunctions());
27) System.out.println("supportsFullOuterJoins:"+dbmd.supportsFullOuterJoins());
28) System.out.println("supportsStoredProcedures:"+dbmd.supportsStoredProcedures());
29) con.close();
30) }
31) }
1) import java.sql.*;
2) import java.util.*;
3) class DatabaseMetaDataDemo2
4) {
5) public static void main(String[] args) throws Exception
6) {
7) int count=0;
8) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
9) DatabaseMetaData dbmd=con.getMetaData();
Note: Some driver softwares may not capture complete information. In that case we will get
default values like zero.
Eg: getMaxRowSize() ➔ 0
ResultSetMetaData:
It is an interface present in java.sql package.
Driver software vendor is responsible to provide implementation.
It provides information about database table represented by ResultSet object.
Once we got ResultSetMetaData object, we can call the following methods on that object like
getColumnCount()
getColumnName()
getColumnType()
etc...
1) import java.sql.*;
2) class ResultSetMetaDataDemo
3) {
App3: Program to display Table Data including Column Names by using ResultMetaData
1) import java.sql.*;
2) class ResultSetMetaDataDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
7) Statement st = con.createStatement();
8) ResultSet rs = st.executeQuery("select * from movies");
9) ResultSetMetaData rsmd=rs.getMetaData();
10) String col1=rsmd.getColumnName(1);
11) String col2=rsmd.getColumnName(2);
12) String col3=rsmd.getColumnName(3);
13) String col4=rsmd.getColumnName(4);
14) System.out.println(col1+"\t"+col2+"\t"+col3+"\t"+col4);
15) System.out.println("---------------------------------");
16) while(rs.next())
17) {
18) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.get
String(4));
19) }
20) }
21) }
We can use ParameterMetaData to get information about positional parameters like parameter
count,parameter mode, and parameter type etc...
ParameterMetaData pmd=pst.getParameterMetaData();
Once we got ParameterMetaData object, we can call several methods on that object like
1. int getParameterCount()
2. int getParameterMode(int param)
3. int getParameterType(int param)
4. String getParameterTypeName(int param)
etc..
1) import java.sql.*;
2) class ParameterMetaDataDemo
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","system","durga");
7) PreparedStatement pst = con.prepareStatement("insert into employees values(?,?,?,?)
");
8) ParameterMetaData pmd=pst.getParameterMetaData();
9) int count=pmd.getParameterCount();
10) for(int i=1;i<= count;i++)
11) {
12) System.out.println("Parameter Number:"+i);
13) System.out.println("Parameter Mode:"+pmd.getParameterMode(i));
14) System.out.println("Parameter Type:"+pmd.getParameterType(i));
15) System.out.println("Parameter Precision:"+pmd.getPrecision(i));
16) System.out.println("Parameter Scale:"+pmd.getScale(i));
17) System.out.println("Parameter isSigned:"+pmd.isSigned(i));
18) System.out.println("Parameter isNullable:"+pmd.isNullable(i));
19) System.out.println("---------------");
20) }
21) con.close();
22) }
23) }
2) We have to browse our Excel File by using "Select Work Book" Button.
Progaram to read data from excel and copy into Oracle Database:
1) import java.sql.*;
2) public class ExcelDemo2
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
7) Connection con = DriverManager.getConnection("jdbc:odbc:demodsnforexcel2");
8) Statement st = con.createStatement();
9) ResultSet rs=st.executeQuery("select * from [Sheet1$]");
10) Connection con2=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
11) PreparedStatement pst=con2.prepareStatement("insert into employees values(?,?,?,?
)");
12) while(rs.next())
13) {
14) pst.setInt(1,rs.getInt(1));
15) pst.setString(2,rs.getString(2));
16) pst.setFloat(3,rs.getFloat(3));
17) pst.setString(4,rs.getString(4));
18) pst.executeUpdate();
19) }
20) System.out.println("Data Inserted Successfully from Excel to Oracle");
21) con.close();
22) con2.close();
23) }
24) }
We can specify explicitly ResultSet as Read only by using the following constant of ResultSet.
2. Updatable ResultSets:
The ResultSet which allows programmer to perform updations, such type of ResultSets are called
Updatable ResultSets.
In this case we can perform select, insert, delete and update operations.
We can specify ResultSet explicitly as Updatable by using the following constant of ResultSet.
Division-2:
Based on Cursor movement, ResultSets will be divided into the following 2 types.
2. Scrollable ResultSets:
It allows the programmers to iterate in both forward and backward directions.
We can also jump to a particular position randomly, or relative to current position. Here we can
move to anywhere.
We can specify explicitly ResultSet as Scroll insensitive by using the following constant
We can specify explicitly ResultSet as scroll sensitive by using the following constant..
Statement st =con.createStatement(1005,1008);
Note:
To use various types of ResultSets underlying database support and driver support must be
required
Some databases and some driver softwares wont provide proper support.
We can check whether the database supports a particular type of ResultSet or not by using the
following methods of DatabaseMetaData.
Retrieves whether this database supports the given concurrency type in combination with the
given result set type.
Retrieves whether this database supports the given result set type.
1) import java.sql.*;
2) class ResultSetTypeTest
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
7) DatabaseMetaData dbmd=con.getMetaData();
8) System.out.println(dbmd.supportsResultSetConcurrency(1003,1007));
9) System.out.println(dbmd.supportsResultSetConcurrency(1003,1008));
10) System.out.println(dbmd.supportsResultSetType(1003));
11) System.out.println(dbmd.supportsResultSetType(1004));
12) System.out.println(dbmd.supportsResultSetType(1005));
13) }
14) }
2.rs.getXxx()
Read column values from record either with column index or with column name
3.rs.getRow()
It returns current position of cursor in the ResultSet i.e row number
4.rs.previous()
It checks whether previous record is available or not. If it is available then the cursor will move
to that record position
5.rs.beforeFirst();
the cursor will be moved to before first record position
6.rs.afterLast()
moves the cursor after last record position
7.rs.first()
moves the cursor to the first record position
8.rs.last()
moves the cursor to the last record position
9.rs.absolute(int x)
The argument can be either positive or negative.
If it is positive then the cursor will be moved to that record position from top of ResultSet.
If the argument is negative then it will be moved to the specified record position from last.
10.rs.relative(int x)
The argument can be either positive or negative
If the argument is positive then the cursor will move to forward direction to specified number of
records from the current position. If the argument is negative then the cursor will move to
backward direction to the specified number of records from the current position.
11. rs.isFirst()
returns true if the cursor is locating at first record position
12. rs.isLast()
13. rs.isBeforeFirst()
14. rs.isAfterLast()
15. rs.refreshRow()
We can use this method in scroll sensitive ResultSets to update row with latest values from
Database.
Note:
1) import java.sql.*;
2) class ResultSetTypesDemo1
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
7) Statement st =con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.C
ONCUR_READ_ONLY);
8) ResultSet rs=st.executeQuery("select * from employees");
9) System.out.println("Records in Forward Direction");
10) System.out.println("ENO\tENAME\tESAL\tEADDR");
11) System.out.println("---------------------------");
12) while(rs.next())
13) {
14) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getS
tring(4));
15) }
16) System.out.println("Records in Backword Direction");
17) System.out.println("ENO\tENAME\tESAL\tEADDR");
18) System.out.println("---------------------------");
19) while(rs.previous())
20) {
21) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getS
tring(4));
22) }
23) con.close();
24) }
25) }
1) import java.sql.*;
2) class ResultSetTypesDemo2
3) {
4) public static void main(String[] args) throws Exception
5) {
1) import java.sql.*;
2) class ResultSetTypesDemo3
3) {
4) public static void main(String[] args) throws Exception
5) {
6) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
7) Connection con = DriverManager.getConnection("jdbc:odbc:demodsn","scott","tiger");
8) System.out.println(con);
9) Statement st =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CON
CUR_UPDATABLE);
10) ResultSet rs=st.executeQuery("select * from employees");
11) System.out.println("Records Before Updation");
12) System.out.println("ENO\tENAME\tESAL\tEADDR");
13) System.out.println("---------------------------");
14) while(rs.next())
15) {
Note: Very few Drivers provide support for SCROLL_SENSITIVE Result Sets. Type-1 Driver will
provide support for this feature. But it supports only update operation, but not delete and insert
operations.
Type-2 driver also can provide support for SCROLL_SENSITIVE ResultSets. But we should not use *
in select query. we should use only column names. It supports only update operation, but not
delete and insert operations.
Note: Very few Drivers provide support for SCROLL_SENSITIVE Result Sets. Type-1 Driver will
provide support for this feature. But it supports only update operation, but not delete and insert
operations.
Type-2 driver also can provide support for SCROLL_SENSITIVE ResultSets. But we should not use *
in select query. we should use only column names. It supports only update operation, but not
delete and insert operations.
Updatable ResultSets:
If we perform any changes to the ResultSet and if those changes are reflecting to the Database,
such type of ResultSets are called Updatable ResultSets.
By default ResultSet is Read only. But we can specify explicitly as updatable by using the following
constant.
CONCUR_UPDATABLE ➔ 1008
Statement st
=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
1) import java.sql.*;
2) import java.util.*;
3) class ResultSetTypesDemo5
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
8) Connection con = DriverManager.getConnection("jdbc:odbc:demodsn","scott","tiger");
9) Statement st =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CON
CUR_UPDATABLE);
10) ResultSet rs=st.executeQuery("select * from employees");
11) rs.last();
12) rs.deleteRow();
13) con.close();
14) }
15) }
Note: Very few Drivers provide support for CONCUR_UPDATABLE Result Sets. Type-1 Driver will
provide support for this feature.
Type-2 driver also can provide support for CONCUR_UPDATABLE ResultSets. But we should not use
* In select query. we should use only column names.
Sample Code Eg 2:
1) while(rs.next())
2) {
3) float esal = rs.getFloat(3);
4) if(esal<5000)
5) {
6) float incr_sal=esal+777;
7) rs.updateFloat(3,incr_sal);
8) rs.updateRow();
9) }
10) }
1) import java.sql.*;
2) import java.util.*;
3) class ResultSetTypesDemo4
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
8) Connection con = DriverManager.getConnection("jdbc:odbc:demodsn","scott","tiger");
9) Statement st =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CON
CUR_UPDATABLE);
10) ResultSet rs=st.executeQuery("select * from employees");
11) while(rs.next())
12) {
13) float esal = rs.getFloat(3);
14) if(esal<5000)
15) {
16) float incr_sal=esal+777;
17) rs.updateFloat(3,incr_sal);
18) rs.updateRow();
19) }
20) }
21) con.close();
22) }
23) }
Note: Very few Drivers provide support for CONCUR_UPDATABLE Result Sets. Type-1 Driver will
provide support for this feature.
Type-2 driver also can provide support for CONCUR_UPDATABLE ResultSets. But we should not use
* In select query. we should use only column names.
1) import java.sql.*;
2) import java.util.*;
3) class ResultSetTypesDemo4T2
4) {
5) public static void main(String[] args) throws Exception
6) {
7) //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
8) Connection con = DriverManager.getConnection("jdbc:oracle:oci8:@XE","scott","tiger");
9) Statement st =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CON
CUR_UPDATABLE);
10) ResultSet rs=st.executeQuery("select eno,ename,esal,eaddr from employees");
Note: Very few Drivers provide support for CONCUR_UPDATABLE Result Sets. Type-1 Driver will
provide support for this feature.
Type-2 driver also can provide support for CONCUR_UPDATABLE ResultSets. But we should not use
* In select query. we should use only column names.
Insert operation:
Sample code:
1) rs.moveToInsertRow();
2) rs.updateInt(1,1010);
3) rs.updateString(2,"sunny");
4) rs.updateFloat(3,3000);
5) rs.updateString(4,"Mumbai");
6) rs.insertRow();
Note: Very few Drivers provide support for CONCUR_UPDATABLE Result Sets. Type-1 Driver will
provide support for this feature.
Type-2 driver also can provide support for CONCUR_UPDATABLE ResultSets. But we should not use
* In select query. we should use only column names.
Conclusions:
1.Updatable ResultSets allows the programmer to perform following operations on ResultSet.
select
insert
delete
update
2. Updatable ResultSets allows the programmer to perform insert, update and delete database
operations without using SQL Queries.
5.It is not recommended to perform database updations by using updatable ResultSets, b'z most
of the drivers and most of the databases won't provide support for Updatable ResultSets.
ResultSet Holdability:
The ResultSet holdability represents whether the ResultSet is closed or not whenever we call
commit() method on the Connection object.
HOLD_CURSORS_OVER_COMMIT ➔ 1
CLOSE_CURSORS_AT_COMMIT ➔ 2
HOLD_CURSORS_OVER_COMMIT:
It means the ResultSet will be opened for further operations even after calling con.commit()
method.
It means that ResultSet will be closed automatically whenever we are calling con.commit()
method.
SOP(rs.getHoldability());
We can check whether database provides support for a particular holdability or not by using the
following method of DatabaseMetaData.
supportsResultSetHoldability()
Statement st = con.createStatement(1005,1008,2);
Note: Most of the databases like Oracle, MySQL won't provide support for holdability 2.
1) import java.sql.*;
2) import java.util.*;
3) class ResultSetHoldabilityDemo3
4) {
5) public static void main(String[] args) throws Exception
6) {
7) Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE
","scott","tiger");
8) Statement st =con.createStatement();
9) System.out.println("Type :"+st.getResultSetType());
10) System.out.println("Concurrency :"+st.getResultSetConcurrency());
11) System.out.println("Holdability:"+st.getResultSetHoldability());
12) }
13) }
We can use RowSet to handle a group of records in more effective way than ResultSet.
RowSet interface present in javax.sql package
By default RowSet is serializable and hence we can send RowSet object across the network. But
ResultSet object is not serializable.
ResultSet is connected i.e to use ResultSet compulsary database Connection must be required.
Types of RowSets:
There are two types of RowSets
1.Connected RowSets
2. Disconnected RowSets
Connected RowSets:
Connected RowSets are just like ResultSets.
To access RowSet data compulsary connection should be available to database.
Eg: JdbcRowSet
Disconnected RowSets:
Without having Connection to the database we can access RowSet data.
We can serialize Disconnected RowSets.
Eg:
CachedRowSet
WebRowSet
ResultSet (I)
RowSet (I)
Connected Disconnected
WebRowSet (I)
1) import javax.sql.rowset.*;
2) public class Test
3) {
4) public static void main(String[] args) throws Exception
5) {
6) RowSetFactory rsf=RowSetProvider.newFactory();
7) JdbcRowSet jrs=rsf.createJdbcRowSet();
8) CachedRowSet crs=rsf.createCachedRowSet();
9) WebRowSet wrs=rsf.createWebRowSet();
10) JoinRowSet jnrs=rsf.createJoinRowSet();
11) FilteredRowSet frs=rsf.createFilteredRowSet();
12)
1.JdbcRowSet(I):
It is exactly same as ResultSet except that it is scrollable and updatable.
JdbcRowSet is connected and hence to access JdbcRowSet compulsary Connection must be
required.
JdbcRowSet is non serializable and hence we cannot send RowSet object across the network.
1) import javax.sql.rowset.*;
2) public class JdbcRowSetRetrieveDemo {
3) public static void main(String[] args)throws Exception {
4) RowSetFactory rsf=RowSetProvider.newFactory();
5) JdbcRowSet rs=rsf.createJdbcRowSet();
6) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
7) rs.setUsername("root");
8) rs.setPassword("root");
9) rs.setCommand("select * from employees");
10) rs.execute();
11) System.out.println("Employee Details In Forward Direction");
12) System.out.println("ENO\tENAME\tESAL\tEADDR");
13) System.out.println("----------------------------------");
14) while(rs.next()){
15) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getS
tring(4));
16) }
17) System.out.println("Employee Details In Backward Direction");
18) System.out.println("ENO\tENAME\tESAL\tEADDR");
19) System.out.println("----------------------------------");
20) while(rs.previous()){
21) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getS
tring(4));
22) }
23) System.out.println("Accessing Randomly...");
24) rs.absolute(3);
25) System.out.println(rs.getRow()+"---
>"+rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getString(4));
26) rs.first();
27) System.out.println(rs.getRow()+"---
>"+rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getString(4));
1) import java.util.Scanner;
2) import javax.sql.rowset.*;
3) public class JdbcRowSetInsertDemo {
4) public static void main(String[] args)throws Exception {
5) RowSetFactory rsf=RowSetProvider.newFactory();
6) JdbcRowSet rs=rsf.createJdbcRowSet();
7) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
8) rs.setUsername("root");
9) rs.setPassword("root");
10) rs.setCommand("select * from employees");
11) rs.execute();
12) Scanner s=new Scanner(System.in);
13) rs.moveToInsertRow();
14) while(true){
15) System.out.print("Employee Number :");
16) int eno=s.nextInt();
17) System.out.print("Employee Name :");
18) String ename=s.next();
19) System.out.print("Employee Salary :");
20) float esal=s.nextFloat();
21) System.out.print("Employee Address :");
22) String eaddr=s.next();
23)
24) rs.updateInt(1, eno);
25) rs.updateString(2, ename);
26) rs.updateFloat(3, esal);
27) rs.updateString(4, eaddr);
28) rs.insertRow();
29)
30) System.out.println("Employee Inserted Successfully");
31) System.out.print("Do You Want to insert One more Employee[yes/no]? :");
32) String option=s.next();
33) if(option.equalsIgnoreCase("No")){
34) break;
35) }
36) }
37) rs.close();
38) }
39) }
1) import javax.sql.rowset.*;
2) public class JdbcRowSetUpdateDemo {
3) public static void main(String[] args)throws Exception {
4) RowSetFactory rsf=RowSetProvider.newFactory();
5) JdbcRowSet rs=rsf.createJdbcRowSet();
6) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
7) rs.setUsername("root");
8) rs.setPassword("root");
9) rs.setCommand("select * from employees");
10) rs.execute();
11) while(rs.next()){
12) float esal=rs.getFloat(3);
13) if(esal<10000){
14) float new_Esal=esal+500;
15) rs.updateFloat(3, new_Esal);
16) rs.updateRow();
17) }
18) }
19) System.out.println("Records Updated Successfully");
20) rs.close();
21) }
22) }
1) import javax.sql.rowset.*;
2) public class JdbcRowSetDeleteDemo {
3) public static void main(String[] args)throws Exception {
4) RowSetFactory rsf=RowSetProvider.newFactory();
5) JdbcRowSet rs=rsf.createJdbcRowSet();
6) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
7) rs.setUsername("root");
8) rs.setPassword("root");
9) rs.setCommand("select * from employees");
10) rs.execute();
11) while(rs.next()){
12) float esal=rs.getFloat(3);
13) if(esal>5000){
14) rs.deleteRow();
15) }
16) }
17) System.out.println("Records Deleted Successfully");
18) rs.close();
19) }
20) }
It is Serializable.
The main advantage of CachedRowSet is we can send this RowSet object for multiple people
across the network and all those people can access RowSet data without having DB Connection.
1) import java.sql.*;
2) import javax.sql.rowset.*;
3) public class CachedRowSetDemo {
4) public static void main(String[] args)throws Exception {
5) Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/durgadb
","root","root");
6) Statement st =con.createStatement();
7) ResultSet rs =st.executeQuery("select * from employees");
8) RowSetFactory rsf=RowSetProvider.newFactory();
9) CachedRowSet crs=rsf.createCachedRowSet();
10) crs.populate(rs);
11) con.close();
12) //Now we cannot access RS but we can access CRS
13) //if(rs.next()){}RE:SQLException:Operation not allowed after ResultSet closed
14) System.out.println("ENO\tENAME\tESAL\tEADDR");
15) System.out.println("-----------------------------");
16) while(crs.next()){
17) System.out.println(crs.getInt(1)+"\t"+crs.getString(2)+"\t"+crs.getFloat(3)+"\t"+crs.
getString(4));
18) }
19) }
20) }
1) import javax.sql.rowset.*;
2) public class CachedRowSetRetrieveDemo {
3) public static void main(String[] args)throws Exception {
4) RowSetFactory rsf=RowSetProvider.newFactory();
5) CachedRowSet rs=rsf.createCachedRowSet();
6) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
1) import java.util.*;
2) import javax.sql.rowset.*;
3)
4) public class CachedRowSetInsertDemo {
5) public static void main(String[] args)throws Exception{
6) RowSetFactory rsf=RowSetProvider.newFactory();
7) CachedRowSet rs=rsf.createCachedRowSet();
8) rs.setUrl("jdbc:mysql://localhost:3306/durgadb?relaxAutoCommit=true");
9) rs.setUsername("root");
10) rs.setPassword("root");
11) rs.setCommand("select * from employees");
12) rs.execute();
13) Scanner s=new Scanner(System.in);
14) while(true){
15) System.out.print("Employee Number :");
16) int eno=s.nextInt();
17) System.out.print("Employee Name :");
18) String ename=s.next();
19) System.out.print("Employee Salary :");
20) float esal=s.nextFloat();
21) System.out.print("EMployee Address :");
22) String saddr=s.next();
23)
24) rs.moveToInsertRow();
25) rs.updateInt(1, eno);
26) rs.updateString(2, ename);
27) rs.updateFloat(3, esal);
1) import javax.sql.rowset.*;
2)
3) public class CachedRowSetUpdateDemo {
4) public static void main(String[] args)throws Exception{
5)
6) RowSetFactory rsf=RowSetProvider.newFactory();
7) CachedRowSet rs=rsf.createCachedRowSet();
8) rs.setUrl("jdbc:mysql://localhost:3306/durgadb?relaxAutoCommit=true");
9) rs.setUsername("root");
10) rs.setPassword("root");
11) rs.setCommand("select * from employees");
12) rs.execute();
13) while(rs.next()){
14) float esal=rs.getFloat(3);
15) if(esal<10000){
16) esal=esal+500;
17) rs.updateFloat(3, esal);
18) rs.updateRow();
19) }
20) }
21) rs.moveToCurrentRow();
22) rs.acceptChanges();
23) System.out.println("Records Updated Successfully");
24) rs.close();
25) }
26) }
1) import javax.sql.rowset.*;
2)
3) public class CachedRowSetDeleteDemo {
4) public static void main(String[] args)throws Exception{
5)
6) RowSetFactory rsf=RowSetProvider.newFactory();
7) CachedRowSet rs=rsf.createCachedRowSet();
8) rs.setUrl("jdbc:mysql://localhost:3306/durgadb?relaxAutoCommit=true");
9) rs.setUsername("root");
10) rs.setPassword("root");
11) rs.setCommand("select * from employees");
12) rs.execute();
13) while(rs.next()){
14) float esal=rs.getFloat(3);
15) if(esal>6000){
16) rs.deleteRow();
17) }
18) }
19) rs.moveToCurrentRow();
20) rs.acceptChanges();
21) rs.close();
22) System.out.println("Records deleted successfully");
23) }
24) }
WebRowSet(I):
It is the child interface of CachedRowSet.
It is bydefault scrollable and updatable.
It is disconnected and serializable
WebRowSet can publish data to xml files,which are very helpful for enterprise applications.
1) import java.io.*;
2) import javax.sql.rowset.*;
3)
1) import java.io.*;
2) import javax.sql.rowset.*;
3) public class WebRowSetInsertDemo {
4) public static void main(String[] args)throws Exception {
5) RowSetFactory rsf=RowSetProvider.newFactory();
6) WebRowSet rs=rsf.createWebRowSet();
7) rs.setUrl("jdbc:mysql://localhost:3306/durgadb?relaxAutoCommit=true");
8) rs.setUsername("root");
9) rs.setPassword("root");
10) rs.setCommand("select * from employees");
11) rs.execute();
12) FileReader fr=new FileReader("emp.xml");
13) rs.readXml(fr);
14) rs.acceptChanges();
15) System.out.println("emp data inserted successfully");
16) fr.close();
17) rs.close();
18) }
19) }
Note: In emp.xml file, <insertRow> tag must be provided under <data> tag
Note: In emp.xml file, <deleteRow> tag must be provided under <data> tag
JoinRowSet:
It is the child interface of WebRowSet.
It is by default scrollable and updatable
It is disconnected and serializable
If we want to join rows from different rowsets into a single rowset based on matched
column(common column) then we should go for JoinRowSet.
1) import java.sql.*;
2) import javax.sql.rowset.*;
3) public class JoinRowSetRetriveDemo {
4) public static void main(String[] args)throws Exception {
5) //Class.forName("com.mysql.jdbc.Driver");
6) Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/durgadb
","root", "root");
7) RowSetFactory rsf=RowSetProvider.newFactory();
8)
9) CachedRowSet rs1=rsf.createCachedRowSet();
10) rs1.setCommand("select * from student");
11) rs1.execute(con);
12)
13) CachedRowSet rs2=rsf.createCachedRowSet();
14) rs2.setCommand("select * from courses");
15) rs2.execute(con);
16)
17) JoinRowSet rs=rsf.createJoinRowSet();
Note: students and courses tables must require in database with a matched column[Join column]
cid.
students courses
|SID(PK)|SNAME|SADDR|CID| |CID(PK)|CNAME|CCOST|
FilteredRowSet(I):
It is the child interface of WebRowSet.
If we want to filter rows based on some condition then we should go for FilteredRowSet.
1) import java.sql.*;
2) import javax.sql.*;
3) import javax.sql.rowset.*;
4) class EmployeeSalaryFilter implements Predicate{
5) float low;
6) float high;
7) public EmployeeSalaryFilter(float low,float high) {
8) this.low=low;
9) this.high=high;
10) }
11) //this method will be called at the time of row insertion
12) public boolean evaluate(Object value, String columnName) throws SQLException {
13) return false;
14) }
15) //this method will be called at the time of row insertion
16) public boolean evaluate(Object value, int column) throws SQLException {
17) return false;
18) }
19) public boolean evaluate(RowSet rs) {
20) boolean eval=false;
21) try{
22) FilteredRowSet frs=(FilteredRowSet)rs;
23) float esal=frs.getFloat(3);
24) if((esal>=low) && (esal<=high)){
25) eval=true;
26) }else{
27) eval=false;
28) }
29) }catch(Exception e){
30) e.printStackTrace();
31) }
32) return eval;
33) }
34) }
35) public class FilteredRowSetRetriveDemo {
36) public static void main(String[] args)throws Exception {
37) RowSetFactory rsf=RowSetProvider.newFactory();
38) FilteredRowSet rs=rsf.createFilteredRowSet();
39) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
40) rs.setUsername("root");
41) rs.setPassword("root");
42) rs.setCommand("select * from employees");
1) import javax.sql.*;
2) import javax.sql.rowset.*;
3) class RowSetListenerImpl implements RowSetListener{
4)
5) public void rowSetChanged(RowSetEvent event) {
6) System.out.println("RowSetChanged");
7) }
8)
9) public void rowChanged(RowSetEvent event) {
10) System.out.println("RowChanged");
11) }
12)
13) public void cursorMoved(RowSetEvent event) {
14) System.out.println("CursorMoved");
15) }
16) }
17) public class RowSetListenerDemo {
18)
19) public static void main(String[] args)throws Exception {
20) RowSetFactory rsf=RowSetProvider.newFactory();
21) JdbcRowSet rs=rsf.createJdbcRowSet();
22) rs.setUrl("jdbc:mysql://localhost:3306/durgadb");
23) rs.setUsername("root");
24) rs.setPassword("root");
25) rs.setCommand("select * from employees");
26) rs.addRowSetListener(new RowSetListenerImpl());
27) rs.execute();
28) while(rs.next()){
29) System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getFloat(3)+"\t"+rs.getS
tring(4));
30) }
31) rs.moveToInsertRow();
32) rs.updateInt(1, 777);
33) rs.updateString(2, "malli");
34) rs.updateFloat(3,9000);
35) rs.updateString(4, "Hyd");
36) rs.insertRow();
37) rs.close();
38) }
39) }
ResultSet RowSet
1) ResultSet present in java.sql Package. 1) RowSet present in javax.sql Package.
2) By Default ResultSet is Non Scrollable and 2) By Default RowSet is Scrollable and
Non Updatable (Forward only and Read only). Updatable.
3) ResultSet Objects are Non Serializable and 3) RowSet Objects are Serializable and hence
we can't send over Network. we can send over Network.
4) ResultSet Objects are Connection oriented 4) RowSet Objects are Connection Less
i.e. we can access ResultSet Data as long as Objects i.e. we can access RowSet Data
Connection is available once Connection closed without having Connection to DB (except
we can't access ResultSet Data. JdbcRowSet).
5) ResultSet Object is used to store Records 5) RowSet Object is also used to store Records
returned by Select Query. returned by Select Query.
6) We can createResultSet Object as follows 6) RowSetFactory rsf =
Connection con = DriverManager.getConnection RowSetProvider.newFactory();
(url, uname, pwd); JdbcRowSet rs = rsf.createJdbcRowSet();
Statement st = con.createStatement(); rs.setUserName(user);
ResultSet rs = st.executeQuery(SQLQuery); rs.setUrl(jdbcurl);
rs.setPassword(pwd);
rs.setCommand(query);
rs.execute();
7) ResultSet Object is not having Event 7) RowSet Object is having Event
Notification Model. Notification Model.
3. Type-3 Driver (All Java Net Protocol Driver OR Network Protocol Driver OR Middleware Driver)
4. Type-4 Driver (All Java Native Protocol Driver OR Pure Java Driver OR Thin Driver)
1. executeQuery():
can be used for Select Queries
2. executeUpdate():
Can be used for Non-Select Queries (Insert|Delete|Update)
3. execute()
Can be used for both Select and Non-Select Queries
It can also be used to call Stored Procedures.
4. executeBatch()
Can be used to execute Batch Updates
2. If we know the Type of Query at the beginning and it is always Non-Select Query then we should
use executeUpdate() Method.
Hence, by using Statement Object we can send our SQL Query to the Database and we can get
Results from Database.
Statement (I)
PreparedStatement (I)
CallableStatement (I)
1. Statement:
If we want to execute multiple Queries then we can use Statement Object.
Every time Query will be compiled and executed. Hence relatively performance is low.
2. PreparedStatement:
If we want to execute same Query multiple times then we should go for PreparedStatement.
Here Query will be compiled only once even though we executed multiple times. Hence relatively
performance is high.
3. CallableStatement:
We can use CallableStatement to call Stored Procedures and Functions from the Database.
2) Whenever we are using execute Method, 2) Whenever we are using execute Method,
every time Query will be compiled and Query won't be compiled just will be executed.
executed.
3) Statement Object can work only for Static 3) PS Object can work for both Static and
Queries. Dynamic Queries.
4) Relatively Performance is Low. 4) Relatively Performance is High.
5) Best choice if we want to work with 5) Best choice if we want to work with only
multiple Queries. one Query but required to execute multiple
times.
6) There may be a chance of SQL Injection 6) There is no chance of SQL Injection
Attack. Attack.
7) Inserting Date and Large Objects (CLOB and 7) Inserting Date and Large Objects (CLOB and
BLOB) is difficult. BLOB) is easy.
1. Driver
2. DriverManager
3. Connection
4. Statement
5. ResultSet
2. DriverManager:
DriverManager is a Java class present in java.sql Package.
It is responsible to manage all Database Drivers available in our System.
DriverManager.registerDriver(driver);
DriverManager.unregisterDriver(driver);
DriverManager is responsible to establish Connection to the Database with the help of Driver
Software.
Connection con=DriverManager.getConnection(jdbcurl,username,pwd);
3. Connection (Road):
By using Connection, Java Application can communicate with Database.
4. Statement (Vehicle):
By using Statement Object we can send our SQL Query to the Database and we can get Results
from Database.
To send SQL Query to the Database and to bring Results from Database some Vehicle must be
required. This Vehicle is nothing but Statement Object.
Hence, by using Statement Object we can send our SQL Query to the Database and we can get
Results from Database.
1.Statement
2.PreparedStatement
3.CallableStatement
5. ResultSet:
Whenever we are executing Select Query, Database engine will provide Result in the form of
ResultSet. Hence ResultSet holds Results of SQL Query. By using ResultSet we can access the
Results.
JDBC Architecture
Java Application
JDBC API
DriverManager
Java Application can communicate with any Database with the help of DriverManager and
Database specific Driver.
DriverManager:
Database Driver:
It is the very Important Component of JDBC Architecture.
Without Driver Software we cannot Touch Database.
It acts as Bridge between Java Application and Database.
It is responsible to convert Java calls into Database specific calls and Database specific calls
into Java Calls.
Eg:
Upload Image in Matrimonial Web Sites
Upload Resume in Job related Web Sites
To Store and Retrieve Large Information we should go for Large Objects (LOBs).
BLOB Type Objects can be Images, Video Files, Audio Files etc..
CLOB can be used to Store Large Text Documents (May Plain Text OR XML Documents)
Eg: hydhistory.txt
For Example our Requirement is to execute 1000 Queries. If we are trying to submit 1000 Queries
to the Database one by one then we need to communicate with the Database 1000 times. It
increases Network Traffic between Java Application and Database and even creates Performance
Problems also.
To overcome these Problems, we should go for Batch Updates. We can Group all related SQL
Queries into a Single Batch and we can send that Batch at a time to the Database.
Sample Code:
st.addBatch(sqlQuery-1);
st.addBatch(sqlQuery-2);
st.addBatch(sqlQuery-3);
st.addBatch(sqlQuery-4);
st.addBatch(sqlQuery-5);
st.addBatch(sqlQuery-6);
...
st.addBatch(sqlQuery-1000);
st.executeBatch();
16) I have loaded both Oracle and MySQL drivers, Which database connection will be
established when we call getConnection(...)method?
Ans: Based on jdbc url the Connection object will be created to the database.
17) I have loaded Oracle driver and trying to get the connection with MySQL URL What
will happen?
Code:
Class.for Name("oracle.jdbc.OracleDriver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/durgadb","root","root");
In JDBC API or in java.sql package, SUN has given more interfaces like Connection,
Statement, ResultSet, Etc., How Instances will be created?
22) How many types of JDBC Drivers are available? Which is best?
26) Whenever we are using Class.forName() method to load Driver class automatically
Driver will be Registered with DriverManager. Then what is the need of DriverManager
class registerDriver() method.
Ans: This method is useful whenever we are using Non-JDK Complaint Driver.
29) Can we specify the column name in the select statement or not?
37) While creating the statement do we need to provide any SQL statement?
38) What are the methods can be used from statement to submit the SQL Query to
database.?
40) How many Queries we can submit by using one statement object?
41) How many types of queries I can submit using one statement object?
43) When you submit the SQL statement to database using statement then how many
times the SQL statement will be compiled/verified?
44) How to use dynamic value to the SQL statement in the case of statement object?
50) While creating the prepared Statement do we need to provide any SQL Statement?
51) What are the methods can be used from Prepared Statement to submit the SQL Query
to database?
52) How many Queries we can submit using one Prepared Statement object?
53) How many types of queries We can submit using one PreparedStatement object?
55) How to use dynamic value to the SQL statement in the case of PreparedStatement
object?
63) While creating the Callable Statement do we need to provide any SQL Statement?
65) What are the methods can be used from CallableStatement to call the procedure from
database?
66) When we call the procedure from database using CallableStatement then how many
times the SQL Statement will be compiled/verified?
67) How to use dynamic value to the procedure in the case of CallableStatement object?
68) How can we call the procedure from Java application using input parameter?
69) How can you call the procedure from Java Application using output parameter of the
procedure?
73) How to get the result from the callable statement if you invoke any stored function?
75) Can I access Statement and ResultSet after closing the connection?
76) What is the Batch Update? OR What is the advantage of Batch Update?
83) Can I submit different types of SQL statement with Batch Update using Statement?
84) Can I submit different types of SQL statement with Batch Update using Prepared
Statement?
95) How can I check whether Database supports batch update or not?
103) How can I access the name & order of the columns available in Resultset?
104) How can I access the type of the columns available in Resultset?
118) What will happen when Iam not specifying the isolation Level with JDBC?
123) What are the advantages of DataSource Connections over Driver Manager
connections ?
129) What are the types of ResultSet available as per Cursor movement?
132) Can I call the following method with Forward Only ResultSet?
previous()
first()
last()
absolute()
relative()
139) Can I call the following method with Read Only Resultset?
moveTolnsertRow()
updateRow()
deleteRow()
insertRow()
updateX(int col_lndex, X value)
moveTolnsertRow()
updateRow()
deleteRow()
insertRow()
updateX(int col_lndex, X value)
143) What are the constants defined to specify the Resultset type?
145) What are the constants defined to specify the Resultset concurrency?