Download Overview Of Database and Java

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

Commitment ordering wikipedia , lookup

Relational algebra wikipedia , lookup

DBase wikipedia , lookup

Tandem Computers wikipedia , lookup

IMDb wikipedia , lookup

Serializability wikipedia , lookup

Entity–attribute–value model wikipedia , lookup

Extensible Storage Engine wikipedia , lookup

Functional Database Model wikipedia , lookup

Btrieve wikipedia , lookup

Microsoft Access wikipedia , lookup

Oracle Database wikipedia , lookup

Ingres (database) wikipedia , lookup

Concurrency control wikipedia , lookup

Database wikipedia , lookup

Microsoft Jet Database Engine wikipedia , lookup

Microsoft SQL Server wikipedia , lookup

ContactPoint wikipedia , lookup

Clusterpoint wikipedia , lookup

SQL wikipedia , lookup

Database model wikipedia , lookup

Relational model wikipedia , lookup

PL/SQL wikipedia , lookup

Open Database Connectivity wikipedia , lookup

Transcript
JDBC and Database Programming
in Java
Seree Chinodom
[email protected]
Agenda
 Overview of Databases and Java
 Overview of JDBC
 JDBC APIs
 Other Database Techniques
Overview Of Database and Java
RMI
JDBC
Java.net
TCP/IP
Network OS
TCP/IP
Why Java?
 Write once, run anywhere
 Multiple client and server platforms
 Object-relational mapping
 databases optimized for searching/indexing
 objects optimized for engineering/flexibility
 Network independence
 Works across Internet Protocol
 Database independence
 Java can access any database vendor
 Ease of administration
 zero-install client
Database Architectures
 Two-tier
 Three-tier
 N-tier
Two-Tier Architecture
 Client connects directly to server
 e.g. HTTP, email
 Pro:
 simple
 client-side scripting offloads work onto the client
 Con:
 fat client
 inflexible
Three-Tier Architecture
 Application Server sits between client and
database
 Three-Tier Pros
 flexible: can change one part without affecting others
 can connect to different databases without changing
code
 specialization: presentation / business logic / data
management
 can cache queries
 can implement proxies and firewalls
 Three-Tier Cons




higher complexity
higher maintenance
lower network efficiency
more parts to configure (and buy)
N-Tier Architecture
 Design your application using as many "tiers"
as you need
 Use Object-Oriented Design techniques
 Put the various components on whatever host
makes sense
 Java allows N-Tier Architecture, especially with
RMI and JDBC
Database Technologies
 Hierarchical
 obsolete (in a manner of speaking)
 any specialized file format can be called a
hierarchical DB
 Relational (aka SQL) (RDBMS)
 row, column
 most popular
 Object-relational DB (ORDBMS)
 add inheritance, blobs to RDB
 NOT object-oriented -- "object" is mostly a marketing
term
 Object-oriented DB (OODB)
 data stored as objects
 high-performance for OO data models
Relational Databases
 invented by Dr. E.F.Codd
 data stored in records which live in tables
 maps row (record) to column (field) in a single
table
 "relation" (as in "relational") means row to
column (not table to table)
Joining Tables
 you can associate tables with one another
 allows data to nest
 allows arbitrarily complicated data structures
 not object-oriented
Join example
 People
 name
 homeaddress
 workaddress
 Addresses




id
street
state
zip
SQL
 Structured Query Language
 Standardized syntax for "querying" (accessing)
a relational database
 Supposedly database-independent
 Actually, there are important variations from DB
to DB
SQL Syntax
INSERT INTO table ( field1, field2 ) VALUES ( value1,
value2 )
 inserts a new record into the named table
UPDATE table SET ( field1 = value1, field2 = value2 )
WHERE condition
 changes an existing record or records
DELETE FROM table WHERE condition
 removes all records that match condition
SELECT field1, field2 FROM table WHERE condition
 retrieves all records that match condition
Transactions
 Transaction = more than one statement which
must all succeed (or all fail) together
 If one fails, the system must reverse all previous
actions
 Also can't leave DB in inconsistent state halfway
through a transaction
 COMMIT = complete transaction
 ROLLBACK = abort
JDBC Goals
 SQL-Level
 00% Pure Java
 Keep it simple
 High-performance
 Leverage existing database technology
 why reinvent the wheel?
 Use strong, static typing wherever possible
 Use multiple methods to express multiple
functionality
JDBC Architecture
Application
JDBC
Driver
 Java code calls JDBC library
 JDBC loads a driver
 Driver talks to a particular database
 Can have more than one driver -> more than one
database
 Ideal: can change database engines without
changing any application code
JDBC Drivers
 Type I: "Bridge"
 Type II: "Native"
 Type III: "Middleware"
 Type IV: "Pure"
JDBC Drivers
JBC
Type I
“Bridge”
ODBC
Type II
“Native”
CLI(.lib)
Type III
“Middleware”
Type IV
“Pure”
ODBC
Driver
Middleware
Server
Type I Drivers
 Use bridging technology
 Requires installation/configuration on client
machines
 Not good for Web
 e.g. ODBC Bridge
Type II Drivers
 Native API drivers
 Requires installation/configuration on client
machines
 Used to leverage existing CLI libraries
 Usually not thread-safe
 Mostly obsolete now
 e.g. Intersolv Oracle Driver, WebLogic drivers
Type III Drivers
 Calls middleware server, usually on database
host
 Very flexible -- allows access to multiple
databases using one driver
 Only need to download one driver
 But it's another server application to install and
maintain
 e.g. Symantec DBAnywhere
Type IV Drivers
 100% Pure Java -- the Holy Grail
 Use Java networking libraries to talk directly to
database engines
 Only disadvantage: need to download a new
driver for each database engine
 e.g. Oracle, mSQL,MySQL
JDBC Limitations
 No scrolling cursors
 No bookmarks
Related Technologies
 ODBC
 Requires configuration (odbc.ini)
 RDO, ADO
 Requires Win32
 OODB
 e.g. ObjectStore from ODI
 JavaBlend
 maps objects to tables transparently (more or less)
The JDBC interfaces
 JDBC is a set of interfaces which provide a
consistant API for accessing databases from
different vendors.
 Vendors provide classes for using their database
which implement these interfaces:
 CallableStatement
 Connection
 DatabaseMetaData
 Driver
 PreparedStatement
 ResultSet
 ResultSetMetaData
 Statement
Accessing a database using JDBC
 JDBC is a set of interfaces designed to allow access
to third party database products and defined in
java.sql.
 Before accessing a database we must load the
driver class for communicating with the database.
Simply refering to the driver will load it into the JVM:
Class.forName(driverName).newInstance();
 For our assignment we will be using the SimpleText
Driver so the statement appears as follows:
Class.forName("jdbc.SimpleText.SimpleTextDriver").ne
wInstance();
Accessing a database using JDBC
 The location of a database is specified using a
URL of the following form:
< protocol>:< subprotocol>:< subname>
 For example to access an ODBC (Open
Database Connectivity) database could use the
following:
jdbc:odbc:databasename
Connecting to the database
 Once the Driver is loaded and the URL constructed
we can connect to database specified in the URL
using the DriverManager class method
getConnection():
Connection jdbcConnection =
DriverManager.getConnection(url, prop);
 The first argument is the URL constructed above, the second is a
Properties object, possibly containing configuration for the database
(eg. date format, location of tables).
Using JDBC to Connect to a
Database
Class.forName([LOCATION OF DRIVER]);
Connection jdbcConnection =
DriverManager.getConnection
([LOCATION OF DATASOURCE]);
Example
 to connect to Access datasource ( "Access” is
DataSource Name in the 32-bit ODBC control
panel. The name "Access" corresponds to
Test_db.mdb file created by MsAccess):
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Connection jdbcConnection =
DriverManager.getConnection (jdbc:odbc:Access);
 Note that the JdbcOdbcDriver is part of the
basic JDK distribution
Executing SQL statements
 There are three different classes for
constructing and executing SQL statements in
JDBC:
 Statement allows the execution of a static SQL
command in a string format.
 PreparedStatement allows repeated execution of a
compiled statement.
 CallableStatement allows you use stored
procedures and take advantage of optimisation in the
database system.
Statement class
 An object of the Statement class takes a
parameter string containing the SQL to be
executed.
 A Statement is created using the createStatement
method of the Connection class, which returns a
Statement object.
 SQL is then executed by constructing a string of
the SQL required and passing as an argument to
a Statement method which will pass it the
database and return a result.
Statement class
 There are three possible Statement methods
which can be used to execute an SQL statement
string:
 executeUpdate(String sql) - used for SQL
statements which will update the database, such
as INSERT, UPDATE or DELETE.
 executeQuery(String sql) - used for SELECT
statements
 execute(String sql) - used when the SQL
statement may be an update or query.
An example of executing a query
Statement stmt = dbCon.createStatement();
String sql = "select * from " + table;
ResultSet = stmt.executeQuery(sql);
Preparing a Statement Object
 Creating a statement object is simple and
follows the form:
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Connection jdbcConnection =
DriverManager.getConnection(jdbc:odbc:Access);
Statement sql = jdbcConnection.createStatement();
Using JDBC to Query a Database
 use the statement handle to send standard SQL to
the database and then parse through the results
returned from the database.
 Take a look at the following example.
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Connection jdbcConnection =
DriverManager.getConnection (jdbc:odbc:Access);
Statement sqlStatement = jdbcConnection.createStatement();
// We have seen all of the above before.
// No surprises so far. in the next line, we
// will simply create a string of SQL.
String sql = "SELECT * FROM CUSTOMERS";
// Next we will attempt to send the SQL command to
// the database. If it works, the database will
// return to us a set of results that JDBC will
// store in a ResultSet object.
try
{
ResultSet results = sqlStatement.executeQuery(sql);
// We simply go through the ResultSet object
// one element at a time and print out the
// fields. In this example, we assume that
// the result set will contain three fields
while (results.next())
{
System.our.println("Field One: " +
results.getString(1) +
"Field Two: " +
results.getString(2) +
"Field Three: " +
results.getString(3));
}
}
// If there was a problem sending the SQL,
// we will get this error.
catch (Exception e)
{
System.out.println("Problem with Sending Query: " + e);
}
 Note that if the field is an Integer, you should use the
getInt() method in ResultSet instead of getString()
Using JDBC to Modify a Database
 Modifying a database is just as simple as
querying a database However, instead of using
executeQuery(), you use executeUpdate() and
you don't have to worry about a result set.
 example:
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Connection jdbcConnection =
DriverManager.getConnection (jdbc:odbc:Access);
Statement sqlStatement = jdbcConnection.createStatement();
// We have seen all of the above before.
// No surprises so far. in the next line, we
// will simply create a string of SQL.
String sql = "INSERT INTO CUSTOMERS +
" (CustomerID, Firstname, LastName, Email)" +
" VALUES (004, 'Selena', 'Sol' " +
"'[email protected]')";
// Now submit the SQL....
sqlStatement.executeUpdate(sql);
 As you can see, there is not much to it. Add, modify
and delete are all handled by the executeUpdate()
method. You compose the SQL and send it through
JDBC in one simple call.
Accessing column data
 As each column may contain a different
datatype we may need to use a ResultSet
method specific to that datatype.
 To retrieve a column with an integer value we
could use getInt(int column, ), while to retrieve a
column with a string value we would use
getString(int column).
An example of accessing columns
within rows:
Statement stmt = dbCon.createStatement();
String sql = "select * from " + table;
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String name = rs.getString(1);
int age = rs.getInt(2);
System.out.println(name + " " + age);
}
rs.close();
PreparedStatement
 To avoid constructing a new Statement for each
different SQL statement, PreparedStatements
can be used.
 These allow the creation of a parameterized
statement for which values can be inserted in
allowing the the same SQL statement to be used
multiple times with different parameters.
An example of a PreparedStatement:
String sql = "insert into " + table + " values(?, ?)";
PreparedStatement pstmt = dbCon.prepareStatemen(sql);
while (!finished) {
String name = getName(br);
if (name.equals("end"))
finished = true;
else {
int age = getAge(br) ;
pstmt.setString(1, name);
pstmt.setInt(2, age);
pstmt.execute();
}
}
pstmt.close();
Commit and autoCommit
 By default database will automatically commit
the changes to the database.
 This may not be desirable if you want to execute
a number of statements and treat these as one
transaction.
 The Connection interface provides a method
setAutoCommit() to allow to specify if you want
the connection to automatically commit any
transactions or if you prefer to do it manually.
 If you turn off autoCommit, you can invoke the
Connection method commit to commit changes
to the database, or rollback to undo any
changes since the last commit.
Mapping database types to Java
types
Java Type
String
int
double
byte[]
sql.Date
sql.Time
sql.Timestamp
SQL Types
CHAR, VARCHAR, LONGVARCHAR
INTEGER
DOUBLE, FLOAT
BINARY, VARBINARY, LONGVARBINARY
DATE
TIME
TIMESTAMP