Professional Documents
Culture Documents
JDBC
JDBC
JDBC ODBC
Rajnish
Rajnish
[Pick the date]
JDBC Introduction
JDBC Architecture Insert Records
Java Database Connectivity Steps
Test JDBC Driver Installation & Connection Inserting Data into SQL Tables
The JDBC ( Java Database Connectivity) API defines interfaces and classes for writing database
applications in Java by making database connections. Using JDBC you can send SQL, PL/SQL
statements to almost any relational database. JDBC is a Java API for executing SQL statements and
supports basic SQL functionality. It provides RDBMS access by allowing you to embed SQL inside Java
code. Because Java can run on a thin client, applets embedded in Web pages can contain downloadable
JDBC code to enable remote database access. You will learn how to create a table, insert values into it,
query the table, retrieve results, and update the table with the help of a JDBC Program example.
Although JDBC was designed specifically to provide a Java interface to relational databases, you may
find that you need to write Java code to access non-relational databases as well.
JDBC Architecture
Java application calls the JDBC library. JDBC loads a driver which talks to the database. We can change
database engines without changing database code.
import java.sql.*; The star ( * ) indicates that all of the classes in the package java.sql are to be
imported.
In this step of the jdbc connection process, we load the driver class by calling Class.forName() with the
Driver class name as an argument. Once loaded, the Driver class creates an instance of itself. A client
can connect to Database Server through JDBC Driver. Since most of the Database servers support
ODBC driver therefore JDBC-ODBC Bridge driver is commonly used.
The return type of the Class.forName (String ClassName) method is “Class”. Class is a class in
java.lang package.
try {
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”); //Or any
other driver
}
catch(Exception x){
System.out.println( “Unable to load the driver class!”
);
}
The JDBC DriverManager class defines objects which can connect Java applications to a JDBC driver.
DriverManager is considered the backbone of JDBC architecture. DriverManager class manages the
JDBC drivers that are installed on the system. Its getConnection() method is used to establish a
connection to a database. It uses a username, password, and a jdbc url to establish a connection to the
database and returns a connection object. A jdbc Connection represents a session/connection with a
specific database. Within the context of a Connection, SQL, PL/SQL statements are executed and results
are returned. An application can have one or more connections with a single database, or it can have
many connections with different databases. A Connection object provides metadata i.e. information
about the database, tables, and fields. It also contains methods to deal with transactions.
try{
Connection
dbConnection=DriverManager.getConnection(url,”loginName”,”Password”)
}
catch( SQLException x ){
System.out.println( “Couldn‟t get connection!” );
}
Once a connection is obtained we can interact with the database. Connection interface defines methods
for interacting with the database via the established connection. To execute SQL statements, you need
to instantiate a Statement object from your connection object by using the createStatement() method.
4. Executing a SQL statement with the Statement object, and returning a jdbc resultSet.
Statement interface defines methods that are used to interact with database via the execution of SQL
statements. The Statement class has three methods for executing statements:
executeQuery(), executeUpdate(), and execute(). For a SELECT statement, the method to use is
executeQuery . For statements that create or modify tables, the method to use is executeUpdate. Note:
Statements that create a table, alter a table, or drop a table are all examples of DDL
statements and are executed with the method executeUpdate. execute() executes an SQL
statement that is written as String object.
ResultSet provides access to a table of data generated by executing a Statement. The table rows are
retrieved in sequence. A ResultSet maintains a cursor pointing to its current row of data. The next()
method is used to successively step through the rows of the tabular results.
ResultSetMetaData Interface holds information on the types and properties of the columns in a
ResultSet. It is constructed from the Connection object.
import javax.swing.JOptionPane;
}else{
System.out.println(”Could not Get Connection”);
}
}
try {
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
} catch(java.lang.ClassNotFoundException e) {
System.err.print(”ClassNotFoundException: “);
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url, userid,
password);
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
return con;
}
}
Retrieving Data using JDBC Select Query
We can use Java JDBC Select statement in a java program to retrieve the data and display it for the
respective Tables. JDBC returns results in a ResultSet object, so we need to declare an instance of the
class ResultSet to hold our results. Select is the SQL keyword that performs a query. We invoke the
jdbc select query (executequery) method, using the jdbc select data statement as the parameter. The
tabular results of the query are captured in the ResultSet object, results. Note that executeQuery()
always returns a ResultSet although it need not have any rows in it.
The return value for an executeQuery is a ResultSet object containing the results of the query sent to
the DBMS,
To process each row in the ResultSet, we use the next() method. This method moves the pointer
through the rows of data. The ResultSet maintains a cursor pointing to the current row. Because this
cursor is initially positioned before the first row, we must call next() before we can see any rows at all.
Below is a JDBC Program showing the use of executeQuery() to retrieve values from ResultSets using
jdbc programming.
For my website I am creating the following 2 tables (Employee, Orders) as a part of the JDBC tutorial.
Employee_ID is the primary key which forms a relation between the 2 tables.
Employees Table:
Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels
Orders Table:
import javax.swing.JOptionPane;
import java.sql.*;
public class JDBCProgram{
do{
choice = getChoice();
if (choice != 0){
getSelected(choice);
}
}
while ( choice != 0);
System.exit(0);
}
try {
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
//Class.forName(”myDriver.ClassName”); ?
} catch(java.lang.ClassNotFoundException e) {
System.err.print(”ClassNotFoundException: “);
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url,
userid, password);
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
return con;
}
String createString;
createString = “create table Employees (” +
“Employee_ID
INTEGER, ” +
“Name VARCHAR(30))”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Employees Table
Created”);
}
String createString;
createString = “create table Orders (” +
“Prod_ID INTEGER, ” +
“ProductName VARCHAR(20),
“+
“Employee_ID INTEGER )”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Orders Table
Created”);
}
/*Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels */
public static void insertEmployees()
{
Connection con = getConnection();
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.executeUpdate(insertString4);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted into
Employees Table”);
}
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted into
Orders Table”);
}
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
}//End of class
The return value for a jdbc sql update is an int that indicates how many rows of a table
were updated.
int n = stmt.executeUpdate();
For my website I am creating the following 2 tables (Employee, Orders) as a part of the JDBC update
table statement.
Employee_ID is the primary key which forms a relation between the 2 tables.
Employees:
Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels
Orders:
import javax.swing.JOptionPane;
import java.sql.*;
public class JDBCProgram{
JOptionPane.showMessageDialog
(null,”JDBC Programming showing Updation of Table Data”);
int choice = -1;
do{
choice = getChoice();
if (choice != 0){
getSelected(choice);
}
}
while ( choice != 0);
System.exit(0);
}
try {
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
//Class.forName(”myDriver.ClassName”); ?
} catch(java.lang.ClassNotFoundException e) {
System.err.print(”ClassNotFoundException: “);
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url,
userid, password);
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
return con;
}
String createString;
createString = “create table Employees (” +
“Employee_ID INTEGER,
” +
“Name VARCHAR(30))”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Employees Table Created”);
}
String createString;
createString = “create table Orders (” +
“Prod_ID INTEGER, ” +
“ProductName VARCHAR(20), “+
“Employee_ID INTEGER )”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Orders Table Created”);
}
/*Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels */
public static void insertEmployees()
{
Connection con = getConnection();
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.executeUpdate(insertString4);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted into Employees
Table”);
}
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted into Orders
Table”);
}
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
public static void updateEmployees(){
Connection con = getConnection();
String updateString1;
updateString1 = “update Employees set name = „hemanthbalaji‟
where Employee_id = 6323″;
try {
stmt = con.createStatement();
stmt.executeUpdate(updateString1);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Updated into Employees
Table”);
}
}//End of class
The syntax is straightforward: just insert question marks for any parameters that you’ll be substituting
before you send the SQL to the database. As with CallableStatements, you need to call close() to make
sure database resources are freed as soon as possible. Below is a JDBC Program showing the use of
jdbc prepared statements to insert data into tables using jdbc programming.
You need to supply values to be used in place of the question mark placeholders (if there are any)
before you can execute a PreparedStatement object. You do this by calling one of the setXXX methods
defined in the PreparedStatement class. There is a setXXX method for each primitive type declared in
the Java programming language.
Using Prepared Statements in jdbc, objects can be used for SQL statements with no parameters, you
probably use them most often for SQL statements that take parameters. The advantage of using SQL
statements that take parameters is that you can use the same statement and supply it with different
values each time you execute it.
For my website I am creating the following 2 tables (Employee, Orders) as a part of the JDBC tutorial.
Employee_ID is the primary key which forms a relation between the 2 tables
Employees:
Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels
Orders:
import javax.swing.JOptionPane;
import java.sql.*;
public class JDBCProgram{
JOptionPane.showMessageDial
og(null,”JDBC Programming showing Updation of Table
Data”);
int choice = -1;
do{
choice = getChoice();
if (choice != 0){
getSelected(choice);
}
}
while ( choice != 0);
System.exit(0);
}
try {
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
//Class.forName(”myDriver.ClassName”); ?
} catch(java.lang.ClassNotFoundException e)
{
System.err.print(”ClassNotFoundException: “);
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url,
userid, password);
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
return con;
}
String createString;
createString = “create table Employees (” +
“Employee_ID
INTEGER, ” +
“Name
VARCHAR(30))”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Employees
Table Created”);
}
String createString;
createString = “create table Orders (” +
“Prod_ID INTEGER, ”
+
“ProductName
VARCHAR(20), “+
“Employee_ID
INTEGER )”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Orders Table
Created”);
}
/*Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels */
public static void insertEmployees()
{
Connection con = getConnection();
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.executeUpdate(insertString4);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted
into Employees Table”);
}
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted
into Orders Table”);
}
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
public static void retrieveOrders(){
Connection con = getConnection();
String result = null;
String selectString;
selectString = “select * from Orders”;
result
=”Prod_ID\t\tProductName\t\tEmployee_ID\n”;
try {
stmt = con.createStatement();
ResultSet rs =
stmt.executeQuery(selectString);
while (rs.next()) {
int pr_id =
rs.getInt(”Prod_ID”);
String prodName =
rs.getString(”ProductName”);
int id = rs.getInt(”Employee_ID”);
result +=pr_id+”\t\t”+
prodName+”\t\t”+id+”\n”;
}
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
String updateString1;
updateString1 = “update Employees set name =
„hemanthbalaji‟
where Employee_id = 6323″;
try {
stmt = con.createStatement();
stmt.executeUpdate(updateString1);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Updated
into Employees Table”);
}
pstmt.executeUpdate();
pstmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Updated
into Employees Table”);
}
try {
pstmt = con.prepareStatement
(”update Orders set productname = ? where Prod_Id = ?”);
for(int i = 0; i < len; i++) {
pstmt.setInt(2, productIds[i]);
pstmt.setString(1,
productNames[i]);
pstmt.executeUpdate();
}
pstmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Updated
into Orders Table”);
}
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null, result);
}
}//End of class
ResultSet and Cursors
The rows that satisfy a particular query are called the result set. The number of rows returned in a
result set can be zero or more. A user can access the data in a result set using a cursor one row at a
time from top to bottom. A cursor can be thought of as a pointer to the rows of the result set that has
the ability to keep track of which row is currently being accessed. The JDBC API supports a cursor to
move both forward and backward and also allowing it to move to a specified row or to a row whose
position is relative to another row. The JDBC Resultset example is shown in the next sections to follow.
The type of a ResultSet object determines the level of its functionality in two areas: the ways in which
the cursor can be manipulated, and how concurrent changes made to the underlying data source are
reflected by the ResultSet object.
The sensitivity of the ResultSet object is determined by one of three different ResultSet types:
TYPE_FORWARD_ONLY — the result set is not scrollable i.e. the cursor moves only
forward, from before the first row to after the last row.
TYPE_SCROLL_INSENSITIVE — the result set is scrollable; its cursor can move both
forward and backward relative to the current position,
and it can move to an absolute position.
TYPE_SCROLL_SENSITIVE — the result set is scrollable; its cursor can move both forward
and backward relative to the current position, and it can move to an absolute position.
Before you can take advantage of these features, however, you need to create a scrollable
ResultSet object. The following line of code illustrates one way to create a scrollable ResultSet
object:
The first argument is one of three constants added to the ResultSet API to indicate the type of a
ResultSet object: TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, and
TYPE_SCROLL_SENSITIVE. The second argument is one of two ResultSet constants for
specifying whether a result set is read-only or updatable: CONCUR_READ_ONLY and
CONCUR_UPDATABLE. If you do not specify any constants for the type and updatability of a
ResultSet object, you will automatically get one that is TYPE_FORWARD_ONLY and
CONCUR_READ_ONLY.
next() - moves the cursor forward one row. Returns true if the cursor is now positioned on a
row and false if the cursor is positioned after the last row.
previous() - moves the cursor backwards one row. Returns true if the cursor is now
positioned on a row and false if the cursor is positioned before the first row.
first() - moves the cursor to the first row in the ResultSet object. Returns true if the cursor is
now positioned on the first row and false if the ResultSet object
does not contain any rows.
last() - moves the cursor to the last row in the ResultSet object. Returns true if the cursor is
now positioned on the last row and false if the ResultSet object
does not contain any rows.
beforeFirst() - positions the cursor at the start of the ResultSet object, before the first row. If
the ResultSet object does not contain any rows, this method has
no effect.
afterLast() - positions the cursor at the end of the ResultSet object, after the last row. If the
ResultSet object does not contain any rows, this method has no effect.
relative(int rows) - moves the cursor relative to its current position.
absolute(int n) - positions the cursor on the n-th row of the ResultSet object.
For my website I am creating the following 2 tables (Employee, Orders) as a part of the JDBC tutorial
for insert in jdbc insert query.
Employee_ID is the primary key which forms a relation between the 2 tables.
Employees:
Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels
Orders:
JOptionPane.showMessageDialog
(null,”JDBC Programming showing Insertion of Table Data”);
int choice = -1;
do{
choice = getChoice();
if (choice != 0){
getSelected(choice);
}
}
while ( choice != 0);
System.exit(0);
}
try {
Class.forName
(”sun.jdbc.odbc.JdbcOdbcDriver”);
//Class.forName(”myDriver.ClassName”); ?
} catch(java.lang.ClassNotFoundException e) {
System.err.print(”ClassNotFoundException: “);
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url,
userid, password);
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
return con;
}
String createString;
createString = “create table Employees (” +
“Employee_ID INTEGER,
” +
“Name VARCHAR(30))”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Employees Table
Created”);
}
String createString;
createString = “create table Orders (” +
“Prod_ID INTEGER, ” +
“ProductName
VARCHAR(20), “+
“Employee_ID INTEGER
)”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Orders Table
Created”);
}
/*Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels */
public static void insertEmployees()
{
Connection con = getConnection();
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.executeUpdate(insertString4);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted into
Employees Table”);
}
try {
stmt = con.createStatement();
stmt.executeUpdate(insertString1);
stmt.executeUpdate(insertString2);
stmt.executeUpdate(insertString3);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” +
ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Data Inserted into Orders
Table”);
}
}//End of class
Employee_ID is the primary key which forms a relation between the 2 tables.
Employees:
Employee_ID Name
6323 Hemanth
5768 Bob
1234 Shawn
5678 Michaels
Orders:
JOptionPane.showMessageDialog
(null,”JDBC Programming showing Creation of Table‟s”);
int choice = -1;
do{
choice = getChoice();
if (choice != 0){
getSelected(choice);
}
}
while ( choice != 0);
System.exit(0);
}
try {
Class.forName
(”sun.jdbc.odbc.JdbcOdbcDriver”); //Class.forName(”myDriver.ClassName”); ?
} catch(java.lang.ClassNotFoundException e) {
System.err.print(”ClassNotFoundException: “);
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url,
userid, password);
} catch(SQLException ex) {
System.err.println(”SQLException: ” + ex.getMessage());
}
return con;
}
String createString;
createString = “create table Employees (” +
“Employee_ID INTEGER, ” +
“Name VARCHAR(30))”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” + ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Employees Table Created”);
}
String createString;
createString = “create table Orders (” +
“Prod_ID INTEGER, ” +
“ProductName VARCHAR(20), “+
“Employee_ID INTEGER )”;
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println(”SQLException: ” + ex.getMessage());
}
JOptionPane.showMessageDialog(null,”Orders Table Created”);
}
}//End of class