Download ps - CS

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Serializability wikipedia , lookup

Concurrency control wikipedia , lookup

Clusterpoint wikipedia , lookup

Microsoft SQL Server wikipedia , lookup

Database model wikipedia , lookup

Java ConcurrentMap wikipedia , lookup

Relational model wikipedia , lookup

Versant Object Database wikipedia , lookup

SQL wikipedia , lookup

Open Database Connectivity wikipedia , lookup

PL/SQL wikipedia , lookup

Transcript
Introduction to JDBC
JDBC is used for accessing databases
JDBC:
Java Database Connectivity
from Java applications
Information is transferred from relations
to objects and vice-versa
databases optimized for searching/indexing
objects optimized for engineering/flexibility
Compilation
Why Access a Database with
Java?
When executing an SQL statement via
There are queries that can not be
JDBC, it is not checked for errors until it
computed in SQL:
is run (Not checked during compilation)
Given a table Bus(Source, Destination) find
all pairs of places that it is possible to travel
between (paths of any length)
Java allows for a convenient user
interface to the database
Six Steps
Packages to Import
Load the driver
In order to connect to the Oracle
Establish the Connection
database from java, import the following
Create a Statement object
packages:
Execute a query
Process the result
Close the connection
java.sql.*;
(usually enough)
javax.sql.*
(for advanced features, such as
scrollable result sets)
JDBC Architecture
Connecting
Driver
Manager
Driver
Manager
Application
Application
Driver
Driver
The application creates a driver instance and
registers it with the DriverManager.
1.
Initializing a driver:
new oracle.jdbc.driver.OracleDriver()
2.
Registering it with the DriverManager:
DriverManager.registerDriver( )
3.
Getting a connection:
The DriverManager connects a driver to the DB
The DriverManager keeps track of registered driver
inst ances and t heir connect ions t o DB s.
The Driver t alks t o a part icular dat abase t hrough
the connection
DriverManager.getConnection(URL)
Note:
Stages 1+2 may be combined with
Class. f orName( oracle. j dbc. driver. OracleDriver");
In Stage 3, the Manager tries all drivers and assigns a
connection to the first driver that succeeds.
Connecting to the Database
String path = "jdbc:oracle:thin:";
String host = "sol4";
String port = "1521";
String db = "stud";
String login = gidi";
String password = password ;
String url = path + login + "/" + password +
"@" + host +":" + port + ":" + db;
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url);
Statements
Statements are used for queries that
are only issued once.
Query methods
1. Statement createStatement()
returns a new Statement object
prepared because
it already includes
the query string
2. PreparedStatement prepareStatement(String
sql)
returns a new PreparedStatement object
Both are used to send SQL commands to the DB
Both are created by the connection
executeQuery
String queryStr =
"SELECT * FROM Sailors " +
"WHERE Name = 'joe smith'";
No semicolon(;) !!!
A statement can activate:
1.
executeQuery(String query): for queries
t hat don t change t he DB (select )
2. executeUpdate(String query): for queries
which affect the DB (create, delete, drop,
etc.)
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(queryStr);
The executeQuery method returns a ResultSet
object representing the query result.
executeUpdate
String deleteStr =
DELETE FROM Sailors " +
"WHERE sid = 15";
PreparedStatement motivation
Suppose we would like to run the query
No semicolon(;) !!!
Statement stmt = con.createStatement();
int delnum = stmt.executeUpdate(deleteStr);
executeUpdate returns the number of rows
modified.
Prepared Statements
Prepared Statements are used for queries that
are executed many times with possibly
different contents.
A PreparedStatement object includes the query
and is prepared for execution.
SELECT * FROM Emp
wher e name= moshe ;
But we would like to run this for all employees
(separately), not only moshe
Could we create a variable instead of moshe
which would get a different name every time??..
Querying with PreparedStatement
String queryStr =
"SELECT * FROM Sailors " +
"WHERE Name = ? and Rating < ? ;
PreparedStatement pstmt =
con.prepareStatement(queryStr);
Value to
Question marks can be inserted as variables.
-setString(i, value)
The i-th question
-setInt(i, value)
mark is set to the
insert
pstmt.setString(1, Joe );
pstmt.setInt(2, 8);
1 st question
mark
ResultSet rs = pstmt.executeQuery();
given value.
Affecting the DB with
PreparedStatement
String deleteStr =
DELETE FROM Boats " +
"WHERE Name = ? and Color = ? ;
PreparedStatement pstmt =
con.prepareStatement(deleteStr);
pstmt.setString(1, Fluffy );
pstmt.setString(2, "red");
int delnum = pstmt.executeUpdate();
Statements vs.
PreparedStatements: Be Careful !
Are these the same? What do they do?
String val = Joe ;
PreparedStatement pstmt =
con.prepareStatement( select * from Sailors
where sname=? );
pstmt.setString(1, val);
ResultSet rs = pstmt.executeQuery();
String val = Joe ;
Statement stmt = con.createStatement( );
ResultSet rs = stmt.executeQuery( select * from
Sailors where sname= + val);
Statements vs.
PreparedStatements: Be Careful !
Statements vs.
PreparedStatements: Be Careful !
Will this always work?
Will this work?
Statement stmt = con.createStatement( );
ResultSet rs = stmt.executeQuery( select * from R
where A = + val +
);
The moral: When getting input from the
user, always use a PreparedStatement
PreparedStatement pstmt =
con.prepareStatement( select * from ? );
pstmt.setString(1, "Sailors");
No! will attempt to insert sailors , and
result in:
Select * from sailors
We can put ? only instead of values
ResultSet
ResultSet
Statement
ExecuteQuery(String Q) ResultSet
createStatement()
Statement
Connection
ExecuteUpdate(String Q)
int
A ResultSet is an object which contains the
result of a query- a t able .
Only one ResultSet per Statement can be open
at once(!).
A ResultSet maintains a cursor pointing to its
current row of data.
Prepared
Statement
setString(int
num,String val)
ExecuteQuery() ResultSet
Prepared
prepareStatement Statement
(String Q)
ExecuteUpdate()
Connection
int
The 'next' method moves the cursor to the
next row
As of JDBC 2.0, scrollable ResultSets are
available, which also include previous , first ,
last , et c..
ResultSet cont.
Any methods on the resultSet will occur on
the current row.
The cursor is positioned before the first
row upon creation.
Statement stmt=con.createStatement();
ResultSet rs = stmt.executeQuery
("SELECT * FROM Table1");
while (rs.next()) {
//something
}
ResultSet methods
Getting the value in some column (for the
current row):
String s =
getString(int columnNum);
rs.getString( column1");
getString(String columnName);
getInt(int columnNum);
getInt(String columnName);
Et c
To check if null was returned, you have to use
wasNull() on the ResultSet after getting the value.
The driver maps SQL types (varchar, number, ) t o
the appropriate Java method (getString, getInt )
SQL type
Mapping Java
Types to SQL
Types
Example revisited
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM
Table1");
// retrieve and print the values for the current row
while (rs.next()) {
int i = rs.getInt("a");
String s = rs.getString("b");
Java
method
float f = rs.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);
}
Advanced ResultSets
1. TYPE_FORWARD_ONLY: The default, simple RS.
2. TYPE_SCROLL_INSENSITIVE: Scrollable RS, does
not modify when the DB is modified
3. TYPE_SCROLL_SENSITIVE: Scrollable RS, if its
values are changed in the DB, they will also change
in the RS.
In addition, a ResultSet may be either:
1. CONCUR_READ_ONLY: the programmer cannot
change the ResultSet (default)
2. CONCUR_UPDATABLE: the programmer can change
the ResultSet
ResultSetMetaData
An object created by the ResultSet which
holds information about its columns
ResultSetMetaData rsmd = rs.getMetaData();
int numcols = rsmd.getColumnCount();
for (int i = 1 ; i <= numcols; i++) {
if (i > 1) System.out.print(",");
System.out.print(rsmd.getColumnLabel(i));
}
Creating advanced ResultSets
For Statement:
Statement stmt =
con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery( "SELECT * from emp");
For PreparedStatement:
PreparedStatement pstmt=
con.prepareStatement("SELECT * FROM Emp where Eid=? ,
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
pstmt.setInt(1, "1000010");
ResultSet rs = stmt.executeQuery();
Printing Query Output:
Result Set (2)
while (rs.next()) {
for (int i = 1 ; i <= numcols; i++) {
if (i > 1) System.out.print(",");
System.out.print(rs.getString(i));
}
System.out.println("");
}
Cleaning Up After Yourself
Remember to close the Connections,
Statements, PreparedStatements and
ResultSets
Dealing With Exceptions
An exception may be chained:
catch (SQLException e) {
while (e != null) {
//human readable message about the exception
System.out.println(e.getMessage());
Highly recommended
con.close();
stmt.close();
pstmt.close();
rs.close();
//String describing the reason of the exception
System.out.println(e.getSQLState());
Recommended
Optional (Will otherwise be
closed by its calling statement)
//driver- dependant code for the exception
System.out.println(e.getErrorCode());
e = e.getNextException();
}
}
What will this output?
Timeout
St r ing t able1= cr eat e t able t able1(col1 int eger , col2 int eger ) ;
Statement st=con.createStatement();
int resCreate=st.executeUpdate(table1);
PreparedStatement ps1 = con.pr epar eSt at ement ( inser t into Table1
values(?,?) );
You can use Stmnt.setQueryTimeOut(int
secs) to set a timeout for the driver to
wait for a statement to be completed
for(int i=0;i<10;i++){
ps1.setInt(1,i);
ps1.setInt(2,i*i);
ps1.executeUpdate();
If the operation is not completed in the
given time, an SQLException is thrown
}
Statement st2=con.createStatement();
ResultSet rs=execut eQ uer y( select col2 f r om Table1 );
while(rs.next()){
System.out.println(rs.getInt(1)); }
Transactions
Transaction = 2 or more statements which must
all succeed (or all fail) together
Transactions in JDBC
If one fails, the system must reverse all
previous actions
Also can t leave DB in inconsist ent st at e half way
through a transaction
COMMIT = complete transaction
ROLLBACK = abort
Example
Transaction Management
Suppose we want to transfer money from bank
account 13 to account 72:
PreparedStatement pstmt =
con.prepareStatement( update BankAccount
set amount = amount + ?
where accountId = ? );
pstmt.setInt(1,- 100);
pstmt.setInt(2, 13);
pstmt.executeUpdate();
What happens if this
pstmt.setInt(1, 100);
update fails?
pstmt.setInt(2, 72);
pstmt.executeUpdate();
The connection has a state called AutoCommit
mode
if AutoCommit is true, then every statement is
automatically committed
if AutoCommit is false, then every statement is
added to an ongoing transaction
Default: true
Fixed Example
AutoCommit
con.setAutoCommit(boolean val)
If you set AutoCommit to false, you must
explicitly commit or rollback the transaction
using Connection.commit() and
Connection.rollback()
Useful link regarding JDBC:
http://java.sun.com/ j2se/ 1.3/ docs/ guide/ jdbc/
getstart/ GettingStartedTOC.fm.html
con.setAutoCommit(false);
try {
PreparedStatement pstmt =
con.prepareStatement( update BankAccount
set amount = amount + ?
where accountId = ? );
pstmt.setInt(1,- 100); pstmt.setInt(2, 13);
pstmt.executeUpdate();
pstmt.setInt(1, 100); pstmt.setInt(2, 72);
pstmt.executeUpdate();
con.commit();
catch (Exception e) {
con.rollback();
}
This document was created with Win2PDF available at http://www.daneprairie.com.
The unregistered version of Win2PDF is for evaluation or non-commercial use only.